Bonjour,
je dessine des polygones sur un panel et j'aimerais faire une fusion de deux polygones. Quelqu'un aurait-il des idées à me donner pour faire cela?
Merci d'avance.
Bonjour,
je dessine des polygones sur un panel et j'aimerais faire une fusion de deux polygones. Quelqu'un aurait-il des idées à me donner pour faire cela?
Merci d'avance.
je n'utilise pas generalpath pour créer mon polygone et je ne peux pas changer cela. Pour construire mon polygone, je stocke tous les points dans un tableau puis je fais un drawPolygon pour le dessiner sur mon panel.
Ben, il va falloir changer cela et utiliser GeneralPath ou Polygon (au moins quand tu veux les ajouter les uns aux autres via une Area).
Un bon conseil : utilise les classes de geometrie existantes, tu te simplifieras la vie.
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
en les changeant en Polygon, après comment je fais pour récupérer les points former par la nouvelle aire
Ma fonction toPolygon() convertit mon polygone pour qu'il soit de la classe Polygon
Et après pour afficher la nouvelle forme, comment je fais?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Polygon pol2= this.toPolygon(); Polygon pol = this.toPolygon(); Area a= new Area ((Shape)pol); Area b= new Area ((Shape) pol2); a.add(b);
Regarde
Graphics2D.draw(Shape);
ou
Graphics2D.fill(Shape);
Au choix :Envoyé par perluce
- en recuperant puis en parcourrant le PathIterator de la nouvelle Area.
- en gardant la List<List<Point>> ou la List<Polygon> qui a servit a construire l'Area (uniquement dans le cas ou tes polygones sont bien distincts l'un de l'autre).
Sans etre la forcement la meilleure, la seconde solution est probablement la meilleure pour toi dans un premier temps. Cependant si tu as effectivement fusionne tes formes (tes polygones occupaient des surfaces se recouvrant), la premiere solution s'impose. Ce n'est pas trop complique a mettre en place, bien lire la doc pour comprendre les resultats retournes par currentSegment().
EDIT - un petit exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 package test; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import javax.swing.*; /** * <p>Title: </p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2006</p> * * <p>Company: </p> * * @author not attributable * @version 1.0 */ public class TestUnion extends JPanel { private Rectangle p1 = new Rectangle(100, 100, 100, 50); private Rectangle p2 = new Rectangle(100, 100, 50, 100); private Rectangle p3 = new Rectangle(250, 250, 100, 100); private Area area = new Area(p1); private Font font = new Font("Dialog", Font.PLAIN, 8); public TestUnion() { area.add(new Area(p2)); area.add(new Area(p3)); } /** * {@inheritDoc} */ @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); Insets insets = getInsets(); Dimension size = getSize(); Graphics2D g2d = (Graphics2D) graphics.create(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom)); try { g2d.setColor(Color.CYAN); g2d.fill(area); g2d.setFont(font); g2d.setColor(Color.BLACK); PathIterator pi = area.getPathIterator(null); float[] params = new float[6]; while (!pi.isDone()) { int seg = pi.currentSegment(params); Point2D p = null; switch (seg) { case PathIterator.SEG_CUBICTO: { } break; // case PathIterator.SEG_QUADTO: { } break; // case PathIterator.SEG_MOVETO: case PathIterator.SEG_LINETO: { p = new Point2D.Float(params[0], params[1]); } break; // case PathIterator.SEG_CLOSE: default: } if (p != null) { g2d.fillRect((int) p.getX() - 1, (int) p.getY() - 1, 2, 2); g2d.drawString("(" + p.getX() + " " + p.getY() + ")", (float) p.getX(), (float) p.getY() - 10); } pi.next(); } } finally { g2d.dispose(); } } /** Self-test main. * @param args Arguments from the command-line. */ public static void main(String ...args) { SwingUtilities.invokeLater(new Runnable() { /** * {@inheritDoc} */ public void run() { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestUnion(), BorderLayout.CENTER); frame.setSize(500, 400); frame.setVisible(true); } }); } }
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager