# HG changeset patch # User Sascha L. Teichmann # Date 1320060731 0 # Node ID 552888e9c64a14391ce2dcb1a3687785e1e95dc2 # Parent 5eec623db50a560e79fe7ff64b0f9308a9dad102 Polygon2D: Handle start points when building polygons. Work in progress. flys-artifacts/trunk@3121 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 5eec623db50a -r 552888e9c64a flys-artifacts/ChangeLog --- 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 + + * 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 * src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java: diff -r 5eec623db50a -r 552888e9c64a flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.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 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 other) { for (int i = other.size()-1; i >= 0; --i) { addCheck(other.get(i)); @@ -156,9 +162,10 @@ List As, List 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 positives, List negatives ) { + List apoints = new ArrayList(); + List bpoints = new ArrayList(); + + 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(