annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java @ 1799:281b9430c720

Polygon2D: More code to build polygons from curve. flys-artifacts/trunk@3123 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 31 Oct 2011 15:54:02 +0000
parents 5eec623db50a
children 6f83d9d434f2
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
5eec623db50a Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 }
5eec623db50a Polygon2D: moved 2D vector operation to separate class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org