En dessinant un joli cercle en Java
Je suis en utilisant Java Graphiques et je reçois "laid" des cercles.
Voici ce que mon programme Java fait
Et voici la même chose étant faite dans Matlab
Je pense qu'il est clair que le code Java n'est pas aussi "gentil", à la recherche comme Matlab, particulièrement sur les bords du cercle. Notez que cela n'a rien à voir avec la résolution...ces images sont pratiquement de la même taille. Notez également que je suis déjà rendu des conseils.
Voici un stand alone avec une fonction Principale, vous pouvez exécuter pour tester cela.
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);
}
}
}
- activer l'antialiasing? stackoverflow.com/questions/179955/...
- 1) Pour mieux aider plus tôt, après une SSCCE. 2) continuer à ajouter de rendu des conseils. J'oublie toujours ceux qui faire de la magie.
- est-t-il un équivalent pour les graphismes? qui semble être pour les polices
- J'ai ajouté une SSCCE
- developmentality.wordpress.com/2010/02/09/...
- J'ai ajouté interpolation redering conseils...mais toujours pas d'amélioration. voir mise à jour du code
- voir ma réponse mis à jour
Vous devez vous connecter pour publier un commentaire.
EDIT: Veuillez consulter le Code de Guy de réponse ci-dessous pour trouver une solution. C'est marqué juste, parce que c'était Joey Rohan qui a tout compris au départ!
J'ai obtenu bord lisse lorsque j'ai essayé la même chose:
Mise à JOUR:
Après avoir cherché beaucoup:
Il n'y a rien de mal avec le code, mais,
Eh bien, malheureusement, Java 2D (ou au moins du Soleil actuel de mise en œuvre) ne prend pas en charge "soft-clipping."
Mais Aussi a un truc pour les clips:
Suivez Ce lien,vous pouvez obtenir ce que vous demandez.
(Aussi, j'ai reçu un bord lisse, parce que j'din utilisez pas de clip de choses,dans mon image ci-dessus)
Clip
.Ici a été la réponse. J'ai adapté la majorité du code de ce site. Prendre un coup d'oeil:
Voici le code:
Mise à jour
OK. Ensuite, l'idée est de pas utiliser d'écrêtage à tous les mais au lieu de faire l'coupées forme en soustrayant les zones les uns des autres.
Ancien code
Une partie du problème est que le rendu des opérations en général ne s'applique pas à un
Clip
, bien qu'elles s'appliquent à laShape
quand il est tiré. De manière générale, j'résoudre que par la (dernière) de la peinture de laShape
lui-même. E. G.1,5 pixel
BasicStroke
est utilisé ici pour le cercle rouge pour lisser les bords rugueux produite par leClip
.SrcAtop
semble fonctionner assez bien.J'ai utilisé drawPolygon méthode pour dessiner le cercle en générant de la matrice de la plupart des points sur la circonférence du cercle de rayon proposé.
Code:
Vous pouvez activer l'anti-aliasing:
Je vous conseille aussi de dessiner à l'objet Graphique que vous obtenez de la
paintComponent
méthode plutôt que de créer un intermédiaireBufferedImage
.