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

 

Point In Cylinder

Point  :   P

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

Structure: { V3d   O;

            float R;

            V3d  N;

            FloatL;  }

                  

           V = P – O;

           dp = V • N;

           if ( dp < 0 || dp > L )     return Outside;

 

           T = V –dp * N;

 

           if ( T^2 > R^2 )            return Outside;

 

           return Inside;

 

Point In Cone

Point  :   P

Cone   :   |(P – O) – ((P – O) • N) * N| <= ((P – O) • N) * R / L

  0 <= (P – O)• N <= L

 

   The Data Structure of Cone is same as Cylinder.

                        

           V = P – O;

           dp = V • N;

           if ( dp < 0 || dp > L )     return Outside;

 

           T = V –dp * N;

 

           r = dp * R / L

          

           if ( T^2 > r^2 )            return Outside;

 

           return Inside;

 

 

Sphere & Cylinder

Sphere :   | P – C | <= r

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

  OC = C – O;

           dp = OC • N

 

           if ( (dp > L + r) || (dp < -r) )      return No Intersection;

 

           T = OC - dp * N;

 if ( dp > L )

 {

f = sqrt( r^2 – (dp - L)^2 );

if ( T^2 > (R + f)^2 )             return No Intersection;

 

   return Intersectant;

 }

 else if ( dp >= 0 )

 {

if ( T^2 > (R + r)^2 )             return No Intersection;

 

   return Intersectant;

 }

 else

 {

f = sqrt( r^2 – dp^2 );

if ( T^2 > (R + f)^2 )             return No Intersection;

 

   return Intersectant;

 }

 

 

 

Line Segment & Cylinder

Line Seg:  P = P0 + t * V      t ∈ [0, 1]

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

 OP = P – O = P0 + t * V – O = (P0 – O) + t * V;

           dp = OP • N

           

           dp0 = (P0 – O)• N         t = 0

           if ( dp0 > L )     return No Intersection;

 

           dp1 = (P0 – O + V)• N     t = 1

           if ( dp1 < 0 )     return No Intersection;

 

|(P0 – O) + t * V – (((P0 – O) + t * V) • N) * N | <= R

|(P0 – O) + t * V – ((P0 – O) • N) * N – ((t * V) • N) * N | <= R

|(P0 – O) – ((P0 – O) • N) * N + t * V - t * (V • N) * N | <= R

|((P0 – O) – ((P0 – O) • N) * N) + t * (V - (V • N) * N) | <= R

 

F = (P0 – O) – ((P0 – O) • N) * N;

G = V - (V • N) * N;

 

G^2 * t^2 + 2 * (F • G) * t + F^2 – R^2 = 0;

A = G^2;

B = 2 * (F • G);

C = F^2 – R^2;

 

if ( A > 0 )   //V is not parallel to N

{

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

在计机视觉领域,基元(Primitives)通常指的是图像中的基本形状或特征,例如边缘、角点、线条等。OpenCV(Open Source Computer Vision Library)是一个开源的计机视觉和机器学习软件库,它提供了大量的法和函数来处理图像和视频数据。使用OpenCV进行基元检测,可以借助库中提供的各种检测器和滤波器来实现。 下面是一些常用的基元检测方法和它们在OpenCV中的使用: 1. 边缘检测:边缘是图像中亮度变化最明显的地方,常用的方法有Canny边缘检测器。在OpenCV中,可以使用`cv2.Canny()`函数实现。 2. 角点检测:角点是指两条边缘相遇形成的点,具有较强的特征信息。OpenCV提供了如Harris角点检测器(`cv2.cornerHarris()`)和Shi-Tomasi角点检测器(`cv2.goodFeaturesToTrack()`)。 3. 线条检测:线条检测可以使用霍夫变换(Hough Transform)。在OpenCV中,可以使用`cv2.HoughLines()`和`cv2.HoughLinesP()`函数分别检测直线和线段。 4. 圆检测:圆的检测可以使用霍夫变换的圆检测版本,通过`cv2.HoughCircles()`函数实现。 以下是一个使用OpenCV进行边缘检测的简单示例代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 使用高斯模糊滤波降噪 blurred = cv2.GaussianBlur(image, (5,5), 0) # 应用Canny边缘检测 edges = cv2.Canny(blurred, 50, 150) # 显示原图和边缘检测后的图像 cv2.imshow('Original Image', image) cv2.imshow('Canny Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值