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

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 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;

 

 

Point In OBB

   See 3D Point In Convex Polyhedron when n = 6

 

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;

 

2DLine Segment & Ellipse

Line Seg:  P = P0 + t * V      t ∈ [0, 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 * (P0.x – x0)^2 + a^2 * (P0.y – y0)^2 – a^2 * b^2;

  

 

if ( A > 0 )

{

            Δ= B^2 – 4AC;

               if ( Δ < 0 )            return No Intersection;

 

            t = (-B ± sqrt(B^2 – 4AC)) / 2A;  

 

            t1 <= t2;

 

            if ( t2 < 0 || t1 > 1 ) return No Intersection;

 

            return Intersectant;

       }

 

if ( C <= 0 )                 return Intersectant;

 

return No Intersection;

 

Line Segment & Ellipsoid

Line Seg : P = P0 + t * V      t ∈ [0, 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

           

  ……

if ( A > 0 )

{

    Δ= B^2 – 4AC;   

              if ( Δ < 0 )            return No Intersection;

 

    t = (-B ± sqrt(B^2 – 4AC)) / 2A;  

 

           t1 <= t2;

 

           if ( t2 < 0 || t1 > 1 )  return No Intersection;

 

           return Intersectant;

       }

 

if ( C <= 0 )                 return Intersectant;

 

return No Intersection;

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值