2017-01-20 2 views
-1

Salut, je suis en train de créer coeur forme pour mon application et que je pouvais faire une creuse et il fonctionne bien, maintenant je dois le dessiner avec la méthode utilisé, mais il est créé par deux Arc2D.Double et deux Line2D.Double donc à cause de cela juste le remplissage de l'Arc et deux lignes non.J'ai essayé d'ajouter ces deux lignes dans deux 'Area' différents et d'ajouter ces deux zones en une, mais aussi pas travaillé.Comment remplir entre deux Line2D.Double?

Il ya un moyen de le faire (remplissage entre deux lignes)? Merci d'avance.

Mes codes: Classe coeur

`public class HeartShape { 

    private ArrayList<Shape> shapes; 
    public HeartShape() { 

    } 

    public ArrayList<Shape> Heart(double x, double y, double HEART_RADIUS) { 
     shapes = new ArrayList<>(); 
     double r = HEART_RADIUS; 
     double root2 = Math.sqrt(2); 
     double cx = x; 
     double cy = y; 
     double dx = r/root2; 
     double heights = 3 * dx + r; 
     double top = cy - heights/2; 
     double bottom = cy + heights/2; 
     Shape s = new Arc2D.Double(cx - dx - r, top, 2 * r, 2 * r, 45, 180, Arc2D.OPEN); 
     shapes.add(s); 
     s = new Arc2D.Double(cx + dx - r, top, 2 * r, 2 * r, -45, 180, Arc2D.OPEN); 
     shapes.add(s); 
     s = new Line2D.Double(cx, bottom, cx - 2 * dx, bottom - 2 * dx); 
     shapes.add(s); 
     s = new Line2D.Double(cx, bottom, cx + 2 * dx, bottom - 2 * dx); 
     shapes.add(s); 
     if (shapes != null) { 
      return shapes; 
     } else { 
      return null; 
     } 
    } 

    public void drawHeart(Graphics2D g2d, boolean isFilled) { 

     if (isFilled == true) { 
        shapes.forEach((ss) -> { 
         g2d.fill(ss); 
        }); 
     } else { 
        shapes.forEach((ss) -> { 
         g2d.draw(ss); 
        }); 
     } 

    }` 

Et DrawinTest:

public class DrawinTest extends JPanel{ 
private int HEART_RADIUS; 
private Point startpoint; 
private int x, y, width, height; 
private HeartShape heartShape = new HeartShape(); 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    new DrawinTest(); 
} 

public DrawinTest() { 
    JFrame f = new JFrame("Test Area"); 
    f.setPreferredSize(new Dimension(600, 500)); 
    f.setLocationRelativeTo(null); 
    f.setLayout(new BorderLayout(0, 1)); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.addMouseListener(new MyMouseListener()); 
    this.addMouseMotionListener(new MyMouseListener()); 
    this.setBackground(Color.WHITE); 
    f.setContentPane(this); 
    f.setVisible(true); 
    f.pack(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Graphics2D g2d = (Graphics2D)g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.setStroke(new BasicStroke(3)); 
    g2d.setColor(Color.RED); 

    if(heartShape != null) { 
     heartShape.Heart(x, y, HEART_RADIUS); 
     heartShape.drawHeart(g2d, false); 

    } 
    g2d.dispose(); 
} 

class MyMouseListener implements MouseListener,MouseMotionListener { 

    @Override 
    public void mouseClicked(MouseEvent e) {} 

    @Override 
    public void mousePressed(MouseEvent e) { 
     startpoint = new Point(e.getPoint()); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) {} 

    @Override 
    public void mouseEntered(MouseEvent e) {} 

    @Override 
    public void mouseExited(MouseEvent e) {} 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     x = Math.min(startpoint.x, e.getX()); 
     y = Math.min(startpoint.y, e.getY()); 
     width = Math.abs(startpoint.x - e.getX()); 
     height = Math.abs(startpoint.y - e.getY()); 
     HEART_RADIUS = Math.min(width, height); 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) {} 

    } 
} 

Jusqu'à présent, son qui ressemble à ceci:

EmptyFilled

+0

Utilisez l'API 'Shape' pour générer une forme" fermée "- [Comme exemple conceptuel] (http://stackoverflow.com/questions/30041397/comment-peindre-un-groupe-de-quadcourbes-en utilisant-java-graphics2d/30042600 # 30042600) – MadProgrammer

+0

@MadProgrammer merci de replay rapide, pouvez-vous me montrer comment faire s'il vous plaît? Parce que mon cerveau est fatigué d'y faire face. –

+0

Oui, j'ai ajouté un exemple de lien au commentaire précédent;) – MadProgrammer

Répondre

2

L'API Shape s a un certain nombre d'API vraiment intéressant, l'un de mes favoris est Path2D

Fondamentalement, ce qu'il vous permet de faire est ajouter d'autres Shape s, ce qui rend très utile dans cette situation.

public class HeartShape { 

    private Shape shape; 

    public HeartShape() { 

    } 

    public Shape Heart(double x, double y, double HEART_RADIUS) { 
     double r = HEART_RADIUS; 
     double root2 = Math.sqrt(2); 
     double cx = x; 
     double cy = y; 
     double dx = r/root2; 
     double heights = 3 * dx + r; 
     double top = cy - heights/2; 
     double bottom = cy + heights/2; 

     Path2D base = new Path2D.Double(); 
     Shape s = new Arc2D.Double(cx - dx - r, top, 2 * r, 2 * r, 45, 180, Arc2D.OPEN); 
     base.append(s, false); 
     s = new Line2D.Double(cx, bottom, cx - 2 * dx, bottom - 2 * dx); 
     base.append(s, true); 
     s = new Line2D.Double(cx, bottom, cx + 2 * dx, bottom - 2 * dx); 
     base.append(s, true); 
     s = new Arc2D.Double(cx + dx - r, top, 2 * r, 2 * r, -45, 180, Arc2D.OPEN); 
     base.append(s, true); 

     base.closePath(); 

     shape = base; 

     return base; 
    } 

    public void drawHeart(Graphics2D g2d, boolean isFilled) { 
     System.out.println("..."); 
     if (isFilled) { 
      g2d.fill(shape); 
     } else { 
      g2d.draw(shape); 
     } 
    } 
} 

Comme le montre this example, vous n'avez pas besoin de recréer la forme lorsque vous voulez changer de taille, vous pouvez simplement créer une instance de celui-ci à une taille « par défaut » et utilisez un AffineTransform à le redimensionner, beaucoup plus facile;)

+0

Réponse parfaite et +1 pour vous. Merci beaucoup. –

+0

@CoderACJHP Heureux qu'il pourrait aider;) – MadProgrammer

+1

Pourrait certains expliquer s'il vous plaît pourquoi cette réponse attirerait une downvote? Je ne sais pas comment il ne répond pas à la question? De quelle manière serait-il amélioré? Vu que la question n'a pas reçu de nouvelles downvotes, je suppose que vous ne trouvez pas de problème avec la question, car aucune autre réponse n'a été downvoted ou de nouvelles réponses ajoutées, je suppose que vous ne faites que me contredire personnellement ... est une honte – MadProgrammer

1

Je pense qu'au lieu d'utiliser un arrayList de formes, vous devez utiliser un GenericPath et ajouter chaque forme à GenericPath.append(). Une fois que vous avez terminé, ajoutez les morceaux de cœur à GenericPath.closePath() pour en faire un gros plan afin qu'il puisse être rempli. Ensuite, vous devriez être en mesure d'utiliser le nouvel objet GenericPath comme chemin à dessiner avec g2d.draw