[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:
parent
2933e5773b
commit
0fa8bcc008
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue