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.
Version imprimable
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.
En utilisant la classe GeneralPath pour créer ton polygone, tu pourras ensuite utiliser la classe Area, qui permet de faire des opérations booléennes sur les Shape (add, subtract, etc.)
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.
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:
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 :Citation:
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:
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); } }); } }