Mercurial > dive4elements > river
annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java @ 1795:fe7f9264a2ed
Interim checkin for polygon calculation.
flys-artifacts/trunk@3118 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 30 Oct 2011 19:28:59 +0000 |
parents | 2ad7ba85a2b3 |
children | 5eec623db50a |
rev | line source |
---|---|
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.flys.geom; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import java.io.Serializable; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 import java.awt.Shape; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 import java.awt.geom.Path2D; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 import java.awt.geom.Point2D; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 import java.util.ArrayList; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 import java.util.List; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 import java.util.Arrays; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 import java.util.Comparator; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 import java.util.Collections; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 public class Polygon2D |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 implements Serializable |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
19 public static final double EPSILON = 1e-4; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
20 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
21 private static final double X(Point2D p) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
22 return p.getX(); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
23 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
24 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
25 private static final double Y(Point2D p) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
26 return p.getY(); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
27 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
28 |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 public static final Comparator<Point2D> POINT_X_CMP = |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 new Comparator<Point2D>() { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 public int compare(Point2D a, Point2D b) { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
32 double d = X(a) - X(b); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 if (d < 0d) return -1; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 return d > 0d ? + 1 : 0; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 }; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 public static final Comparator<Point2D []> FIRST_POINT_X = |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 new Comparator<Point2D []>() { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 public int compare(Point2D [] a, Point2D [] b) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 if (a.length == 0) return -1; // should not happen. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 if (b.length == 0) return +1; // should not happen. |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
43 double d = X(a[0]) - Y(b[0]); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 if (d < 0d) return -1; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 return d > 0d ? + 1 : 0; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 }; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
49 protected List<Point2D> points; |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 public Polygon2D() { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
52 points = new ArrayList<Point2D>(); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
53 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
54 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
55 public static boolean epsilonEquals(Point2D a, Point2D b) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
56 return Math.abs(X(a)-X(b)) < EPSILON |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
57 && Math.abs(Y(a)-Y(b)) < EPSILON; |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 public void add(double x, double y) { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
61 points.add(new Point2D.Double(x, y)); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
62 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
63 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
64 public boolean addCheck(Point2D p) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
65 switch (points.size()) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
66 case 0: |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
67 points.add(p); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
68 return true; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
69 case 1: |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
70 if (epsilonEquals(points.get(0), p)) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
71 return false; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
72 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
73 points.add(p); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
74 return true; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
75 default: |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
76 int L = points.size()-1; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
77 Point2D last = points.get(L); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
78 if (epsilonEquals(last, p)) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
79 return false; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
80 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
81 Point2D before = points.get(L-1); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
82 if (collinear(before, last, p)) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
83 points.set(L, p); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
84 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
85 else { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
86 points.add(p); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
87 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
88 return true; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
89 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
90 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
91 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
92 public void addReversed(List<Point2D> other) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
93 for (int i = other.size()-1; i >= 0; --i) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
94 addCheck(other.get(i)); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
95 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
96 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
97 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
98 private static final double L1(Point2D a, Point2D b) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
99 return Math.abs(X(a)-X(b)) + Math.abs(Y(a)-Y(b)); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
100 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
101 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
102 public static boolean collinear(Point2D a, Point2D b, Point2D c) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
103 double dab = L1(a, b); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
104 double dac = L1(a, c); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
105 double dbc = L1(b, c); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
106 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
107 Point2D p1, p2, p3; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
108 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
109 if (dab > dac) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
110 if (dab > dbc) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
111 p1 = a; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
112 p2 = b; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
113 p3 = c; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
114 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
115 else { // dbc >= dab |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
116 p1 = b; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
117 p2 = c; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
118 p3 = a; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
119 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
120 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
121 else { // dac >= dab |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
122 if (dac > dbc) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
123 p1 = a; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
124 p2 = c; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
125 p3 = b; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
126 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
127 else { // dbc >= dac |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
128 p1 = b; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
129 p2 = c; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
130 p3 = a; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
131 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
132 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
133 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
134 // TODO: Continue here. |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
135 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
136 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
137 return true; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
138 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
139 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
140 public static Point2D sub(Point2D a, Point2D b) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
141 return new Point2D.Double(X(a)-X(b), Y(a)-Y(b)); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
142 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
143 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
144 public static Point2D scale(Point2D a, double s) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
145 return new Point2D.Double(s*X(a), s*Y(a)); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
146 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
147 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
148 public double area() { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
149 double area = 0d; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
150 |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
151 for (int i = 0, N = points.size(); i < N; ++i) { |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
152 int j = (i + 1) % N; |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
153 Point2D pi = points.get(i); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
154 Point2D pj = points.get(j); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
155 area += X(pi)*Y(pj); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
156 area -= X(pj)*Y(pi); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
157 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
158 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
159 return 0.5d*area; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
160 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
161 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
162 public Shape toShape() { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
163 Path2D.Double path = new Path2D.Double(); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
164 |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
165 int N = points.size(); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
166 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
167 if (N > 0) { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
168 Point2D p = points.get(0); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
169 path.moveTo(X(p), Y(p)); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
170 for (int i = 1; i < N; ++i) { |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
171 p = points.get(i); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
172 path.lineTo(X(p), Y(p)); |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
173 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 path.closePath(); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
175 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
176 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
177 return path; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
178 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
179 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 protected static List<Point2D []> splitByNaNs( |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 double [] xs, |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
182 double [] ys |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
183 ) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
184 List<Point2D []> parts = new ArrayList<Point2D []>(); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 List<Point2D> tmp = new ArrayList<Point2D>(xs.length); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 for (int i = 0; i < xs.length; ++i) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
189 double x = xs[i]; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
190 double y = ys[i]; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
191 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
192 if (Double.isNaN(x) || Double.isNaN(y)) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
193 if (!tmp.isEmpty()) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
194 Point2D [] part = new Point2D[tmp.size()]; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
195 parts.add(tmp.toArray(part)); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
196 tmp.clear(); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
197 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
198 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
199 else { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 tmp.add(new Point2D.Double(x, y)); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
202 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
203 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
204 if (!tmp.isEmpty()) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
205 Point2D [] part = new Point2D[tmp.size()]; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
206 parts.add(tmp.toArray(part)); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
207 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
208 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
209 return parts; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
210 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
211 |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
212 protected static boolean removeNoneIntersecting( |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
213 List<Point2D []> As, |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
214 List<Point2D []> Bs |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
215 ) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
216 OUTER: for (int i = 0; i < As.size();) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
217 Point2D [] a = As.get(i); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
218 int lo = 0, hi = Bs.size()-1; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
219 while (lo <= hi) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
220 int mid = (lo + hi) >> 1; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
221 Point2D [] b = Bs.get(mid); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
222 if (X(a[0]) > X(b[b.length-1])) lo = mid+1; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
223 else if (X(a[a.length-1]) < X(b[0])) hi = mid-1; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
224 else { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
225 // found: keep |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
226 ++i; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
227 continue OUTER; |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
228 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
229 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
230 // not found: remove |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
231 As.remove(i); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
232 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
233 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
234 return As.isEmpty(); |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
235 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
236 |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
237 protected static void buildPolygons( |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
238 Point2D [] as, |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
239 Point2D [] bs, |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
240 Point2D [][] rest, |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
241 List<Polygon2D> positives, |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
242 List<Polygon2D> negatives |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
243 ) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
244 } |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
245 |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
246 public static void createPolygons( |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
247 double [] xAs, double [] yAs, |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
248 double [] xBs, double [] yBs, |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
249 List<Polygon2D> positives, |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
250 List<Polygon2D> negatives |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
251 ) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
252 if (xAs.length == 0 || xBs.length == 0) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
253 return; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
254 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
255 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
256 List<Point2D []> splAs = splitByNaNs(xAs, yAs); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
257 List<Point2D []> splBs = splitByNaNs(xBs, yBs); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
258 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
259 // They feeded us with NaNs only. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
260 if (splAs.isEmpty() || splBs.isEmpty()) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
261 return; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
262 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
263 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
264 // Sort each part by x to ensure that the first |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
265 // is the smallest. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
266 for (Point2D [] splA: splAs) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
267 Arrays.sort(splA, POINT_X_CMP); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
268 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
269 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
270 for (Point2D [] splB: splBs) { |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
271 Arrays.sort(splB, POINT_X_CMP); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
272 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
273 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
274 // Now sort all parts by there first elements. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
275 // Should be good enough to find overlapping regions. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
276 Collections.sort(splAs, FIRST_POINT_X); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
277 Collections.sort(splBs, FIRST_POINT_X); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
278 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
279 // Check if the two series intersect at all. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
280 // If no then there will be no area between them. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
281 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
282 Point2D [] p1 = splAs.get(0); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
283 Point2D [] p2 = splBs.get(splBs.size()-1); |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
284 |
1795
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
285 // Sort out the ranges that are not intersecting |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
286 // the ranges in the other series. |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
287 // We are going to merge them anyway |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
288 // so this is not strictly required. |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
289 // Keep it to recude cases. |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
290 if (removeNoneIntersecting(splAs, splBs) |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
291 || removeNoneIntersecting(splBs, splAs) |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
292 ) { |
fe7f9264a2ed
Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1794
diff
changeset
|
293 // They do not intersect at all. |
1794
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
294 return; |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
295 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
296 |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
297 // TODO: Intersect/split the two series parts. |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
298 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
299 } |
2ad7ba85a2b3
Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
300 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |