Mercurial > dive4elements > river
annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java @ 1871:257f7b54a943
Added new WMSBuildingsArtifact for displaying buildings in maps.
flys-artifacts/trunk@3222 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 10 Nov 2011 13:54:24 +0000 |
parents | 6f83d9d434f2 |
children | 5642a83420f2 |
rev | line source |
---|---|
1797
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.flys.geom; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import java.awt.geom.Point2D; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 public final class VectorUtils |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 public static final double EPSILON = 1e-4; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 private VectorUtils() { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 |
1799
281b9430c720
Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1797
diff
changeset
|
12 public static final double X(Point2D p) { |
1797
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 return p.getX(); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
1799
281b9430c720
Polygon2D: More code to build polygons from curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1797
diff
changeset
|
16 public static final double Y(Point2D p) { |
1797
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 return p.getY(); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 public static final Point2D sub(Point2D a, Point2D b) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 return new Point2D.Double(X(a)-X(b), Y(a)-Y(b)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 public static final double dot(Point2D a, Point2D b) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 return X(a)*X(b) + Y(a)*Y(b); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 public static final Point2D add(Point2D a, Point2D b) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 return new Point2D.Double(X(a)+X(b), Y(a)+Y(b)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 public static final Point2D negate(Point2D a) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 return new Point2D.Double(-X(a), -Y(a)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 public static final Point2D ortho(Point2D a) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 return new Point2D.Double(-Y(a), X(a)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 public static final Point2D scale(Point2D a, double s) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 return new Point2D.Double(s*X(a), s*Y(a)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 public static final double lengthSq(Point2D a) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 double x = X(a); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 double y = Y(a); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 return x*x + y*y; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 public static final double length(Point2D a) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 return Math.sqrt(lengthSq(a)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 public static final Point2D normalize(Point2D a) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 double length = length(a); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 return length != 0d |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 ? scale(a, 1d/length) |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 : new Point2D.Double(X(a), Y(a)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 public static final double L1(Point2D a, Point2D b) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 return Math.abs(X(a)-X(b)) + Math.abs(Y(a)-Y(b)); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 public static final boolean collinear(Point2D a, Point2D b, Point2D c) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 double x1 = X(a); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 double y1 = Y(a); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 double x2 = X(b); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 double y2 = Y(b); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 double x3 = X(c); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 double y3 = Y(c); |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 return Math.abs((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)) < EPSILON; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 public static boolean epsilonEquals(Point2D a, Point2D b) { |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 return Math.abs(X(a)-X(b)) < EPSILON |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 && Math.abs(Y(a)-Y(b)) < EPSILON; |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 |
1801
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
81 public static final Point2D intersection( |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
82 Point2D p1, Point2D p2, |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
83 Point2D p3, Point2D p4 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
84 ) { |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
85 double x1 = X(p1); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
86 double y1 = Y(p1); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
87 double x2 = X(p2); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
88 double y2 = Y(p2); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
89 double x3 = X(p3); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
90 double y3 = Y(p3); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
91 double x4 = X(p4); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
92 double y4 = Y(p4); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
93 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
94 // Compute a1, b1, c1, where line joining points 1 and 2 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
95 // is "a1 x + b1 y + c1 = 0". |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
96 double a1 = y2 - y1; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
97 double b1 = x1 - x2; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
98 double c1 = x2*y1 - x1*y2; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
99 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
100 // Compute r3 and r4. |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
101 double r3 = a1*x3 + b1*y3 + c1; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
102 double r4 = a1*x4 + b1*y4 + c1; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
103 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
104 if (r3 != 0d && r4 != 0d && r3*r4 >= 0) { |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
105 return null; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
106 } |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
107 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
108 // Compute a2, b2, c2 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
109 double a2 = y4 - y3; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
110 double b2 = x3 - x4; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
111 double c2 = (x4 * y3) - (x3 * y4); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
112 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
113 // Compute r1 and r2 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
114 double r1 = a2*x1 + b2*y1 + c2; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
115 double r2 = a2*x2 + b2*y2 + c2; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
116 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
117 if (r1 != 0d && r2 != 0d && r1*r2 >= 0) { |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
118 return null; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
119 } |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
120 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
121 // Line segments intersect: compute intersection point. |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
122 double denom = a1*b2 - a2*b1; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
123 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
124 if (denom == 0d) { // collinear |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
125 return null; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
126 } |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
127 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
128 double offset = Math.abs(denom)/2d; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
129 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
130 // The denom/2 is to get rounding instead of truncating. It |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
131 // is added or subtracted to the numerator, depending upon the |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
132 // sign of the numerator. |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
133 double num = b1*c2 - b2*c1; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
134 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
135 double x = num < 0d |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
136 ? (num - offset)/denom |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
137 : (num + offset)/denom; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
138 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
139 num = a2*c1 - a1*c2; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
140 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
141 double y = num < 0d |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
142 ? (num - offset)/denom |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
143 : (num + offset)/denom; |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
144 |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
145 return new Point2D.Double(x, y); |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
146 } |
6f83d9d434f2
Polygon2D: Generate polygons for trivial cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1799
diff
changeset
|
147 |
1797
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
148 } |
5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
149 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |