2D Point In Triangle
See 2D Point In 2D Convex Polygon when n=3
2D Point In Rectangle
Point : P
Rectangle: R { V2d inf, sup;} (inf->infimum, sup->supremum)
if ( P.x >= R.inf.x && P.x <= R.sup.x
&& P.y >= R.inf.y && P.y <= R.sup.y )
{
return Inside;
}
return Outside;
2D Point In ORectangle(Oriented Rectangle, not axis aligned Rectangle)
See 2D Point In 2D Convex Polygon when n=4
Point In Circle Or Sphere
Point : P
Sphere : | P – C | = R (R>=0)
if ( CP * CP <= R^2 )
{
return Inside;
}
return Outside;
2D Point In Ellipse
Point : P
Ellipse: (x - x0)^2 / a^2 + (y - y0)^2 / b^2 = 1 (a>0, b>0)
if ( (P.x-x0)^2 / a^2 + (P.y - y0)^2 / b^2 <= 1 )
{
return Inside;
}
return Outside;
Point In OBB
See 3D Point In Convex Polyhedron when n = 6
Line Segment & Ellipse
Line Seg: P = P0 + t * V (t>=0 && t<=1)
Ellipse : (x - x0)^2 / a^2 + (y - y0)^2 / b^2 = 1 (a>0, b>0)
(P0.x – x0 + t * V.x)^2 / a^2 + (P0.y - y0 + t * V.y)^2 / b^2 = 1
(b^2 * V.x^2 + a^2 * V.y^2) * t^2 + (2 * b^2 * V.x * (P0.x – x0) + 2 * a^2 * V.y * (P0.y – y0)) * t + b^2 * V.x^2 * (P0.x – x0)^2 + a^2 * V.y^2 * (P0.y – y0)^2 – a^2 * b^2 = 0
A = (b^2 * V.x^2 + a^2 * V.y^2);
B = (2 * b^2 * V.x * (P0.x – x0) + 2 * a^2 * V.y * (P0.y – y0));
C = b^2 * V.x^2 * (P0.x – x0)^2 + a^2 * V.y^2 * (P0.y – y0)^2 – a^2 * b^2;
Δ= B^2 – 4AC;
if ( Δ < 0 ) return No Intersection;
t = (-B ± sqrt(B^2 – 4AC)) / 2A;
if ( t >= 0 && t <= 1 ) return Intersectant;
Line Segment & Ellipsoid
Line Seg : P = P0 + t * V (t>=0 && t<=1)
Ellipsoid: (x - x0)^2 / a^2 + (y - y0)^2 / b^2 + (z - z0)^2 / c^2= 1 (a>0, b>0, c>0)
(P0.x – x0 + t * V.x)^2 / a^2 + (P0.y - y0 + t * V.y)^2 / b^2 + (P0.z - z0 + t * V.z)^2 / c^2 = 1
……
Δ= B^2 – 4AC;
if ( Δ < 0 ) return No Intersection;
t = (-B ± sqrt(B^2 – 4AC)) / 2A;
if ( t >= 0 && t <= 1 ) return Intersectant;
Point In Ellipsoid
Point : P
Ellipsoid: (x - x0)^2 / a^2 + (y - y0)^2 / b^2 + (z - z0)^2 / c^2= 1 (a>0, b>0, c>0)
if ( (P.x-x0)^2 / a^2 + (P.y - y0)^2 / b^2 + (P.z - z0)^2 / c^2 <= 1 )
{
return Inside;
}
return Outside;
Rectangle & Rectangle
Rectangle: A { V2d inf, sup;}
Rectangle: B { V2d inf, sup;}
if ( A.inf.x > B.sup.x || A.inf.y > B.sup.y
|| A.sup.x < B.inf.x || A.sup.y < B.inf.y )
{
return No Intersection;
}
return Intersectant;