changeset 1798:552888e9c64a

Polygon2D: Handle start points when building polygons. Work in progress. flys-artifacts/trunk@3121 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 31 Oct 2011 11:32:11 +0000
parents 5eec623db50a
children 281b9430c720
files flys-artifacts/ChangeLog flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java
diffstat 2 files changed, 66 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog	Mon Oct 31 10:03:32 2011 +0000
+++ b/flys-artifacts/ChangeLog	Mon Oct 31 11:32:11 2011 +0000
@@ -1,3 +1,8 @@
+2011-10-31	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java:
+	  Handle start points when building polygons. Work in progress.
+
 2011-10-31	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
 
 	* src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java:
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java	Mon Oct 31 10:03:32 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java	Mon Oct 31 11:32:11 2011 +0000
@@ -13,6 +13,8 @@
 import java.util.Comparator;
 import java.util.Collections;
 
+import de.intevation.flys.artifacts.math.Linear;
+
 public class Polygon2D
 implements   Serializable
 {
@@ -54,7 +56,7 @@
         points.add(new Point2D.Double(x, y));
     }
 
-    public boolean addCheck(Point2D p) {
+    protected static boolean addCheck(Point2D p, List<Point2D> points) {
         switch (points.size()) {
             case 0:
                 points.add(p);
@@ -82,6 +84,10 @@
         }
     }
 
+    public boolean addCheck(Point2D p) {
+        return addCheck(p, points);
+    }
+
     public void addReversed(List<Point2D> other) {
         for (int i = other.size()-1; i >= 0; --i) {
             addCheck(other.get(i));
@@ -156,9 +162,10 @@
         List<Point2D []> As,
         List<Point2D []> Bs
     ) {
+        int B = Bs.size()-1;
         OUTER: for (int i = 0; i < As.size();) {
             Point2D [] a = As.get(i);
-            int lo = 0, hi = Bs.size()-1;
+            int lo = 0, hi = B;
             while (lo <= hi) {
                 int mid = (lo + hi) >> 1;
                 Point2D [] b = Bs.get(mid);
@@ -184,6 +191,58 @@
         List<Polygon2D> positives,
         List<Polygon2D> negatives
     ) {
+        List<Point2D> apoints = new ArrayList<Point2D>();
+        List<Point2D> bpoints = new ArrayList<Point2D>();
+
+        double ax = X(as[0]);
+        double bx = X(bs[0]);
+
+        int ai = 0;
+        int bi = 0;
+
+        if (ax == bx) {
+            apoints.add(as[0]);
+            bpoints.add(bs[0]);
+        }
+        else if (ax > bx) {
+            apoints.add(as[0]);
+            bi = 1; // exists because of overlap
+            double bx1;
+            while ((bx1 = X(bs[bi])) < ax) ++bi;
+            if (bx1 == ax) {
+                bpoints.add(bs[bi]);
+            }
+            else { // need to calculate start b point.
+                double by1 = Linear.linear(
+                    ax,
+                    X(bs[bi-1]), bx1,
+                    Y(bs[bi-1]), Y(bs[bi]));
+
+                bpoints.add(new Point2D.Double(ax, by1));
+            }
+        }
+        else { // bx > ax: Symmetric case
+            bpoints.add(bs[0]);
+            ai = 1; // exists because of overlap
+            double ax1;
+            while ((ax1 = X(as[ai])) < bx) ++ai;
+            if (ax1 == bx) {
+                apoints.add(as[ai]);
+            }
+            else { // need to calculate start b point.
+                double ay1 = Linear.linear(
+                    bx,
+                    X(as[ai-1]), ax1,
+                    Y(as[ai-1]), Y(as[ai]));
+
+                apoints.add(new Point2D.Double(bx, ay1));
+            }
+        }
+
+        // now we have a point in each list, decide if neg/pos.
+        boolean neg = Y(bpoints.get(0)) > Y(apoints.get(0));
+
+        // TODO: Continue with inner points
     }
 
     public static void createPolygons(

http://dive4elements.wald.intevation.org