1 package org.opentrafficsim.core.geometry;
2
3 import java.awt.geom.Point2D;
4 import java.io.Serializable;
5
6 import javax.media.j3d.BoundingSphere;
7 import javax.media.j3d.Bounds;
8 import javax.vecmath.Point3d;
9
10 import nl.tudelft.simulation.dsol.animation.LocatableInterface;
11 import nl.tudelft.simulation.language.d3.CartesianPoint;
12 import nl.tudelft.simulation.language.d3.DirectedPoint;
13
14 import org.djunits.unit.LengthUnit;
15 import org.opentrafficsim.core.OTS_SCALAR;
16
17 import com.vividsolutions.jts.geom.Coordinate;
18 import com.vividsolutions.jts.geom.Point;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class OTSPoint3D implements LocatableInterface, Serializable, OTS_SCALAR
34 {
35
36 private static final long serialVersionUID = 20150722L;
37
38
39 @SuppressWarnings("checkstyle:visibilitymodifier")
40 public final double x;
41
42
43 @SuppressWarnings("checkstyle:visibilitymodifier")
44 public final double y;
45
46
47 @SuppressWarnings("checkstyle:visibilitymodifier")
48 public final double z;
49
50
51
52
53
54
55
56 public OTSPoint3D(final double x, final double y, final double z)
57 {
58 this.x = x;
59 this.y = y;
60 this.z = z;
61 }
62
63
64
65
66 public OTSPoint3D(final double[] xyz)
67 {
68 this(xyz[0], xyz[1], (xyz.length > 2) ? xyz[2] : 0.0);
69 }
70
71
72
73
74 public OTSPoint3D(final OTSPoint3D point)
75 {
76 this(point.x, point.y, point.z);
77 }
78
79
80
81
82
83 public OTSPoint3D(final Point3d point)
84 {
85 this(point.x, point.y, point.z);
86 }
87
88
89
90
91
92 public OTSPoint3D(final CartesianPoint point)
93 {
94 this(point.x, point.y, point.z);
95 }
96
97
98
99
100
101 public OTSPoint3D(final DirectedPoint point)
102 {
103 this(point.x, point.y, point.z);
104 }
105
106
107
108
109
110 public OTSPoint3D(final Point2D point2d)
111 {
112 this(point2d.getX(), point2d.getY(), 0.0);
113 }
114
115
116
117
118
119 public OTSPoint3D(final Coordinate coordinate)
120 {
121 this(coordinate.x, coordinate.y, (Double.isNaN(coordinate.z)) ? 0.0 : coordinate.z);
122 }
123
124
125
126
127
128 public OTSPoint3D(final Point point)
129 {
130 this(point.getX(), point.getY(), 0.0);
131 }
132
133
134
135
136
137
138 public OTSPoint3D(final double x, final double y)
139 {
140 this(x, y, 0.0);
141 }
142
143
144
145
146
147 public final double distanceSI(final OTSPoint3D point)
148 {
149 double dx = point.x - this.x;
150 double dy = point.y - this.y;
151 double dz = point.z - this.z;
152
153 return Math.sqrt(dx * dx + dy * dy + dz * dz);
154 }
155
156
157
158
159
160 public final Length.Rel distance(final OTSPoint3D point)
161 {
162 return new Length.Rel(distanceSI(point), LengthUnit.SI);
163 }
164
165
166
167
168 public final Coordinate getCoordinate()
169 {
170 return new Coordinate(this.x, this.y, this.z);
171 }
172
173
174
175
176 public final DirectedPoint getDirectedPoint()
177 {
178 return new DirectedPoint(this.x, this.y, this.z);
179 }
180
181
182 @Override
183 public final DirectedPoint getLocation()
184 {
185 return getDirectedPoint();
186 }
187
188
189
190
191
192 @Override
193 public final Bounds getBounds()
194 {
195 return new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 0.5);
196 }
197
198
199 @Override
200 @SuppressWarnings("checkstyle:designforextension")
201 public String toString()
202 {
203 return String.format("(%.2f,%.2f,%.2f)", this.x, this.y, this.z);
204 }
205
206
207 @Override
208 @SuppressWarnings("checkstyle:designforextension")
209 public int hashCode()
210 {
211 final int prime = 31;
212 int result = 1;
213 long temp;
214 temp = Double.doubleToLongBits(this.x);
215 result = prime * result + (int) (temp ^ (temp >>> 32));
216 temp = Double.doubleToLongBits(this.y);
217 result = prime * result + (int) (temp ^ (temp >>> 32));
218 temp = Double.doubleToLongBits(this.z);
219 result = prime * result + (int) (temp ^ (temp >>> 32));
220 return result;
221 }
222
223
224 @Override
225 @SuppressWarnings({"checkstyle:designforextension", "checkstyle:needbraces"})
226 public boolean equals(final Object obj)
227 {
228 if (this == obj)
229 return true;
230 if (obj == null)
231 return false;
232 if (getClass() != obj.getClass())
233 return false;
234 OTSPoint3D other = (OTSPoint3D) obj;
235 if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x))
236 return false;
237 if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y))
238 return false;
239 if (Double.doubleToLongBits(this.z) != Double.doubleToLongBits(other.z))
240 return false;
241 return true;
242 }
243
244 }