2D Line Segment & 2D Line Segment
L1: P = P1 + t * V1 t ∈ [0, 1]
L2: P = P2 + s * V2 s ∈ [0, 1]
设L1 = L2
则 P = P1 + t * V1 = P2 + s * V2
t * V1 – s * V2 = P2 – P1
t * V1.x – s * V2.x = P12.x
t * V1.y – s * V2.y = P12.y
A = | V1.x V2.x |
| V1.y V2.y |
if (A == 0) return Parallel Or SuperPosition;
B = | P12.x V2.x |
| P12.y V2.y |
t = B / A
if ( t < 0 || t > 1 ) return No Intersection;
C = | V1.x P12.x |
| V1.y P12.y |
s = C / A
if ( s < 0 || s > 1 ) return No Intersection;
P = P1 + t * V1
return Intersectant;
Sphere & Sphere, Static
Sphere1 : | P – C1 | <= R1
Sphere2 : | P – C2 | <= R2
| C1 – C2 | <= R1 + R2
| C12 |^2 <= (R1 + R2)^2
if ( C12•C12 <= (R1 + R2)^2 ) return Intersectant;
return No Intersection;
Sphere & Sphere, Dynamic
Sphere1: | P – C1 | <= R1
Sphere2: | P – C2 | <= R2
Delta1 : C = C1 + t *V1
Delta2: C = C2 + t * V2 t ∈ [0, 1]
| C1 + t * V1 – C2 - t * V2| <= R1 + R2
| t * (V1 - V2) + C1 - C2| <= R1 + R2
| t * V12 + C12 | <= R1 + R2
if ( V12^2 > 0 )
{
V12^2 * t^2 + 2 * (V12•C12) * t + C12^2–(R1+R2)^2 = 0
Δ= (V12•C12)^2 –V12^2 * (C12^2–(R1+R2)^2);
if ( Δ < 0 ) return No Intersection;
t = ( -V12•C12 ± sqrt(Δ) ) /V12^2;
t1 <= t2;
if ( t2 < 0 || t1 > 1 ) return No Intersection;
return Intersectant;
}
if ( C12•C12 <= (R1 + R2)^2 ) return Intersectant;
return No Intersection;
LineSegment & Sphere
Line : P = S + t * V t ∈ [0, 1]
Sphere: | P – C | <= R
|S + t * V – C | = R
| (S–C) + t * V | = R
| CS + t * V | = R
if ( V^2 > 0 )
{
V^2 * t^2 + 2 * V•CS * t + CS^2–R^2 = 0
Δ= (V•CS)^2 - V^2 * (CS^2–R^2);
if ( Δ < 0 ) return No Intersection;
t = ( -V•CS ± sqrt(Δ) / V^2;
t1 <= t2;
if ( t2 < 0 || t1 > 1 ) return No Intersection;
return Intersectant;
}
if (CS• CS<= R^2 ) return Intersectant;
return No Intersection;
LineSegment & Triangle
Line : P = S + t * V t ∈ [0, 1]
Triangle: P = P0 + u * (P1 – P0) + v * (P2 – P0) (0<=u<=1), (0<=v<=1), (0<=u+v<=1)
S + t * V = P0 + u * (P1 – P0) + v * (P2 – P0)
t * V – u * (P1 – P0) – v * (P2 – P0) = P0 - S
t * V – u * P01 – v * P02 = SP0
{ t * V.x – u * P01.x – v * P02.x = SP0.x
{ t * V.y – u * P01.y – v * P02.y = SP0.y
{ t * V.z – u * P01.z – v * P02.z = SP0.z
A = |V.x –P01.x –P02.x|
|V.y –P01.y –P02.y|
|V.z –P01.z –P02.z|
if (A == 0) return Parallel Or SuperPosition;
B = |SP0.x –P01.x –P02.x|
|SP0.y –P01.y –P02.y|
|SP0.z –P01.z –P02.z|
t = B / A
if ( t < 0 || t > 1 ) return No Intersection;
C = |V.x SP0.x –P02.x|
|V.y SP0.y –P02.y|
|V.z SP0.z –P02.z|
u = C / A
if ( u < 0 || u > 1 ) return No Intersection;
D = |V.x –P01.x SP0.x|
|V.y –P01.y SP0.y|
|V.z –P01.z SP0.z|
v = D / A
if ( v < 0 || v > 1 ) return No Intersection;
if ( (u+v) < 0 || (u+v) > 1 ) return No Intersection;
P = S + t * V
return Intersectant;
2D Point In 2D Convex Polygon
Point: P
Convex: P0, P1, P2…Pn-1, (n>=3, CounterClockWise)
for( i = 0; i < n; i++ )
{
Ei = P(i+1)%n – Pi;
Ni.x = Ei.y; //Ei Rotate π/2 ClockWise
Ni.y = -Ei.x;
Vi = P – Pi
if ( Vi•Ni > 0 )
{
return OuterSide;
}
}
return Inside;