# Roulettescheibe zeichnen



## Trendsoundz (10. Nov 2010)

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


----------



## Michael... (10. Nov 2010)

Es liegt ja als Bild vor;-) Warum willst Du es noch selbst zeichnen?


----------



## Marco13 (10. Nov 2010)

@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.... 


```
// 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;
    }

}
```


----------



## Trendsoundz (10. Nov 2010)

Du hast das in so kurzer Zeit programmiert?
Danke jedenfalls=)


----------



## Michael... (10. Nov 2010)

Marco13 hat gesagt.:


> @Michael...: Tststs ... sind wir Programmierer oder sind wir Programmierer?


und deshalb stürzen wir uns auf neue Herausforderungen und versuchen nicht etwas vorhandens nachzubauen ;-) - ausser man ist vielleicht Chinese ;-)


----------

