Also ich versuche, einen Bogen zu zeichnen und einen Kreis um seinen runden Endpunkt zu legen, aber ich habe Probleme aufgrund der Rundung auf den nächsten Pixel. Dies ist in einigen, aber nicht allen Fällen sichtbar.Java Graphics2D Fließkomma-genaue ZeichnungOval Alternative?
Gibt es eine Möglichkeit, Kreise mit Gleitkomma und Anti-Aliasing zu zeichnen, um diesen Rundungsfehler zu eliminieren?
Sie können diesen Code ausführen, um das Problem zu sehen. Ich habe Bögen der Länge 0 gezeichnet (die als große Punkte erscheinen) anstelle von vollen Bögen zur Klarheit.
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private int CENTER = 200;
private static int WINDOW = 400;
private int LEFT = 50;
private int TOP = 50;
private int DIM = 300;
private int DIAMETER = 26;
public Example() {
super();
}
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(16, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
g2.setColor(new Color(0, 0, 255));
g2.drawArc(LEFT, TOP, DIM, DIM, 0, 0);
g2.drawArc(LEFT, TOP, DIM, DIM, 32, 0);
g2.drawArc(LEFT, TOP, DIM, DIM, 115, 0);
g2.drawArc(LEFT, TOP, DIM, DIM, 200, 0);
g2.drawArc(LEFT, TOP, DIM, DIM, 331, 0);
this.drawCircle(g2, 0);
this.drawCircle(g2, 32);
this.drawCircle(g2, 115);
this.drawCircle(g2, 200);
this.drawCircle(g2, 331);
g2.setStroke(new BasicStroke(1));
g2.setColor(new Color(0, 0, 0));
g2.drawLine(0, CENTER, DIM * 2, CENTER);
g2.drawLine(CENTER, 0, CENTER, DIM * 2);
}
private void drawCircle(Graphics2D g, int angle) {
g.setStroke(new BasicStroke(3));
g.setColor(new Color(0, 0, 255));
g.drawOval(
Math.round(CENTER + (float)(Math.cos(Math.toRadians(angle)) * (DIM/2)) - DIAMETER/2),
Math.round(CENTER - (float)(Math.sin(Math.toRadians(angle)) * (DIM/2)) - DIAMETER/2),
DIAMETER,
DIAMETER
);
}
public static void main (String args[]) {
Example e = new Example();
e.setSize(WINDOW, WINDOW);
e.setVisible(true);
e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
[ 'Ellipse2D'] (https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Ellipse2D.html)? – trashgod
Wenn Sie drei Quadrate in einer Reihe haben, haben Sie eine eindeutige Mitte - wenn Sie vier Quadrate in einer Reihe haben, haben Sie kein eindeutiges Zentrum - aber wenn Sie an Magie glauben, gehen Sie mit Antialiasing etc. voran – gpasch
@trashgod Sie rocken. Das plus 'RenderingHints.VALUE_STROKE_PURE' hat alles perfekt aufgeräumt. Vielen Dank! – thedarklord47