[MATH-749] Added crossProduct method to Vector2D as a replacement for getLocation, using MathArrays.linearCombination to improve accuracy.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1563684 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Thomas Neidhart 2014-02-02 17:51:06 +00:00
parent 2933e5773b
commit 0fa8bcc008
2 changed files with 68 additions and 0 deletions

View File

@ -329,6 +329,34 @@ public class Vector2D implements Vector<Euclidean2D> {
return MathArrays.linearCombination(x, v2.x, y, v2.y);
}
/**
* Compute the cross-product of the instance and the given points.
* <p>
* The cross product can be used to determine the location of a point
* with regard to the line formed by (p1, p2) and is calculated as:
* \[
* P = (x_2 - x_1)(y_3 - y_1) - (y_2 - y_1)(x_3 - x_1)
* \]
* with \(p3 = (x_3, y_3)\) being this instance.
* <p>
* If the result is 0, the points are collinear, i.e. lie on a single straight line L;
* if it is positive, this point lies to the left, otherwise to the right of the line
* formed by (p1, p2).
*
* @param p1 first point of the line
* @param p2 second point of the line
* @return the cross-product
*
* @see <a href="http://en.wikipedia.org/wiki/Cross_product">Cross product (Wikipedia)</a>
*/
public double crossProduct(final Vector2D p1, final Vector2D p2) {
final double x1 = p2.getX() - p1.getX();
final double y1 = getY() - p1.getY();
final double x2 = getX() - p1.getX();
final double y2 = p2.getY() - p1.getY();
return MathArrays.linearCombination(x1, y1, -x2, y2);
}
/** Compute the distance between two vectors according to the L<sub>2</sub> norm.
* <p>Calling this method is equivalent to calling:
* <code>p1.subtract(p2).getNorm()</code> except that no intermediate

View File

@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.commons.math3.geometry.euclidean.twod;
import org.junit.Assert;
import org.junit.Test;
public class Vector2DTest {
@Test
public void testCrossProduct() {
final double epsilon = 1e-10;
Vector2D p1 = new Vector2D(1, 1);
Vector2D p2 = new Vector2D(2, 2);
Vector2D p3 = new Vector2D(3, 3);
Assert.assertEquals(0.0, p3.crossProduct(p1, p2), epsilon);
Vector2D p4 = new Vector2D(1, 2);
Assert.assertEquals(1.0, p4.crossProduct(p1, p2), epsilon);
Vector2D p5 = new Vector2D(2, 1);
Assert.assertEquals(-1.0, p5.crossProduct(p1, p2), epsilon);
}
}