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
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
// 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? 😉