diff --git a/src/java/com/threerings/geom/GeomUtil.java b/src/java/com/threerings/geom/GeomUtil.java index 989436cdf..5b98121be 100644 --- a/src/java/com/threerings/geom/GeomUtil.java +++ b/src/java/com/threerings/geom/GeomUtil.java @@ -1,9 +1,10 @@ // -// $Id: GeomUtil.java,v 1.1 2002/06/25 00:22:44 mdb Exp $ +// $Id: GeomUtil.java,v 1.2 2002/06/28 01:29:08 mdb Exp $ package com.threerings.geom; import java.awt.Point; +import com.samskivert.util.StringUtil; /** * General geometry utilites. @@ -24,6 +25,43 @@ public class GeomUtil (v1e.y - v1s.y) * (v2e.y - v2s.y)); } + /** + * Computes and returns the dot product of the two vectors. See + * {@link #dot(Point,Point,Point,Point)} for an explanation of the + * arguments + */ + public static int dot (int v1sx, int v1sy, int v1ex, int v1ey, + int v2sx, int v2sy, int v2ex, int v2ey) + { + return ((v1ex - v1sx) * (v2ex - v2sx) + (v1ey - v1sy) * (v2ey - v2sy)); + } + + /** + * Computes and returns the dot product of the two vectors. The + * vectors are assumed to start with the same coordinate and end with + * different coordinates. + * + * @param vs the starting point of both vectors. + * @param v1e the ending point of the first vector. + * @param v2e the ending point of the second vector. + */ + public static int dot (Point vs, Point v1e, Point v2e) + { + return ((v1e.x - vs.x) * (v2e.x - vs.x) + + (v1e.y - vs.y) * (v2e.y - vs.y)); + } + + /** + * Computes and returns the dot product of the two vectors. + * See {@link #dot(Point,Point,Point)} for an explanation of the + * arguments + */ + public static int dot (int vsx, int vsy, int v1ex, int v1ey, + int v2ex, int v2ey) + { + return ((v1ex - vsx) * (v2ex - vsx) + (v1ey - vsy) * (v2ey - vsy)); + } + /** * Computes the point nearest to the specified point p3 * on the line defined by the two points p1 and @@ -50,4 +88,28 @@ public class GeomUtil n.y = p1.y + Math.round(Ay * u); return n; } + + /** + * Returns less than zero if p2 is on the left hand side + * of the line created by p1 and theta and + * greater than zero if it is on the right hand side. In theory, it + * will return zero if the point is on the line, but due to rounding + * errors it almost always decides that it's not exactly on the line. + * + * @param p1 the point on the line whose side we're checking. + * @param theta the (logical) angle defining the line. + * @param p2 the point that lies on one side or the other of the line. + */ + public static int whichSide (Point p1, double theta, Point p2) + { + // obtain the point defining the right hand normal (N) + theta += Math.PI/2; + int x = p1.x + (int)Math.round(1000*Math.cos(theta)), + y = p1.y + (int)Math.round(1000*Math.sin(theta)); + + // now dot the vector from p1->p2 with the vector from p1->N, if + // it's positive, we're on the right hand side, if it's negative + // we're on the left hand side and if it's zero, we're on the line + return dot(p1.x, p1.y, p2.x, p2.y, x, y); + } }