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 :

http://dive4elements.wald.intevation.org