A quick class I whipped up so that I'll be able to out-of-bounds checking while still keeping a much quicker play-it-forward algorithm. It should work for any dimensioned quad that doesn't have any almost-vertical lines (ie. that 0.00000001 I added in causes a division by 0). I haven't tested it, but it looks right. So be warned! It's released as free code - no restrictions, as long as you don't charge money for it =). The other thing is that you can't put two diagonally opposite points as adjacent arguments when creating the quad.
public class CustomQuad{
//using the two-point formula for a straight line (Linear Equation) - from Wikipedia
private boolean[] modifier = new boolean[4];
private double[] m = new double[4];
private double[] x1 = new double[4];
private double[] y1 = new double[4];
public CustomQuad(Point2D.Double corner1, Point2D.Double corner2, Point2D.Double corner3, Point2D.Double corner4){
m[0] = (corner2.y - corner1.y)/(corner2.x - corner1.x + 0.000000001);
m[1] = (corner3.y - corner2.y)/(corner3.x - corner2.x + 0.000000001);
m[2] = (corner4.y - corner3.y)/(corner4.x - corner3.x + 0.000000001);
m[3] = (corner1.y - corner4.y)/(corner1.x - corner4.x + 0.000000001);
x1[0] = corner1.x;
x1[1] = corner2.x;
x1[2] = corner3.x;
x1[3] = corner4.x;
y1[0] = corner1.y;
y1[1] = corner2.y;
y1[2] = corner3.y;
y1[3] = corner4.y;
calibrate(new Point2D.Double(
(corner1.x + corner2.x + corner3.x + corner4.x)/4,
(corner1.y + corner2.y + corner3.y + corner4.y)/4
));
}
private void calibrate(Point2D.Double insidePoint){
modifier[0] = 0 < m[0]*(insidePoint.x - x1[0]) - insidePoint.y + y1[0];
modifier[1] = 0 < m[1]*(insidePoint.x - x1[1]) - insidePoint.y + y1[1];
modifier[2] = 0 < m[2]*(insidePoint.x - x1[2]) - insidePoint.y + y1[2];
modifier[3] = 0 < m[3]*(insidePoint.x - x1[3]) - insidePoint.y + y1[3];
}
public boolean contains(Point2D.Double test){
return (modifier[0]^(0 >= m[0]*(test.x - x1[0]) - test.y + y1[0]))
&& (modifier[1]^(0 >= m[1]*(test.x - x1[1]) - test.y + y1[1]))
&& (modifier[2]^(0 >= m[2]*(test.x - x1[2]) - test.y + y1[2]))
&& (modifier[3]^(0 >= m[3]*(test.x - x1[3]) - test.y + y1[3]));
}
}
-- Skilgannon