diff --git a/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2D.java b/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2D.java index ca0d76b99..391051473 100644 --- a/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2D.java +++ b/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2D.java @@ -329,6 +329,34 @@ public class Vector2D implements Vector { return MathArrays.linearCombination(x, v2.x, y, v2.y); } + /** + * Compute the cross-product of the instance and the given points. + *

+ * 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. + *

+ * 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 Cross product (Wikipedia) + */ + 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 L2 norm. *

Calling this method is equivalent to calling: * p1.subtract(p2).getNorm() except that no intermediate diff --git a/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2DTest.java b/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2DTest.java new file mode 100644 index 000000000..32e532546 --- /dev/null +++ b/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/Vector2DTest.java @@ -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); + } +}