Zeichnung einen schönen Kreis in Java
Ich bin mit Java-Grafik und ich bekomme den "falschen" Kreisen.
Hier ist, was mein Java-Programm macht
Und hier ist die gleiche Sache in Matlab
Ich denke, es ist klar, dass die Java one ist nicht so "schön" aussieht, als die Matlab-eine, besonders auf den Kanten des Kreises. Beachten Sie, dass dies hat nichts zu tun mit der Auflösung...diese Bilder sind praktisch die gleiche Größe. Beachten Sie auch, dass ich bereits die Einstellung rendering-hints.
Hier ist ein stand-alone mit einer Main-Funktion, die Sie ausführen können, um dies auszuprobieren.
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class SimplePaint02 {
private static final int LINE_THICKNESS = 4;
private static final int LINE_GAP = 10;
private Color lineColor = Color.red;
public static void main(String[] args) {
new SimplePaint02();
}
public SimplePaint02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
public void paintComponent(Graphics g) {
int radius = 50;
BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = buffer.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Ellipse2D circle = new Ellipse2D.Float(0, 0, radius,radius);
Shape clip = g2d.getClip();
g2d.setClip(circle);
AffineTransform at = g2d.getTransform();
g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(45),radius / 2, radius / 2));
int gap = LINE_GAP;
g2d.setColor(Color.WHITE);
g2d.fill(circle);
g2d.setColor(lineColor);
//g2d.setStroke(new BasicStroke(LINE_THICKNESS));
for (int index = 0; index < 10; index++) {
int x1 = index*gap-(LINE_THICKNESS/2);
int y1 = 0;
int x2 = index*gap+(LINE_THICKNESS/2);
int y2 = radius;
int width = x2 - x1;
int height = y2 - y1;
g2d.fillRect(x1, y1, width, height);
//g2d.drawLine(index * gap, 0, index * gap, getRadius());
}
g2d.setTransform(at);
g2d.setClip(clip);
g2d.dispose();
g.drawImage(buffer, 0, 0, this);
}
}
}
aktivieren Sie Anti-Aliasing? stackoverflow.com/questions/179955/...
1) Für besser zu helfen, schneller zu veröffentlichen, SSCCE. 2) Halten Sie das hinzufügen, rendering hints. Ich vergesse immer, welche zaubern.
gibt es ein äquivalent für die Grafik? das scheint für Schriftarten
Ich habe eine SSCCE
developmentality.wordpress.com/2010/02/09/...
1) Für besser zu helfen, schneller zu veröffentlichen, SSCCE. 2) Halten Sie das hinzufügen, rendering hints. Ich vergesse immer, welche zaubern.
gibt es ein äquivalent für die Grafik? das scheint für Schriftarten
Ich habe eine SSCCE
developmentality.wordpress.com/2010/02/09/...
InformationsquelleAutor CodeGuy | 2013-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Bitte siehe Code-Guy ' s Antwort weiter unten für eine Lösung. Dieser markiert ist richtig, denn es war Joey Rohan, der es herausgefunden hat anfangs!
Ich habe glatten Rand, wenn ich versuchte die gleiche Sache:
UPDATE:
Nach der Suche eine Menge:
Es ist nichts falsch mit dem code aber,
Gut, leider Java 2D (oder zumindest Sun ' s aktuelle Implementierung) nicht unterstützt "soft-clipping".
Aber habe Auch einen trick für die clips:
Folgen Sie Dieser link,können Sie erreichen, was Sie fordern.
(Auch, ich habe einen glatten Rand, denn ich din nicht verwenden, clip-Zeug,in meinem Bild oben)
Nein, ich meine din nicht mit der mittleren Linien.Ok, werde versuchen, aus.
Ja, es funktioniert gut, ohne die Linien. Etwas in den Prozess der Herstellung der Linien ist es zu tun.
Das problem ist nicht eigentlich beim zeichnen von Formen, sondern, wenn die Befüllung oder die Malerei zu einem
Clip
.Ich sehe. Du meinst also, es ist eine andere Art zu zeichnen dieser Form, ohne einen clip?
InformationsquelleAutor joey rohan
Hier war die Antwort. Ich angepasst, der Großteil des Codes aus diese Website. Werfen Sie einen Blick:
Hier der code:
InformationsquelleAutor CodeGuy
Update
OK. Dann ist die Idee zu nicht verwenden clipping an alle sondern um die beschnittene Form, indem Bereiche von einander.
Alten code
Teil des Problems ist, dass die rendering-Operationen in der Regel nicht anzuwenden, um eine
Clip
, obwohl Sie auf anwenden, um dieShape
wenn es gezogen wird. Ich in der Regel lösen, die durch (letzten) Anstrich derShape
selbst. E. G.1,5 pixel
BasicStroke
hier verwendet wird, für die der rote Kreis - die Glättung der Ecken und Kanten produziert von derClip
.Ah.. pingelig, pingelig ( ich habe gotta bewundern ;). Das update angezeigt.
Gut gemacht. Ganz nett!
Du bist herzlich willkommen. 🙂
SrcAtop
scheint zu funktionieren ganz gut, wie gut.InformationsquelleAutor Andrew Thompson
Ich verwendet drawPolygon Methode zeichne einen Kreis durch die Generierung array mit den meisten Punkten auf dem Umfang des Kreises mit den vorgeschlagenen radius.
Code:
InformationsquelleAutor Deepeshkumar
Aktivieren Sie anti-aliasing:
Ich auch empfehlen, zeichnen Sie auf das Graphics-Objekt erhalten Sie von der
paintComponent
Methode eher als die Schaffung einer intermediate -BufferedImage
.Sie tun es auf dem BufferedImage Graphics2D-Objekt, tun Sie es auf die Grafiken erhalten Sie in der paintComponent-Methode sowie.
Aber das wird nicht unbedingt die Ausgabe verändern, woudld?
InformationsquelleAutor Dan D.