1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| bool QuadEdge::inCircle(Point& a, Point& b, Point& c, Point& d) {
/*
if "d" is strictly INSIDE the circle, then
|d² dx dy 1|
|a² ax ay 1|
det |b² bx by 1| < 0
|c² cx cy 1|
*/
long a2 = a.x*a.x + a.y*a.y;
long b2 = b.x*b.x + b.y*b.y;
long c2 = c.x*c.x + c.y*c.y;
long d2 = d.x*d.x + d.y*d.y;
long det44 = 0;
det44 += d2 * det33( a.x,a.y, 1, b.x,b.y, 1, c.x,c.y, 1 );
det44 -= d.x * det33( a2 ,a.y, 1, b2 ,b.y, 1, c2 ,c.y, 1 );
det44 += d.y * det33( a2 ,a.x, 1, b2 ,b.x, 1, c2 ,c.x, 1 );
det44 -= 1 * det33( a2,a.x,a.y, b2,b.x,b.y, c2,c.x,c.y );
if (det44<0) return true;
return false;
}
long QuadEdge::det33(long m0, long m1, long m2, long m3, long m4, long m5, long m6, long m7, long m8) {
long det33=0;
det33 += m0 * (m4*m8 - m5*m7);
det33 -= m1 * (m3*m8 - m5*m6);
det33 += m2 * (m3*m7 - m4*m6);
return det33;
} |
Partager