/*
* $Id$
* This file is a part of the Arakhne Foundation Classes, http://www.arakhne.org/afc
*
* Copyright (c) 2000-2012 Stephane GALLAND.
* Copyright (c) 2005-10, Multiagent Team, Laboratoire Systemes et Transports,
* Universite de Technologie de Belfort-Montbeliard.
* Copyright (c) 2013-2016 The original authors, and other authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.arakhne.afc.math.geometry.d3;
import static org.arakhne.afc.math.MathConstants.PI;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Assume;
import org.junit.ComparisonFailure;
import org.junit.Test;
import org.arakhne.afc.math.MathConstants;
import org.arakhne.afc.math.geometry.d3.Vector3D.PowerResult;
@SuppressWarnings("all")
public abstract class AbstractVector3DTest<V extends Vector3D<? super V, ? super P>, P extends Point3D<? super P, ? super V>,
TT extends Tuple3D>
extends AbstractTuple3DTest<TT> {
public abstract V createVector(double x, double y, double z);
public abstract P createPoint(double x, double y, double z);
@Test
public final void staticIsUnitVector() {
assertTrue(Vector3D.isUnitVector(1., 0 , 0));
assertFalse(Vector3D.isUnitVector(1.0001, 0, 0));
double length = Math.sqrt(5. * 5. + 18. * 18. + 3. * 3.);
assertTrue(Vector3D.isUnitVector(5. / length, 18. / length, 3. / length));
}
@Test
public final void staticIsCollinearVectors() {
assertTrue(Vector3D.isCollinearVectors(1, 0, 0, 3, 0, 0));
assertTrue(Vector3D.isCollinearVectors(1, 0, 0, -3, 0, 0));
assertFalse(Vector3D.isCollinearVectors(1, 0, 0, 4, 4, 0));
}
@Test
public final void staticPerpProduct() {
assertEpsilonEquals(0, Vector3D.perpProduct(1, 0, 0, 1, 0, 0));
assertEpsilonEquals(0, Vector3D.perpProduct(1, 0, 0, 5, 0, 0));
assertEpsilonEquals(243, Vector3D.perpProduct(1, 45, 0, -5, 18, 0));
assertEpsilonEquals(0, Vector3D.perpProduct(1, 2, 0, 1, 2, 0));
assertEpsilonEquals(-2, Vector3D.perpProduct(1, 2, 0, 3, 4, 0));
assertEpsilonEquals(-4, Vector3D.perpProduct(1, 2, 0, 1, -2, 0));
}
@Test
public final void staticDotProduct() {
assertEpsilonEquals(1, Vector3D.dotProduct(1, 0, 0, 1, 0, 0));
assertEpsilonEquals(5, Vector3D.dotProduct(1, 0, 0, 5, 0, 0));
assertEpsilonEquals(805, Vector3D.dotProduct(1, 45, 0, -5, 18, 0));
assertEpsilonEquals(5, Vector3D.dotProduct(1, 2, 0, 1, 2, 0));
assertEpsilonEquals(11, Vector3D.dotProduct(1, 2, 0, 3, 4, 0));
assertEpsilonEquals(-3, Vector3D.dotProduct(1, 2, 0, 1, -2, 0));
}
@Test
public final void statisSignedAngle() {
assertEpsilonEquals(0, Vector3D.signedAngle(1, 0, 0, 1, 0, 0));
assertEpsilonEquals(0, Vector3D.signedAngle(1, 0, 0, 5, 0, 0));
assertEpsilonEquals(-MathConstants.DEMI_PI, Vector3D.signedAngle(2, 0, 0, 0, -3, 0));
assertEpsilonEquals(Math.PI, Vector3D.signedAngle(1, 0, 0, -1, 0, 0));
assertEpsilonEquals(0.29317, Vector3D.signedAngle(1, 45, 0, -5, 18, 0));
}
@Test
public final void staticAngleOfVectorDoubleDoubleDoubleDouble() {
double v1x = getRandom().nextDouble();
double v1y = getRandom().nextDouble();
double v1z = getRandom().nextDouble();
double v2x = getRandom().nextDouble();
double v2y = getRandom().nextDouble();
double v2z = getRandom().nextDouble();
assertEpsilonEquals(
0.,
Vector3D.signedAngle(v1x, v1y, v1z, v1x, v1y, v1z));
assertEpsilonEquals(
0.,
Vector3D.signedAngle(v2x, v2y, v2z, v2x, v2y, v2z));
double sAngle1 = Vector3D.signedAngle(v1x, v1y, v1z, v2x, v2y, v2z);
double sAngle2 = Vector3D.signedAngle(v2x, v2y, v2z, v1x, v1y, v1z);
assertEpsilonEquals(-sAngle1, sAngle2);
double sin = v1x * v2y - v1y * v2x;
if (sin < 0) {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
} else {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
}
}
@Test
public final void dotVector3D() {
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(3, 4, 0);
Vector3D vector3 = createVector(1, -2, 0);
assertEpsilonEquals(5,vector.dot(vector));
assertEpsilonEquals(11,vector.dot(vector2));
assertEpsilonEquals(-3,vector.dot(vector3));
}
@Test
public final void perpVector3D() {
Vector3D vector = createVector(1,2, 0);
Vector3D vector2 = createVector(3,4, 0);
Vector3D vector3 = createVector(1,-2, 0);
assertEpsilonEquals(0, vector.perp(vector));
assertEpsilonEquals(-2, vector.perp(vector2));
assertEpsilonEquals(-4, vector.perp(vector3));
}
@Test
public final void length() {
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(0, 0, 0);
Vector3D vector3 = createVector(-1, 1, 0);
assertEpsilonEquals(Math.sqrt(5),vector.getLength());
assertEpsilonEquals(0,vector2.getLength());
assertEpsilonEquals(Math.sqrt(2),vector3.getLength());
}
@Test
public final void lengthSquared_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(0, 0, 0);
Vector3D vector3 = createVector(Math.sqrt(2.) / 2., Math.sqrt(2.) / 2., 0);
assertEpsilonEquals(5,vector.getLengthSquared());
assertEpsilonEquals(0,vector2.getLengthSquared());
assertEpsilonEquals(1,vector3.getLengthSquared());
}
@Test
public final void lengthSquared_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(0, 0, 0);
Vector3D vector3 = createVector(Math.sqrt(2.) / 2., Math.sqrt(2.) / 2., 0);
assertEpsilonEquals(5,vector.getLengthSquared());
assertEpsilonEquals(0,vector2.getLengthSquared());
assertEpsilonEquals(2,vector3.getLengthSquared());
}
@Test
public final void angleVector3D() {
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(-2, 1, 0);
Vector3D vector3 = createVector(1, 1, 0);
Vector3D vector4 = createVector(1, 0, 0);
assertEpsilonEquals(PI/2f,vector.angle(vector2));
assertEpsilonEquals(PI/4f,vector4.angle(vector3));
assertEpsilonEquals(Math.acos(1/Math.sqrt(5)),vector4.angle(vector));
assertEpsilonEquals(PI/2f+Math.acos(1/Math.sqrt(5)),vector4.angle(vector2));
assertEpsilonEquals(0,vector.angle(vector));
}
@Test
public final void signedAngleVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
Vector3D v2 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
assertEpsilonEquals(
0.f,
v1.signedAngle(v1));
assertEpsilonEquals(
0.f,
v2.signedAngle(v2));
double sAngle1 = v1.signedAngle(v2);
double sAngle2 = v2.signedAngle(v1);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
} else {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
}
}
@Test
public final void signedAngleVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
Vector3D v2 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
assertEpsilonEquals(
0,
v1.signedAngle(v1));
assertEpsilonEquals(
0,
v2.signedAngle(v2));
double sAngle1 = v1.signedAngle(v2);
double sAngle2 = v2.signedAngle(v1);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
} else {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
}
}
@Test
public final void isUnitVector_iffp() {
Assume.assumeFalse(isIntCoordinates());
assertFalse(createVector(7.15161,6.7545, 0).isUnitVector());
assertTrue(createVector(0,-1, 0).isUnitVector());
assertTrue((createVector(Math.sqrt(2)/2,Math.sqrt(2)/2,0)).isUnitVector());
assertTrue((createVector(1,0,0)).isUnitVector());
}
@Test
public final void isUnitVector_ifi() {
Assume.assumeTrue(isIntCoordinates());
assertFalse(createVector(7.15161,6.7545, 0).isUnitVector());
assertTrue(createVector(0,-1, 0).isUnitVector());
assertFalse(createVector(0.72700, 0.68663, 0).isUnitVector());
assertFalse((createVector(Math.sqrt(2)/2,Math.sqrt(2)/2, Math.sqrt(2)/2)).isUnitVector());
assertTrue((createVector(1,0,0)).isUnitVector());
}
@Test(expected = UnsupportedOperationException.class)
public final void toUnmodifiable_exception() {
Vector3D origin = createVector(2, 3, 0);
Vector3D immutable = origin.toUnmodifiable();
assertEpsilonEquals(origin, immutable);
immutable.add(1, 2, 0);
}
@Test
public final void toUnmodifiable_changeInOrigin() {
Vector3D origin = createVector(2, 3, 0);
assumeMutable(origin);
Vector3D immutable = origin.toUnmodifiable();
assertEpsilonEquals(origin, immutable);
origin.add(1, 2, 0);
assertEpsilonEquals(origin, immutable);
}
@Test
public final void testCloneVector() {
Vector3D origin = createVector(23, 45, 0);
Tuple3D clone = origin.clone();
assertNotNull(clone);
assertNotSame(origin, clone);
assertEpsilonEquals(origin.getX(), clone.getX());
assertEpsilonEquals(origin.getY(), clone.getY());
}
@Test
public final void toUnitVector_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
Vector3D unitVector = origin.toUnitVector();
assertNotNull(unitVector);
assertNotSame(origin, unitVector);
assertEpsilonEquals(.45511, unitVector.getX());
assertEpsilonEquals(.89043, unitVector.getY());
}
@Test
public final void toUnitVector_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
Vector3D unitVector = origin.toUnitVector();
assertNotNull(unitVector);
assertNotSame(origin, unitVector);
assertEpsilonEquals(0, unitVector.getX());
assertEpsilonEquals(1, unitVector.getY());
//
origin = createVector(-45, 0, 0);
unitVector = origin.toUnitVector();
assertNotNull(unitVector);
assertNotSame(origin, unitVector);
assertEpsilonEquals(-1, unitVector.getX());
assertEpsilonEquals(0, unitVector.getY());
}
public final void assertEpsilonEquals(double expected, PowerResult<?> actual) {
if (actual == null) {
fail("Result is null"); //$NON-NLS-1$
return;
}
if (actual.isVectorial()) {
throw new ComparisonFailure("Not same result type", Double.toString(expected), actual.toString()); //$NON-NLS-1$
}
assertEpsilonEquals(expected, actual.getScalar());
}
public final void assertEpsilonEquals(double expectedX, double expectedY, PowerResult<?> actual) {
if (actual == null) {
fail("Result is null"); //$NON-NLS-1$
return;
}
if (!actual.isVectorial()) {
throw new ComparisonFailure("Not same result type", "[" + expectedX + ";" + expectedY + "]", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
actual.toString());
}
Vector3D<?, ?> vector = actual.getVector();
assert (vector != null);
if (!isEpsilonEquals(expectedX, vector.getX())
|| !isEpsilonEquals(expectedY, vector.getY())) {
throw new ComparisonFailure("Not same result type", "[" + expectedX + ";" + expectedY + "]", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
actual.toString());
}
}
@Test
public final void power_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
assertEpsilonEquals(1.6659527464e10, origin.power(6));
assertEpsilonEquals(150027068, 293531220, origin.power(5));
assertEpsilonEquals(6522916, origin.power(4));
assertEpsilonEquals(58742, 114930, origin.power(3));
assertEpsilonEquals(2554, origin.power(2));
assertEpsilonEquals(23, 45, origin.power(1));
assertEpsilonEquals(1, origin.power(0));
assertEpsilonEquals(23, 45, origin.power(-1));
assertEpsilonEquals(1./2554, origin.power(-2));
assertEpsilonEquals(23./2554, 45./2554, origin.power(-3));
assertEpsilonEquals(1./6522916, origin.power(-4));
assertEpsilonEquals(23./6522916, 45./6522916, origin.power(-5));
assertEpsilonEquals(1./1.6659527464e10, origin.power(-6));
}
@Test
public final void power_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
assertEpsilonEquals(1.6659527464e10, origin.power(6));
assertEpsilonEquals(150027068, 293531220, origin.power(5));
assertEpsilonEquals(6522916, origin.power(4));
assertEpsilonEquals(58742, 114930, origin.power(3));
assertEpsilonEquals(2554, origin.power(2));
assertEpsilonEquals(23, 45, origin.power(1));
assertEpsilonEquals(1, origin.power(0));
assertEpsilonEquals(23, 45, origin.power(-1));
assertEpsilonEquals(1./2554, origin.power(-2));
assertEpsilonEquals(0, 0, origin.power(-3));
assertEpsilonEquals(1./6522916, origin.power(-4));
assertEpsilonEquals(0, 0, origin.power(-5));
assertEpsilonEquals(1./1.6659527464e10, origin.power(-6));
}
@Test
public final void operator_equalsVector3D() {
Vector3D vector = createVector(49, -2, 0);
assertFalse(vector.operator_equals(null));
assertTrue(vector.operator_equals(vector));
assertFalse(vector.operator_equals(createVector(49, -3, 0)));
assertFalse(vector.operator_equals(createVector(0, 0, 0)));
assertTrue(vector.operator_equals(createVector(49, -2, 0)));
}
@Test
public final void operator_notEqualsVector3D() {
Vector3D vector = createVector(49, -2, 0);
assertTrue(vector.operator_notEquals(null));
assertFalse(vector.operator_notEquals(vector));
assertTrue(vector.operator_notEquals(createVector(49, -3, 0)));
assertTrue(vector.operator_notEquals(createVector(0, 0, 0)));
assertFalse(vector.operator_notEquals(createVector(49, -2, 0)));
}
@Test
public final void testEqualsObject() {
Vector3D vector = createVector(49, -2, 0);
assertFalse(vector.equals((Object) null));
assertTrue(vector.equals((Object) vector));
assertFalse(vector.equals((Object) createVector(49, -3, 0)));
assertFalse(vector.equals((Object) createVector(0, 0, 0)));
assertTrue(vector.equals((Object) createVector(49, -2, 0)));
}
@Test
public final void operator_upToVector3D() {
Vector3D vector = createVector(1, 2, 0);
Vector3D vector2 = createVector(-2, 1, 0);
Vector3D vector3 = createVector(1, 1, 0);
Vector3D vector4 = createVector(1, 0, 0);
assertEpsilonEquals(PI/2f,vector.operator_upTo(vector2));
assertEpsilonEquals(PI/4f,vector4.operator_upTo(vector3));
assertEpsilonEquals(Math.acos(1/Math.sqrt(5)),vector4.operator_upTo(vector));
assertEpsilonEquals(PI/2f+Math.acos(1/Math.sqrt(5)),vector4.operator_upTo(vector2));
assertEpsilonEquals(0,vector.operator_upTo(vector));
}
@Test
public final void operator_greaterThanDoubleDotVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
Vector3D v2 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
assertEpsilonEquals(
0.f,
v1.operator_greaterThanDoubleDot(v1));
assertEpsilonEquals(
0.f,
v2.operator_greaterThanDoubleDot(v2));
double sAngle1 = v1.operator_greaterThanDoubleDot(v2);
double sAngle2 = v2.operator_greaterThanDoubleDot(v1);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
} else {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
}
}
@Test
public final void operator_greaterThanDoubleDotVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
Vector3D v2 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
assertEpsilonEquals(
0,
v1.operator_greaterThanDoubleDot(v1));
assertEpsilonEquals(
0,
v2.operator_greaterThanDoubleDot(v2));
double sAngle1 = v1.operator_greaterThanDoubleDot(v2);
double sAngle2 = v2.operator_greaterThanDoubleDot(v1);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
} else {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
}
}
@Test
public final void operator_operator_doubleDotLessThanVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
Vector3D v2 = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
assertEpsilonEquals(
0.f,
v1.operator_greaterThanDoubleDot(v1));
assertEpsilonEquals(
0.f,
v2.operator_greaterThanDoubleDot(v2));
double sAngle1 = v2.operator_greaterThanDoubleDot(v1);
double sAngle2 = v1.operator_greaterThanDoubleDot(v2);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
} else {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
}
}
@Test
public final void operator_operator_doubleDotLessThanVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D v1 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
Vector3D v2 = createVector(getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2, getRandom().nextInt(48) + 2);
assertEpsilonEquals(
0,
v1.operator_greaterThanDoubleDot(v1));
assertEpsilonEquals(
0,
v2.operator_greaterThanDoubleDot(v2));
double sAngle1 = v2.operator_greaterThanDoubleDot(v1);
double sAngle2 = v1.operator_greaterThanDoubleDot(v2);
assertEpsilonEquals(-sAngle1, sAngle2);
assertEpsilonEquals(v1.angle(v2), Math.abs(sAngle1));
assertEpsilonEquals(v2.angle(v1), Math.abs(sAngle2));
double sin = v1.getX() * v2.getY() - v1.getY() * v2.getX();
if (sin < 0) {
assertTrue(sAngle1 >= 0);
assertTrue(sAngle2 <= 0);
} else {
assertTrue(sAngle1 <= 0);
assertTrue(sAngle2 >= 0);
}
}
@Test
public final void operator_minus() {
Vector3D vect = createVector(45, -78, 0);
Vector3D result = vect.operator_minus();
assertNotSame(vect, result);
assertEpsilonEquals(-vect.getX(), result.getX());
assertEpsilonEquals(-vect.getY(), result.getY());
}
@Test
public final void operator_multiplyDouble() {
Vector3D vect = createVector(45, -78, 0);
Vector3D result = vect.operator_multiply(5);
assertNotSame(vect, result);
assertEpsilonEquals(225, result.getX());
assertEpsilonEquals(-390, result.getY());
}
@Test
public final void operator_divideDouble_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(45, -78, 0);
Vector3D result = vect.operator_divide(5);
assertNotSame(vect, result);
assertEquals(9, result.ix());
assertEquals(-16, result.iy());
}
@Test
public final void operator_divideDouble_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(45, -78, 0);
Vector3D result = vect.operator_divide(5);
assertNotSame(vect, result);
assertEpsilonEquals(9, result.getX());
assertEpsilonEquals(-15.6, result.getY());
}
@Test
public final void operator_elvisVector3D() {
Vector3D orig1 = createVector(45, -78, 0);
Vector3D orig2 = createVector(0, 0, 0);
Vector3D param = createVector(-5, -1.4, 0);
Vector3D result;
result = orig1.operator_elvis(null);
assertSame(orig1, result);
result = orig1.operator_elvis(orig1);
assertSame(orig1, result);
result = orig1.operator_elvis(param);
assertSame(orig1, result);
result = orig2.operator_elvis(null);
assertNull(result);
result = orig2.operator_elvis(orig2);
assertSame(orig2, result);
result = orig2.operator_elvis(param);
assertSame(param, result);
}
@Test
public final void operator_minusVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
Vector3D r = vect.operator_minus(vector);
assertFpVectorEquals(1.2, 1.2, 0, r);
r = vect2.operator_minus(vector2);
assertFpVectorEquals(1.0, 1.5, 0, r);
}
@Test
public final void operator_minusVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
Vector3D r;
r = vect.operator_minus(vector);
assertIntVectorEquals(1, 0, 0, r);
r = vect2.operator_minus(vector2);
assertIntVectorEquals(1, 0, 0, r);
}
@Test
public final void operator_plusVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2, 0);
Vector3D vector4 = createVector(2.0,1.5, 0);
Vector3D r = vector.operator_plus(vector3);
assertFpVectorEquals(1.2, 1.2, 0, r);
r = vector2.operator_plus(vector4);
assertFpVectorEquals(1., 1.5, 0, r);
}
@Test
public final void operator_plusVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2, 0);
Vector3D vector4 = createVector(2.0,1.5, 0);
Vector3D r = vector.operator_plus(vector3);
assertIntVectorEquals(1, 0, 0, r);
r = vector2.operator_plus(vector4);
assertIntVectorEquals(1, 0, 0, r);
}
@Test
public final void operator_powerVector3D() {
Vector3D vector = createVector(1,2, 0);
Vector3D vector2 = createVector(3,4, 0);
Vector3D vector3 = createVector(1,-2, 0);
assertEpsilonEquals(0, vector.operator_power(vector));
assertEpsilonEquals(-2, vector.operator_power(vector2));
assertEpsilonEquals(-4, vector.operator_power(vector3));
}
@Test
public final void operator_powerInteger_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
assertEpsilonEquals(1.6659527464e10, origin.operator_power(6));
assertEpsilonEquals(150027068, 293531220, origin.operator_power(5));
assertEpsilonEquals(6522916, origin.operator_power(4));
assertEpsilonEquals(58742, 114930, origin.operator_power(3));
assertEpsilonEquals(2554, origin.operator_power(2));
assertEpsilonEquals(23, 45, origin.operator_power(1));
assertEpsilonEquals(1, origin.operator_power(0));
assertEpsilonEquals(23, 45, origin.operator_power(-1));
assertEpsilonEquals(1./2554, origin.operator_power(-2));
assertEpsilonEquals(23./2554, 45./2554, origin.operator_power(-3));
assertEpsilonEquals(1./6522916, origin.operator_power(-4));
assertEpsilonEquals(23./6522916, 45./6522916, origin.operator_power(-5));
assertEpsilonEquals(1./1.6659527464e10, origin.operator_power(-6));
}
@Test
public final void operator_powerInteger_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D origin = createVector(23, 45, 0);
assertEpsilonEquals(1.6659527464e10, origin.operator_power(6));
assertEpsilonEquals(150027068, 293531220, origin.operator_power(5));
assertEpsilonEquals(6522916, origin.operator_power(4));
assertEpsilonEquals(58742, 114930, origin.operator_power(3));
assertEpsilonEquals(2554, origin.operator_power(2));
assertEpsilonEquals(23, 45, origin.operator_power(1));
assertEpsilonEquals(1, origin.operator_power(0));
assertEpsilonEquals(23, 45, origin.operator_power(-1));
assertEpsilonEquals(1./2554, origin.operator_power(-2));
assertEpsilonEquals(0, 0, origin.operator_power(-3));
assertEpsilonEquals(1./6522916, origin.operator_power(-4));
assertEpsilonEquals(0, 0, origin.operator_power(-5));
assertEpsilonEquals(1./1.6659527464e10, origin.operator_power(-6));
}
@Test
public final void operator_plusPoint3D() {
Point3D point = createPoint(1, 2, 0);
Point3D point2 = createPoint(3, 0, 0);
Vector3D vector1 = createVector(0, 0, 0);
Vector3D vector2 = createVector(1, 2, 0);
Vector3D vector3 = createVector(1, -5, 0);
Point3D r;
r = vector1.operator_plus(point);
assertFpPointEquals(1, 2, 0, r);
r = vector2.operator_plus(point);
assertFpPointEquals(2, 4, 0, r);
r = vector3.operator_plus(point);
assertFpPointEquals(2, -3, 0, r);
r = vector1.operator_plus(point2);
assertFpPointEquals(3, 0, 0, r);
r = vector2.operator_plus(point2);
assertFpPointEquals(4, 2, 0, r);
r = vector3.operator_plus(point2);
assertFpPointEquals(4, -5, 0, r);
}
@Test
public void addVector3DVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(0, 0, 0);
Vector3D vector2 = createVector(-1, 0, 0);
Vector3D vector3 = createVector(1.2, 1.2, 0);
Vector3D vector4 = createVector(2.0, 1.5, 0);
Vector3D vector5 = createVector(0.0, 0.0, 0);
vector5.add(vector3,vector);
assertFpVectorEquals(1.2, 1.2, 0, vector5);
vector5.add(vector4,vector2);
assertFpVectorEquals(1.0, 1.5, 0, vector5);
}
@Test
public void addVector3DVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0, 0, 0);
Vector3D vector2 = createVector(-1, 0, 0);
Vector3D vector3 = createVector(1.2, 1.2, 0);
Vector3D vector4 = createVector(2.0, 1.5, 0);
Vector3D vector5 = createVector(0.0, 0.0, 0);
vector5.add(vector3,vector);
assertIntVectorEquals(1, 0, 0, vector5);
vector5.add(vector4,vector2);
assertIntVectorEquals(1, 0, 0, vector5);
}
@Test
public void addVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2, 0);
Vector3D vector4 = createVector(2.0,1.5, 0);
vector.add(vector3);
assertFpVectorEquals(1.2, 1.2, 0, vector);
vector2.add(vector4);
assertFpVectorEquals(1., 1.5, 0, vector2);
}
@Test
public void addVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2, 0);
Vector3D vector4 = createVector(2.0,1.5, 0);
vector.add(vector3);
assertIntVectorEquals(1, 0, 0, vector);
vector2.add(vector4);
assertIntVectorEquals(1, 0, 0, vector2);
}
@Test
public void scaleAddIntVector3DVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(-1,0, 0);
Vector3D vector2 = createVector(1.0,1.2, 0);
Vector3D vector3 = createVector(0.0,0.0, 0);
vector3.scaleAdd(0,vector2,vector);
assertFpVectorEquals(-1, 0, 0, vector3);
vector3.scaleAdd(1,vector2,vector);
assertFpVectorEquals(0.0, 1.2, 0, vector3);
vector3.scaleAdd(-1,vector2,vector);
assertFpVectorEquals(-2.0, -1.2, 0, vector3);
vector3.scaleAdd(10,vector2,vector);
assertFpVectorEquals(9, 12, 0, vector3);
}
@Test
public void scaleAddIntVector3DVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(-1,0, 0);
Vector3D vector2 = createVector(1.0,1.2, 0);
Vector3D vector3 = createVector(0.0,0.0, 0);
vector3.scaleAdd(0,vector2,vector);
assertFpVectorEquals(-1, 0, 0, vector3);
vector3.scaleAdd(1,vector2,vector);
assertFpVectorEquals(0, 1, 0, vector3);
vector3.scaleAdd(-1,vector2,vector);
assertFpVectorEquals(-2, -1, 0, vector3);
vector3.scaleAdd(10,vector2,vector);
assertFpVectorEquals(9, 10, 0, vector3);
}
@Test
public void scaleAddDoubleVector3DVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(1,0, 0);
Vector3D vector = createVector(-1,1, 0);
Vector3D newPoint = createVector(0.0,0.0, 0);
newPoint.scaleAdd(0.0, vector, vect);
assertFpVectorEquals(1, 0, 0, newPoint);
newPoint.scaleAdd(1.5,vector, vect);
assertFpVectorEquals(-0.5, 1.5, 0, newPoint);
newPoint.scaleAdd(-1.5,vector, vect);
assertFpVectorEquals(2.5, -1.5, 0, newPoint);
newPoint.scaleAdd(0.1,vector, vect);
assertFpVectorEquals(0.9, 0.1, 0, newPoint);
}
@Test
public void scaleAddDoubleVector3DVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(1,0, 0);
Vector3D vector = createVector(-1,1, 0);
Vector3D newPoint = createVector(0.0,0.0, 0);
newPoint.scaleAdd(0.0, vector, vect);
assertIntVectorEquals(1, 0, 0, newPoint);
newPoint.scaleAdd(1.5,vector,vect);
assertIntVectorEquals(0, 2, 0, newPoint);
newPoint.scaleAdd(-1.5,vector,vect);
assertIntVectorEquals(3, -1, 0, newPoint);
newPoint.scaleAdd(0.1,vector,vect);
assertIntVectorEquals(1, 0, 0, newPoint);
}
@Test
public void scaleAddIntVector3D() {
Vector3D vector = createVector(1,0, 0);
Vector3D newPoint = createVector(0,0, 0);
newPoint.scaleAdd(0,vector);
assertFpVectorEquals(1, 0, 0, newPoint);
newPoint.scaleAdd(1,vector);
assertFpVectorEquals(2, 0, 0, newPoint);
newPoint.scaleAdd(-10,vector);
assertFpVectorEquals(-19, 0, 0, newPoint);
}
@Test
public void scaleAddDoubleVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(1,0, 0);
Vector3D newPoint = createVector(0.0,0.0, 0);
newPoint.scaleAdd(0.5,vector);
assertFpVectorEquals(1, 0, 0, newPoint);
newPoint.scaleAdd(1.2,vector);
assertFpVectorEquals(2.2, 0.0, 0, newPoint);
newPoint.scaleAdd(-10,vector);
assertFpVectorEquals(-21, 0, 0, newPoint);
}
@Test
public void scaleAddDoubleVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(1,0, 0);
Vector3D newPoint = createVector(0.0,0.0, 0);
newPoint.scaleAdd(0.5,vector);
assertIntVectorEquals(1, 0, 0, newPoint);
newPoint.scaleAdd(1.2,vector);
assertIntVectorEquals(2, 0, 0, newPoint);
newPoint.scaleAdd(-10,vector);
assertIntVectorEquals(-19, 0, 0, newPoint);
}
@Test
public void subVector3DVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(2.0, 1.5, 0);
Vector3D newPoint = createVector(0.0, 0.0, 0);
newPoint.sub(vect,vector);
assertFpVectorEquals(1.2, 1.2, 0, newPoint);
newPoint.sub(vect2,vector2);
assertFpVectorEquals(-1.0, -1.5, 0, newPoint);
}
@Test
public void subVector3DVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(2.0, 1.5, 0);
Vector3D newPoint = createVector(0.0, 0.0, 0);
newPoint.sub(vect,vector);
assertIntVectorEquals(1, 1, 0, newPoint);
newPoint.sub(vect2,vector2);
assertIntVectorEquals(-1, -2, 0, newPoint);
}
@Test
public void subPoint3DPoint3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Point3D point = createPoint(0, 0, 0);
Point3D point2 = createPoint(1, 0, 0);
Point3D vector = createPoint(-1.2, -1.2, 0);
Point3D vector2 = createPoint(2.0, 1.5, 0);
Vector3D newPoint = createVector(0.0, 0.0, 0);
newPoint.sub(point,vector);
assertFpVectorEquals(1.2, 1.2, 0, newPoint);
newPoint.sub(point2,vector2);
assertFpVectorEquals(-1.0, -1.5, 0, newPoint);
}
@Test
public void subPoint3DPoint3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Point3D point = createPoint(0, 0, 0);
Point3D point2 = createPoint(1, 0, 0);
Point3D vector = createPoint(-1.2, -1.2, 0);
Point3D vector2 = createPoint(2.0, 1.5, 0);
Vector3D newPoint = createVector(0.0, 0.0, 0);
newPoint.sub(point,vector);
assertIntVectorEquals(1, 1, 0, newPoint);
newPoint.sub(point2,vector2);
assertIntVectorEquals(-1, -2, 0, newPoint);
}
@Test
public void subVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
vect.sub(vector);
assertFpVectorEquals(1.2, 1.2, 0, vect);
vect2.sub(vector2);
assertFpVectorEquals(1.0, 1.5, 0, vect2);
}
@Test
public void subVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
vect.sub(vector);
assertIntVectorEquals(1, 1, 0, vect);
vect2.sub(vector2);
assertIntVectorEquals(1, 1, 0, vect2);
}
@Test
public void normalize_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(1,2, 0);
Vector3D vector2 = createVector(0,0, 0);
Vector3D vector3 = createVector(-1,1, 0);
vector.normalize();
vector2.normalize();
vector3.normalize();
assertFpVectorEquals(1/Math.sqrt(5),2/Math.sqrt(5), 0, vector);
assertZero(vector2.getX());
assertZero(vector2.getY());
assertFpVectorEquals(-1/Math.sqrt(2),1/Math.sqrt(2), 0, vector3);
}
@Test
public void normalize_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(1,2, 0);
Vector3D vector2 = createVector(0,0, 0);
Vector3D vector3 = createVector(-1,1, 0);
Vector3D vector4 = createVector(0,-5, 0);
vector.normalize();
vector2.normalize();
vector3.normalize();
vector4.normalize();
assertIntVectorEquals(0, 1, 0, vector);
assertIntVectorEquals(0, 0, 0, vector2);
assertIntVectorEquals(-1, 1, 0, vector3);
assertIntVectorEquals(0, -1, 0, vector4);
}
@Test
public void normalizeVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(0,0, 0);
Vector3D vector3 = createVector(0,0, 0);
vector.normalize(createVector(1,2,0));
vector2.normalize(createVector(0,0,0));
vector3.normalize(createVector(-1,1,0));
assertFpVectorEquals(1/Math.sqrt(5),2/Math.sqrt(5), 0, vector);
assertZero(vector2.getX());
assertZero(vector2.getY());
assertFpVectorEquals(-1/Math.sqrt(2),1/Math.sqrt(2), 0, vector3);
}
@Test
public void normalizeVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(0,0, 0);
Vector3D vector3 = createVector(0,0, 0);
Vector3D vector4 = createVector(0,0, 0);
vector.normalize(createVector(1,2,0));
vector2.normalize(createVector(0,0,0));
vector3.normalize(createVector(-1,1,0));
vector4.normalize(createVector(0,-5,0));
assertIntVectorEquals(0, 1, 0, vector);
assertIntVectorEquals(0, 0, 0, vector2);
assertIntVectorEquals(-1, 1, 0, vector3);
assertIntVectorEquals(0, -1, 0, vector4);
}
@Test
public void setLength_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(getRandom().nextDouble(), getRandom().nextDouble(), getRandom().nextDouble());
Vector3D vector2 = createVector(0,0, 0);
Vector3D oldVector = (Vector3D) vector.clone();
double newLength = getRandom().nextDouble();
vector.setLength(newLength);
vector2.setLength(newLength);
assertEpsilonEquals(vector.angle(oldVector), 0);
assertEpsilonEquals(vector.getLength()*oldVector.getLength()/newLength,oldVector.getLength());
assertFpVectorEquals(newLength,0, 0, vector2);
}
@Test
public void setLength_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0, 2, 0);
Vector3D vector2 = createVector(0, 0, 0);
int newLength = 5;
vector.setLength(newLength);
vector2.setLength(newLength);
assertIntVectorEquals(0, newLength, 0, vector);
assertIntVectorEquals(newLength, 0, 0, vector2);
}
@Test
public void operator_addVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2, 0);
Vector3D vector4 = createVector(2.0,1.5, 0);
vector.operator_add(vector3);
assertFpVectorEquals(1.2, 1.2, 0, vector);
vector2.add(vector4);
assertFpVectorEquals(1., 1.5, 0, vector2);
}
@Test
public void operator_addVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vector = createVector(0,0, 0);
Vector3D vector2 = createVector(-1,0, 0);
Vector3D vector3 = createVector(1.2,1.2,0);
Vector3D vector4 = createVector(2.0,1.5,0);
vector.operator_add(vector3);
assertIntVectorEquals(1, 1, 0, vector);
vector2.operator_add(vector4);
assertIntVectorEquals(1, 2, 0, vector2);
}
@Test
public void operator_removeVector3D_iffp() {
Assume.assumeFalse(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
vect.operator_remove(vector);
assertFpVectorEquals(1.2, 1.2, 0, vect);
vect2.operator_remove(vector2);
assertFpVectorEquals(1.0, 1.5, 0, vect2);
}
@Test
public void operator_removeVector3D_ifi() {
Assume.assumeTrue(isIntCoordinates());
Vector3D vect = createVector(0, 0, 0);
Vector3D vect2 = createVector(-1, 0, 0);
Vector3D vector = createVector(-1.2, -1.2, 0);
Vector3D vector2 = createVector(-2.0, -1.5, 0);
vect.operator_remove(vector);
assertIntVectorEquals(1, 1, 0, vect);
vect2.operator_remove(vector2);
assertIntVectorEquals(1, 1, 0, vect2);
}
}