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
Ich meine das Äußere mit den Zahlen

// 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;
}
}
und deshalb stürzen wir uns auf neue Herausforderungen und versuchen nicht etwas vorhandens nachzubauen ;-) - ausser man ist vielleicht Chinese ;-)@Michael...: Tststs ... sind wir Programmierer oder sind wir Programmierer?![]()