/** * */ package maps.util; /** * from http://www.ewjordan.com/ * */ public class Triangle { public double[] x; public double[] y; public Triangle(double x1, double y1, double x2, double y2, double x3, double y3) { this(); double dx1 = x2 - x1; double dx2 = x3 - x1; double dy1 = y2 - y1; double dy2 = y3 - y1; double cross = dx1 * dy2 - dx2 * dy1; boolean ccw = (cross > 0); if (ccw) { x[0] = x1; x[1] = x2; x[2] = x3; y[0] = y1; y[1] = y2; y[2] = y3; } else { x[0] = x1; x[1] = x3; x[2] = x2; y[0] = y1; y[1] = y3; y[2] = y2; } } public Triangle() { x = new double[3]; y = new double[3]; } public boolean isInside(double _x, double _y) { double vx2 = _x - x[0]; double vy2 = _y - y[0]; double vx1 = x[1] - x[0]; double vy1 = y[1] - y[0]; double vx0 = x[2] - x[0]; double vy0 = y[2] - y[0]; double dot00 = vx0 * vx0 + vy0 * vy0; double dot01 = vx0 * vx1 + vy0 * vy1; double dot02 = vx0 * vx2 + vy0 * vy2; double dot11 = vx1 * vx1 + vy1 * vy1; double dot12 = vx1 * vx2 + vy1 * vy2; double invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01); double u = (dot11 * dot02 - dot01 * dot12) * invDenom; double v = (dot00 * dot12 - dot01 * dot02) * invDenom; return ((u > 0) && (v > 0) && (u + v < 1)); } }