首页 > 其他分享 >Occ求点到直线的距离

Occ求点到直线的距离

时间:2024-04-19 11:35:01浏览次数:28  
标签:直线 const overrightarrow gp Occ Mydist Standard 求点

计算一个点到2d基本曲线的距离使用这个类Extrema_ExtPElC2d。距离可以是最小或者最大。

Extrema是极值的意思,P是point点,ELC是elementary curve基本曲线。

 

点到直线的距离

假设一个点 Y 和一条直线 L

 

 

 

直线 L 的参数形式为

$ X(t) = P + t\overrightarrow{d}  $  // 式1

 

1. 先求点在直线上的投影点  X(t);

2. 再求点 Y 到 X(t) 的距离,即可求得点到直线的距离;

3. 要求 X(t) 就是要求参数 t

 

向量 Y - X(t) 必然垂直于直线方向,因此

$ 0 = \overrightarrow{d} \cdot (Y - X(t)) $ // 式2

式1带入到式2

$ 0 = \overrightarrow{d} \cdot (Y - P - t\overrightarrow{d} ) =\overrightarrow{d} \cdot (Y - P) - t\left \| \overrightarrow{d}  \right \| ^{2}   $

变换之后可得

$ t = \frac{\overrightarrow{d}\cdot (Y - P) }{\left \| \overrightarrow{d}  \right \| ^{2} }   $

Y ,P 都是已知点,直线方向向量 d 也是已知,即可求得 t,从而求得点 Y 在直线上的投影,从而求得点 Y 到直线的距离。

 

下面来看一下 Occ 的实现 

 

void Extrema_ExtPElC2d::Perform(const gp_Pnt2d&     P, 
  const gp_Lin2d&     L,
  const Standard_Real Tol,
  const Standard_Real Uinf, 
  const Standard_Real Usup)
{
  myDone = Standard_True;
  gp_Pnt2d OR, MyP;
  myNbExt = 0;

  gp_Vec2d V1 = gp_Vec2d(L.Direction());
  OR = L.Location();
  gp_Vec2d V(OR, P);
  Standard_Real Mydist = V1.Dot(V);
  if ((Mydist >= Uinf -Tol) && 
    (Mydist <= Usup+ Tol)){ 
      myNbExt = 1;
      MyP = OR.Translated(Mydist*V1);
      Extrema_POnCurv2d MyPOnCurve(Mydist, MyP);
      mySqDist[0] = P.SquareDistance(MyP);
      myPoint[0] = MyPOnCurve;
      myIsMin[0] = Standard_True;
  }
}

V1 是直线的方向向量,就是上面推导过程的 直线 d 方向;

OR 是直线的参数 t = 0 的点,V 是 OR 往 P点的向量,就是上面推导出来的 (Y - P);

由于 V1 在这里是个单位向量,因此分母部分就是1,那么Mydist 就是上面推导过程的 t;

这里有一个步骤是要判断 Mydist 必须在 两个参数Uinf, Usup之间,才能有结果。

MyP 就是 Or 沿着 V1 方向移动 Mydist 参数长度,即为 P 在 直线 L 上的投影点。

 

需要特别注意:这个算法只有当 P 的投影点在 L 的参数范围内,才有结果。

标签:直线,const,overrightarrow,gp,Occ,Mydist,Standard,求点
From: https://www.cnblogs.com/yao2yaoblog/p/18144075

相关文章

  • json反序列化 JsonConvert.DeserializeObject 报错 One or more errors occurred. (U
    接口返回的字符串肉眼看起来正常,也是标准json,反序列化时候报错,字符串添加了UTF8-BOM头(windows记事本默认编码),可以通过以下代码移除标头//模拟json字符串对象varjsonStr="{}";byte[]buffer=Encoding.UTF8.GetBytes(jsonStr);varsResult=Encoding.UTF8.GetString......
  • 根据经纬度判断直线距离
    /***根据门店距离排序*@param$data*@paramstring$longitude经度*@paramstring$latitude纬度*@returnarray*/publicfunctionsortByDistance($longitude,$latitude){//根据距离排序$list=Db::table('benben_store_shop')->where('status',1)-......
  • 关于规则制度的思考 - Inspired by soccer match
    Beforeyouread现在您看到的这篇文章,以防您不知道,是我的个人博客,一个大网站的独立分枝,从其他地方无法点进来。不同于微博、知乎,该站不是拥有多个客户端推广的社交媒体。如果我没有给您分享链接,您是几乎不可能找到这个网页的。全文仅记录个人想法,没有任何哗众取宠、散播污名。......
  • PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)
    此处特别感谢小昌做出的贡献!PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)-卡核(caxkernel.com) 1.平移效果图:fromOCC.Core.BRepPrimAPIimportBRepPrimAPI_MakeConefromOCC.Core.TopLocimportTopLoc_LocationfromOCC.Core.TopoDSimportTopoDS_Shapefr......
  • 混辗式混砂机 变速箱 旋耕灭茬机 污水处理 150T液压机 污水处理厂 饺子机 农村生活污
    UHT管式杀菌机说明书混辗式混砂机机械结构设计 论文CAD图纸开题报告毕业设计之专用机床图纸毕业设计推钢机液压图纸毕业设计3吨叉车3进3退变速箱(毕业设计)1G-160型旋耕灭茬机中央传动装置设计(共17张CAD加说明书与侧边传动装置配套污水处理课程设计图集150T液压机设计【10......
  • 洛谷题单指南-数学基础问题-P2789 直线交点数
    原题链接:https://www.luogu.com.cn/problem/P2789题意解读:n条直线可以形成不同交点数的方案数。解题思路:对于n=1、2、3、4的情况进行模拟:n=1时,有1种不同的交点数n=2时,有2种不同的交点数n=3时,有3种不同的交点数n=4时,有5种不同的交点数对n=4的情况,分情况讨......
  • OccNet 栅格占据网络:重建智能驾驶场景表征
    随着高阶智能驾驶的发展,长尾障碍物感知成为智驾发力的关键点。驾驶场景中常见的行人、车、障碍物,能够通过3D物体检测等方式实现其位置、大小的估计。而现实世界城区的交通路况中,还存在海量长尾场景问题:如异形车辆、路上的石子、掉落的树叶等障碍物,以3D检测框、点云等传统表......
  • 【爬虫】debug篇-关于fake_useragent无法使用:Error occurred during loading data. Tr
    Erroroccurredduringloadingdata.Tryingtousecacheserverhttps://fake-useragent.herokuapp.com/browsers/0.1.11Traceback(mostrecentcalllast):File"D:\python\lib\site-packages\fake_useragent\utils.py",line154,inloadfori......
  • 蓝桥杯2021年第十三届省赛真题-直线
    一、题目【问题描述】    在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。    给定平面上2×3个整点{(x,y)|0≤x<2,0≤y<3,x∈Z,y∈Z},即横坐标是0到1(包含0和1)之......
  • 自动驾驶量产车中,为何BEV和Occupancy如此重要?
    自动驾驶领域中,什么是BEV?什么是Occupancy?BEV是Bird'sEyeView的缩写,意为鸟瞰视图。在自动驾驶领域,BEV是指从车辆上方俯瞰的场景视图。BEV图像可以提供车辆周围环境的完整视图,包括车辆前方、后方、两侧和顶部。BEV图像可以通过多种方式生成,包括:使用激光雷达:激光雷达可......