Roulettescheibe zeichnen

Trendsoundz

Mitglied
Hallo ich habe eine kleine Frage.Was ist die einfachste Methode das Äußere einer Roulettescheibe zu zeichnen?
Ich meine das Äußere mit den Zahlen
roulette-wheel.gif
 
@Michael...: Tststs ... sind wir Programmierer oder sind wir Programmierer? 😉

Wenn das ganze auch für beliebige Fenstergrößen passen soll, und schön gebogene Randsegmente haben soll und so, muss man ein bißchen basteln. Eine Möglichkeit habe ich gerade mal schnell zusammengeschustert. Es ist NICHT die einfachste Möglichkeit, aber es ist eine Möglichkeit....

Java:
// Marco13 for [url]http://www.java-forum.org/awt-swing-swt/108611-roulettescheibe-zeichnen.html[/url]

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;


class RouletteDrawTest
{

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final RoulettePanel p = new RoulettePanel();

                Thread thread = new Thread(new Runnable()
                {
                    public void run()
                    {
                        double angle = 0;
                        while (true)
                        {
                            p.setRotationAngle(angle);
                            angle += 0.01;

                            try
                            {
                                Thread.sleep(20);
                            }
                            catch (InterruptedException e)
                            {
                                Thread.currentThread().interrupt();
                                return;
                            }
                        }
                    }
                });
                thread.start();

                f.getContentPane().add(p);
                f.setSize(600,600);
                f.setVisible(true);
            }
        });
    }
}


class RoulettePanel extends JPanel
{
    private static final int numbers[] = new int[]
    {
         0,32,15,19, 4,21, 2,25,17,34, 6,27,
        13,36,11,30, 8,23,10, 5,24,16,33, 1,
        20,14,31, 9,22,18,29, 7,28,12,35, 3,
        26
    };


    private double rotationAngleRad = 0.0;


    public void setRotationAngle(double angleRad)
    {
        this.rotationAngleRad = angleRad;
        repaint();
    }


    public void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;

        int w = getWidth();
        int h = getHeight();

        g.setColor(Color.WHITE);
        g.fillRect(0,0,w,h);

        g.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        int offsetX = 20;
        int offsetY = 20;
        int diameter = Math.min(w-2*offsetX,h-2*offsetY);
        int radius = diameter/2;
        int centerX = offsetX+radius;
        int centerY = offsetY+radius;

        int fontSize = (int)(radius * 0.1);
        Font font = new Font("Serif", Font.BOLD, fontSize);
        g.setFont(font);
        FontMetrics fontMetrics = g.getFontMetrics();
        int fontHeight = fontMetrics.getHeight();

        double angleRadDelta = Math.PI * 2 / numbers.length;
        Path2D segment = createSegment(
            centerX, centerY, radius-fontHeight,
            radius, -angleRadDelta/2, angleRadDelta/2);

        AffineTransform originalAT = g.getTransform();
        for (int i=0; i<numbers.length; i++)
        {
            double angleRad0 = rotationAngleRad + i * angleRadDelta;
            double angleRad1 = angleRad0 + angleRadDelta;

            g.setTransform(originalAT);
            g.rotate(angleRad0, centerX, centerY);

            if (i==0)
            {
                g.setColor(new Color(0,192,0));
            }
            else if ((i&1)==1)
            {
                g.setColor(Color.RED);
            }
            else
            {
                g.setColor(Color.DARK_GRAY);
            }

            g.fill(segment);
            String numberString = String.valueOf(numbers[i]);
            int delta = fontMetrics.stringWidth(numberString)/2;
            g.setColor(Color.WHITE);
            g.drawString(numberString, centerX-delta,
                centerY-radius+fontHeight-fontMetrics.getDescent());
        }
        g.setTransform(originalAT);
    }

    private static Path2D createSegment(
        int centerX, int centerY, int innerRadius, int outerRadius,
        double angleRad0, double angleRad1)
    {
        Arc2D.Double arcInner = new Arc2D.Double(
            centerX-innerRadius, centerY-innerRadius,
            innerRadius*2, innerRadius*2,
            Math.toDegrees(angleRad0),
            Math.toDegrees(angleRad1-angleRad0), Arc2D.OPEN);

        Arc2D.Double arcOuter = new Arc2D.Double(
            centerX-outerRadius, centerY-outerRadius,
            outerRadius*2, outerRadius*2,
            Math.toDegrees(angleRad1),
            Math.toDegrees(angleRad0-angleRad1), Arc2D.OPEN);

        Path2D.Double path = new Path2D.Double();
        path.append(arcInner, true);
        path.append(arcOuter, true);
        path.closePath();

        AffineTransform at = AffineTransform.getRotateInstance(
            -Math.PI/2, centerX, centerY);
        path.transform(at);

        return path;
    }

}
 

Zurück
Oben