001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.math.geometry;
019
020 import org.apache.commons.math.geometry.Vector3D;
021
022 import junit.framework.*;
023
024 public class Vector3DTest
025 extends TestCase {
026
027 public Vector3DTest(String name) {
028 super(name);
029 }
030
031 public void testConstructors() {
032 double r = Math.sqrt(2) /2;
033 checkVector(new Vector3D(2, new Vector3D(Math.PI / 3, -Math.PI / 4)),
034 r, r * Math.sqrt(3), -2 * r);
035 checkVector(new Vector3D(2, Vector3D.PLUS_I,
036 -3, Vector3D.MINUS_K),
037 2, 0, 3);
038 checkVector(new Vector3D(2, Vector3D.PLUS_I,
039 5, Vector3D.PLUS_J,
040 -3, Vector3D.MINUS_K),
041 2, 5, 3);
042 checkVector(new Vector3D(2, Vector3D.PLUS_I,
043 5, Vector3D.PLUS_J,
044 5, Vector3D.MINUS_J,
045 -3, Vector3D.MINUS_K),
046 2, 0, 3);
047 }
048
049 public void testCoordinates() {
050 Vector3D v = new Vector3D(1, 2, 3);
051 assertTrue(Math.abs(v.getX() - 1) < 1.0e-12);
052 assertTrue(Math.abs(v.getY() - 2) < 1.0e-12);
053 assertTrue(Math.abs(v.getZ() - 3) < 1.0e-12);
054 }
055
056 public void testNorm1() {
057 assertEquals(0.0, Vector3D.ZERO.getNorm1());
058 assertEquals(6.0, new Vector3D(1, -2, 3).getNorm1(), 0);
059 }
060
061 public void testNorm() {
062 assertEquals(0.0, Vector3D.ZERO.getNorm());
063 assertEquals(Math.sqrt(14), new Vector3D(1, 2, 3).getNorm(), 1.0e-12);
064 }
065
066 public void testNormInf() {
067 assertEquals(0.0, Vector3D.ZERO.getNormInf());
068 assertEquals(3.0, new Vector3D(1, -2, 3).getNormInf(), 0);
069 }
070
071 public void testDistance1() {
072 Vector3D v1 = new Vector3D(1, -2, 3);
073 Vector3D v2 = new Vector3D(-4, 2, 0);
074 assertEquals(0.0, Vector3D.distance1(Vector3D.MINUS_I, Vector3D.MINUS_I), 0);
075 assertEquals(12.0, Vector3D.distance1(v1, v2), 1.0e-12);
076 assertEquals(v1.subtract(v2).getNorm1(), Vector3D.distance1(v1, v2), 1.0e-12);
077 }
078
079 public void testDistance() {
080 Vector3D v1 = new Vector3D(1, -2, 3);
081 Vector3D v2 = new Vector3D(-4, 2, 0);
082 assertEquals(0.0, Vector3D.distance(Vector3D.MINUS_I, Vector3D.MINUS_I), 0);
083 assertEquals(Math.sqrt(50), Vector3D.distance(v1, v2), 1.0e-12);
084 assertEquals(v1.subtract(v2).getNorm(), Vector3D.distance(v1, v2), 1.0e-12);
085 }
086
087 public void testDistanceSq() {
088 Vector3D v1 = new Vector3D(1, -2, 3);
089 Vector3D v2 = new Vector3D(-4, 2, 0);
090 assertEquals(0.0, Vector3D.distanceSq(Vector3D.MINUS_I, Vector3D.MINUS_I), 0);
091 assertEquals(50.0, Vector3D.distanceSq(v1, v2), 1.0e-12);
092 assertEquals(Vector3D.distance(v1, v2) * Vector3D.distance(v1, v2),
093 Vector3D.distanceSq(v1, v2), 1.0e-12);
094 }
095
096 public void testDistanceInf() {
097 Vector3D v1 = new Vector3D(1, -2, 3);
098 Vector3D v2 = new Vector3D(-4, 2, 0);
099 assertEquals(0.0, Vector3D.distanceInf(Vector3D.MINUS_I, Vector3D.MINUS_I), 0);
100 assertEquals(5.0, Vector3D.distanceInf(v1, v2), 1.0e-12);
101 assertEquals(v1.subtract(v2).getNormInf(), Vector3D.distanceInf(v1, v2), 1.0e-12);
102 }
103
104 public void testSubtract() {
105
106 Vector3D v1 = new Vector3D(1, 2, 3);
107 Vector3D v2 = new Vector3D(-3, -2, -1);
108 v1 = v1.subtract(v2);
109 checkVector(v1, 4, 4, 4);
110
111 checkVector(v2.subtract(v1), -7, -6, -5);
112 checkVector(v2.subtract(3, v1), -15, -14, -13);
113
114 }
115
116 public void testAdd() {
117 Vector3D v1 = new Vector3D(1, 2, 3);
118 Vector3D v2 = new Vector3D(-3, -2, -1);
119 v1 = v1.add(v2);
120 checkVector(v1, -2, 0, 2);
121
122 checkVector(v2.add(v1), -5, -2, 1);
123 checkVector(v2.add(3, v1), -9, -2, 5);
124
125 }
126
127 public void testScalarProduct() {
128 Vector3D v = new Vector3D(1, 2, 3);
129 v = v.scalarMultiply(3);
130 checkVector(v, 3, 6, 9);
131
132 checkVector(v.scalarMultiply(0.5), 1.5, 3, 4.5);
133
134 }
135
136 public void testVectorialProducts() {
137 Vector3D v1 = new Vector3D(2, 1, -4);
138 Vector3D v2 = new Vector3D(3, 1, -1);
139
140 assertTrue(Math.abs(Vector3D.dotProduct(v1, v2) - 11) < 1.0e-12);
141
142 Vector3D v3 = Vector3D.crossProduct(v1, v2);
143 checkVector(v3, 3, -10, -1);
144
145 assertTrue(Math.abs(Vector3D.dotProduct(v1, v3)) < 1.0e-12);
146 assertTrue(Math.abs(Vector3D.dotProduct(v2, v3)) < 1.0e-12);
147
148 }
149
150 public void testAngular() {
151
152 assertEquals(0, Vector3D.PLUS_I.getAlpha(), 1.0e-10);
153 assertEquals(0, Vector3D.PLUS_I.getDelta(), 1.0e-10);
154 assertEquals(Math.PI / 2, Vector3D.PLUS_J.getAlpha(), 1.0e-10);
155 assertEquals(0, Vector3D.PLUS_J.getDelta(), 1.0e-10);
156 assertEquals(0, Vector3D.PLUS_K.getAlpha(), 1.0e-10);
157 assertEquals(Math.PI / 2, Vector3D.PLUS_K.getDelta(), 1.0e-10);
158
159 Vector3D u = new Vector3D(-1, 1, -1);
160 assertEquals(3 * Math.PI /4, u.getAlpha(), 1.0e-10);
161 assertEquals(-1.0 / Math.sqrt(3), Math.sin(u.getDelta()), 1.0e-10);
162
163 }
164
165 public void testAngularSeparation() {
166 Vector3D v1 = new Vector3D(2, -1, 4);
167
168 Vector3D k = v1.normalize();
169 Vector3D i = k.orthogonal();
170 Vector3D v2 = k.scalarMultiply(Math.cos(1.2)).add(i.scalarMultiply(Math.sin(1.2)));
171
172 assertTrue(Math.abs(Vector3D.angle(v1, v2) - 1.2) < 1.0e-12);
173
174 }
175
176 public void testNormalize() {
177 assertEquals(1.0, new Vector3D(5, -4, 2).normalize().getNorm(), 1.0e-12);
178 try {
179 Vector3D.ZERO.normalize();
180 fail("an exception should have been thrown");
181 } catch (ArithmeticException ae) {
182 // expected behavior
183 } catch (Exception e) {
184 fail("wrong exception caught: " + e.getMessage());
185 }
186 }
187
188 public void testOrthogonal() {
189 Vector3D v1 = new Vector3D(0.1, 2.5, 1.3);
190 assertEquals(0.0, Vector3D.dotProduct(v1, v1.orthogonal()), 1.0e-12);
191 Vector3D v2 = new Vector3D(2.3, -0.003, 7.6);
192 assertEquals(0.0, Vector3D.dotProduct(v2, v2.orthogonal()), 1.0e-12);
193 Vector3D v3 = new Vector3D(-1.7, 1.4, 0.2);
194 assertEquals(0.0, Vector3D.dotProduct(v3, v3.orthogonal()), 1.0e-12);
195 try {
196 new Vector3D(0, 0, 0).orthogonal();
197 fail("an exception should have been thrown");
198 } catch (ArithmeticException ae) {
199 // expected behavior
200 } catch (Exception e) {
201 fail("wrong exception caught: " + e.getMessage());
202 }
203 }
204
205 public void testAngle() {
206 assertEquals(0.22572612855273393616,
207 Vector3D.angle(new Vector3D(1, 2, 3), new Vector3D(4, 5, 6)),
208 1.0e-12);
209 assertEquals(7.98595620686106654517199e-8,
210 Vector3D.angle(new Vector3D(1, 2, 3), new Vector3D(2, 4, 6.000001)),
211 1.0e-12);
212 assertEquals(3.14159257373023116985197793156,
213 Vector3D.angle(new Vector3D(1, 2, 3), new Vector3D(-2, -4, -6.000001)),
214 1.0e-12);
215 try {
216 Vector3D.angle(Vector3D.ZERO, Vector3D.PLUS_I);
217 fail("an exception should have been thrown");
218 } catch (ArithmeticException ae) {
219 // expected behavior
220 } catch (Exception e) {
221 fail("wrong exception caught: " + e.getMessage());
222 }
223 }
224
225 private void checkVector(Vector3D v, double x, double y, double z) {
226 assertEquals(x, v.getX(), 1.0e-12);
227 assertEquals(y, v.getY(), 1.0e-12);
228 assertEquals(z, v.getZ(), 1.0e-12);
229 }
230
231 public static Test suite() {
232 return new TestSuite(Vector3DTest.class);
233 }
234
235 }