annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java @ 2089:0da8874bd378

Added initial state to map artifact to be able to advance and step back. The map artifact overrides describe() to have the complete UI information in the describe response document. flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Fri, 06 Jan 2012 12:02:10 +0000
parents 6f83d9d434f2
children 5642a83420f2
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
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
16 import de.intevation.flys.artifacts.math.Linear;
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
17
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
18 import static de.intevation.flys.geom.VectorUtils.X;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
19 import static de.intevation.flys.geom.VectorUtils.Y;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
20 import static de.intevation.flys.geom.VectorUtils.EPSILON;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
21
1794
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 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
23 implements Serializable
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 {
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 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
26 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
27 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
28 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
29 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
30 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
31 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 };
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 };
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
45 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
46
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 public Polygon2D() {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
48 points = new ArrayList<Point2D>();
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
49 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
50
1800
1402991208d5 Polygon2D: made it compilable again.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1799
diff changeset
51 public Polygon2D(List<Point2D> points) {
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
52 this.points = points;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
53 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
54
1794
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 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
56 points.add(new Point2D.Double(x, y));
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
57 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
58
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
59 protected static boolean addCheck(Point2D p, List<Point2D> points) {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
60 switch (points.size()) {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
61 case 0:
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
62 points.add(p);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
63 return true;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
64 case 1:
1797
5eec623db50a Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1795
diff changeset
65 if (VectorUtils.epsilonEquals(points.get(0), p)) {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
66 return false;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
67 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
68 points.add(p);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
69 return true;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
70 default:
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
71 int L = points.size()-1;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
72 Point2D last = points.get(L);
1797
5eec623db50a Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1795
diff changeset
73 if (VectorUtils.epsilonEquals(last, p)) {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
74 return false;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
75 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
76 Point2D before = points.get(L-1);
1797
5eec623db50a Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1795
diff changeset
77 if (VectorUtils.collinear(before, last, p)) {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
78 points.set(L, p);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
79 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
80 else {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
81 points.add(p);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
82 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
83 return true;
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 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
86
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
87 public boolean addCheck(Point2D p) {
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
88 return addCheck(p, points);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
89 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
90
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
91 public void addReversed(List<Point2D> other) {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
92 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
93 addCheck(other.get(i));
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
94 }
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
1794
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 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
98 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
99
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
100 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
101 int j = (i + 1) % N;
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
102 Point2D pi = points.get(i);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
103 Point2D pj = points.get(j);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
104 area += X(pi)*Y(pj);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
105 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
106 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 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
109 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 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
112 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
113
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
114 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
115
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 if (N > 0) {
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
117 Point2D p = points.get(0);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
118 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
119 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
120 p = points.get(i);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
121 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
122 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 path.closePath();
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 return path;
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
129 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
130 double [] xs,
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131 double [] ys
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132 ) {
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
133 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
134
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
135 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
136
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 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
138 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
139 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
140
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141 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
142 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
143 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
144 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
145 tmp.clear();
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 else {
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 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
150 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 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
154 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
155 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
156 }
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 return parts;
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
161 protected static boolean removeNoneIntersecting(
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
162 List<Point2D []> As,
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
163 List<Point2D []> Bs
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
164 ) {
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
165 int B = Bs.size()-1;
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
166 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
167 Point2D [] a = As.get(i);
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
168 int lo = 0, hi = B;
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
169 while (lo <= hi) {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
170 int mid = (lo + hi) >> 1;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
171 Point2D [] b = Bs.get(mid);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
172 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
173 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
174 else {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
175 // found: keep
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
176 ++i;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
177 continue OUTER;
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
178 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
179 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
180 // not found: remove
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
181 As.remove(i);
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
182 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
183
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
184 return As.isEmpty();
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
185 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
186
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
187 protected static void buildPolygons(
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
188 Point2D [] as,
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
189 Point2D [] bs,
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
190 Point2D [][] rest,
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
191 List<Polygon2D> positives,
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
192 List<Polygon2D> negatives
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
193 ) {
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
194 List<Point2D> apoints = new ArrayList<Point2D>();
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
195 List<Point2D> bpoints = new ArrayList<Point2D>();
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
196
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
197 double ax = X(as[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
198 double bx = X(bs[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
199
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
200 int ai = 1;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
201 int bi = 1;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
202
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
203 boolean intersect = false;
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
204
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
205 if (ax == bx) {
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
206 apoints.add(as[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
207 bpoints.add(bs[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
208 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
209 else if (ax > bx) {
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
210 apoints.add(as[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
211 double bx1;
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
212 while ((bx1 = X(bs[bi])) < ax) ++bi;
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
213 if (bx1 == ax) {
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
214 bpoints.add(bs[bi]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
215 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
216 else { // need to calculate start b point.
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
217 intersect = true;
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
218 double by1 = Linear.linear(
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
219 ax,
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
220 X(bs[bi-1]), bx1,
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
221 Y(bs[bi-1]), Y(bs[bi]));
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
222
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
223 bpoints.add(new Point2D.Double(ax, by1));
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
224 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
225 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
226 else { // bx > ax: Symmetric case
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
227 bpoints.add(bs[0]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
228 double ax1;
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
229 while ((ax1 = X(as[ai])) < bx) ++ai;
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
230 if (ax1 == bx) {
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
231 apoints.add(as[ai]);
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
232 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
233 else { // need to calculate start b point.
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
234 intersect = true;
1798
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
235 double ay1 = Linear.linear(
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
236 bx,
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
237 X(as[ai-1]), ax1,
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
238 Y(as[ai-1]), Y(as[ai]));
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
239
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
240 apoints.add(new Point2D.Double(bx, ay1));
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
241 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
242 }
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
243
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
244 // now we have a point in each list, decide if neg/pos.
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
245 boolean neg = Y(bpoints.get(0)) > Y(apoints.get(0));
552888e9c64a Polygon2D: Handle start points when building polygons. Work in progress.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1797
diff changeset
246
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
247 // Continue with inner points
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
248
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
249 Line line = new Line();
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
250
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
251 while (ai < as.length && bi < bs.length) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
252 double xan = X(as[ai]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
253 double xbn = X(bs[bi]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
254 if (xan == xbn) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
255 double yan = Y(as[ai]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
256 double ybn = Y(bs[ai]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
257
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
258 if (neg) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
259 if (yan > ybn) { // intersection
1801
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
260 Point2D ip = VectorUtils.intersection(
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
261 apoints.get(apoints.size()-1), as[ai],
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
262 bpoints.get(bpoints.size()-1), bs[bi]);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
263 addCheck(ip, apoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
264 addCheck(ip, bpoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
265 Polygon2D p = new Polygon2D(
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
266 new ArrayList<Point2D>(apoints));
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
267 p.addReversed(bpoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
268 negatives.add(p);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
269 apoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
270 bpoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
271 apoints.add(ip);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
272 bpoints.add(ip);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
273 neg = !neg;
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
274 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
275 else { // no intersection
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
276 addCheck(as[ai], apoints);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
277 addCheck(bs[bi], bpoints);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
278 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
279 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
280 else { // not neg
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
281 if (ybn > yan) { // intersection
1801
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
282 Point2D ip = VectorUtils.intersection(
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
283 apoints.get(apoints.size()-1), as[ai],
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
284 bpoints.get(bpoints.size()-1), bs[bi]);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
285 addCheck(ip, apoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
286 addCheck(ip, bpoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
287 Polygon2D p = new Polygon2D(
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
288 new ArrayList<Point2D>(apoints));
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
289 p.addReversed(bpoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
290 positives.add(p);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
291 apoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
292 bpoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
293 apoints.add(ip);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
294 bpoints.add(ip);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
295 neg = !neg;
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
296 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
297 else { // no intersection
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
298 addCheck(as[ai], apoints);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
299 addCheck(bs[bi], bpoints);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
300 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
301 }
1801
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
302 ++ai;
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
303 ++bi;
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
304 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
305 else if (xan > xbn) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
306 line.set(apoints.get(apoints.size()-1), as[ai]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
307 double dir = neg ? -1d: 1d; // XXX: correct sign?
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
308 while (bi < bs.length
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
309 && X(bs[bi]) < xan
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
310 && line.eval(bs[bi])*dir > EPSILON)
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
311 ++bi;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
312 if (bi == bs.length) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
313 // b run out of points
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
314 // calculate Y(last_a, as[ai]) for X(bs[bi-1])
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
315 double ay1 = Linear.linear(
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
316 X(bs[bi-1]),
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
317 X(apoints.get(apoints.size()-1)), X(as[ai]),
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
318 Y(apoints.get(apoints.size()-1)), Y(as[ai]));
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
319 addCheck(new Point2D.Double(X(bs[bi-1]), ay1), apoints);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
320 addCheck(bs[bi-1], bpoints);
1801
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
321 Polygon2D p = new Polygon2D(
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
322 new ArrayList<Point2D>(apoints));
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
323 p.addReversed(bpoints);
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
324 apoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
325 bpoints.clear();
6f83d9d434f2 Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1800
diff changeset
326 (neg ? negatives : positives).add(p);
1799
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
327 break;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
328 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
329 else {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
330 // TODO: intersect line and/or X(bs[bi]) >= xan?
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
331 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
332 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
333 else { // xbn > xan
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
334 line.set(bpoints.get(bpoints.size()-1), bs[bi]);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
335 // TODO: continue symmetric
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
336 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
337 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
338
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
339 // TODO: Continue with closing segment
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
340 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
341
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
342 public static final class Line {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
343
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
344 private double a;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
345 private double b;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
346 private double c;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
347
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
348 public Line() {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
349 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
350
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
351 public Line(Point2D p1, Point2D p2) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
352 set(p1, p2);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
353 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
354
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
355 public void set(Point2D p1, Point2D p2) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
356 Point2D p3 =
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
357 VectorUtils.normalize(
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
358 VectorUtils.sub(p1, p2));
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
359
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
360 Point2D n = VectorUtils.ortho(p3);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
361
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
362 a = X(n);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
363 b = Y(n);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
364
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
365 // a*x + b*y + c = 0
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
366 // c = -a*x -b*y
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
367
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
368 c = -a*X(p1) - b*Y(p1);
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
369 }
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
370
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
371 public double eval(Point2D p) {
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
372 return a*X(p) + b*Y(p) + c;
281b9430c720 Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1798
diff changeset
373 }
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
374 }
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
375
1794
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
376 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
377 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
378 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
379 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
380 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
381 ) {
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
382 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
383 return;
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
384 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
385
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
386 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
387 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
388
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
389 // 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
390 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
391 return;
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
392 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
393
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
394 // 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
395 // 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
396 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
397 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
398 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
399
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
400 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
401 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
402 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
403
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
404 // 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
405 // 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
406 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
407 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
408
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
409 // 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
410 // 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
411
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
412 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
413 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
414
1795
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
415 // 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
416 // the ranges in the other series.
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
417 // We are going to merge them anyway
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
418 // so this is not strictly required.
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
419 // Keep it to recude cases.
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
420 if (removeNoneIntersecting(splAs, splBs)
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
421 || removeNoneIntersecting(splBs, splAs)
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
422 ) {
fe7f9264a2ed Interim checkin for polygon calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1794
diff changeset
423 // 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
424 return;
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
425 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
426
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
427 // 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
428 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
429 }
2ad7ba85a2b3 Work in progress: Added polygon to help creating 'Raum/Flaeche' renderers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
430 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org