2010-06-04 6 views
3

J'essaie de dessiner un polygone avec un trait de 1 pixel. Étant donné que le polygone entier est mis à l'échelle par 100, j'ai défini la largeur de la ligne sur 0,01. Pour une raison quelconque cependant, le polygone est dessiné avec une largeur de ligne à l'écran de ce qui semble être 100 pixels au lieu de 1.Impossible de tracer des lignes fines avec Java2D

J'utilise GeneralPath comme forme de polygone. Les lignes fines sont tracées si j'utilise la même approche pour dessiner des formes Line2D.

g2d.scale(100, 100); 
g2d.setStroke(new BasicStroke(0.01f)); 
g2d.draw(theShape);

Nouvelle info: Si je supprime la ligne setStroke je reçois correctement une ligne de pixel 2, puisqu'une BasicStroke de 0.02f a été mis sur l'objet Graphics2D plus tôt.

Ceci est la vraie ligne de setStroke

g.setStroke(new BasicStroke((float) (1f/getRoot().scaleX))); 
+0

'ce que GetRoot Contrôlé() imprime scaleX'.? – aioobe

+0

100. J'ai déjà vérifié qu'il est 0.01f en imprimant à la fois l'argument passé à BasicStoke et ce que getLineWidth renvoie pour getStroke –

Répondre

3

Le code suivant produit l'émission de sortie ci-dessous. Vous devez avoir une erreur ailleurs dans votre code. Peut-être un autre appel à scale que vous avez omis dans votre question:

import java.awt.*; 

public class FrameTest { 
    public static void main(String[] args) throws InterruptedException { 

     JFrame f = new JFrame("Demo"); 
     f.getContentPane().setLayout(new BorderLayout());  
     f.add(new JComponent() { 
      public void paintComponent(Graphics g) { 
       Graphics2D g2d = (Graphics2D) g; 

       GeneralPath theShape = new GeneralPath(); 
       theShape.moveTo(0, 0); 
       theShape.lineTo(2, 1); 
       theShape.lineTo(1, 0); 
       theShape.closePath(); 

       g2d.scale(100, 100); 
       g2d.setStroke(new BasicStroke(0.01f)); 
       g2d.draw(theShape); 
      } 
     }); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); 
     f.setVisible(true); 
    } 
} 

enter image description here

+0

C'est étrange. Je ne pense pas qu'il y ait une échelle oubliée. La taille de la forme est correcte, juste les traits sont trop larges. –

+0

Définissez-vous le trait sur l'objet graphique correct? Vous voulez poster plus de votre code? – aioobe

+0

Oui, je le mets sur le bon objet. Quoi qu'il en soit, de nouvelles infos ont été ajoutées à la question. Si cela ne vous aide pas, j'en posterai plus. –

1

Je ne sais pas pourquoi, mais ça fonctionne maintenant.

+0

Je blâme habituellement le rayonnement cosmique dans ces cas. – aioobe

0

Cela a également définir la largeur de 1px pour les lignes:

graphics2D.setStroke(new BasicStroke(0)); 
+0

Quelqu'un peut-il confirmer cela? Sera-t-il toujours 1 pixel? –