用数学方法算基元碰撞检测 (1)

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 + *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 (CSCS<= 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;  

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值