测试结果:

主要思路:假设有两条曲线分别是c1和c2,把c1按照1的距离划分我这里用变量jd表示,得到一个曲线集合coll,然后遍历coll,得到coll中每一个曲线的两个端点,再用这两个端点分别求离曲线c2的最短距离,直接使用开发库的GetClosestPointTo方法就可以了,直到遍历完整个coll集合就能得到最短距离和其对应的点。

主要代码得到曲线集合coll:

  1. public List<Curve> GetCurves(Curve curve ,double jd)
  2. {
  3. List<Curve> lstCurves = new List<Curve>();
  4.  
  5. double totalLength = curve.GetDistanceAtParameter(curve.EndParam);
  6.  
  7. if (totalLength < jd)
  8. {
  9. lstCurves.Add(curve);
  10. return lstCurves;
  11. }
  12. double addLength = ;
  13.  
  14. Point3dCollection pt3dCol = new Point3dCollection();
  15.  
  16. while (addLength < totalLength)
  17. {
  18. pt3dCol.Add(curve.GetPointAtDist(addLength));
  19. addLength += jd;
  20.  
  21. }
  22. if (addLength != totalLength)
  23. pt3dCol.Add(curve.GetPointAtDist(totalLength));
  24.  
  25. DBObjectCollection dbObjColl= curve.GetSplitCurves(pt3dCol);
  26.  
  27. foreach (var item in dbObjColl)
  28. {
  29. lstCurves.Add((Curve)item);
  30. }
  31.  
  32. dbObjColl.Dispose();
  33.  
  34. return lstCurves;
  35. }

主要代码得到最短距离和最近点:

  1. public Line GetMinLine(Curve curve1,Curve curve2,double jd)
  2. {
  3. List<Curve> lstCurves = GetCurves(curve1, jd);
  4.  
  5. double minVal = double.MaxValue;
  6. Point3d ptMin1 = Point3d.Origin;
  7. Point3d ptMin2 = Point3d.Origin;
  8. foreach (var c in lstCurves)
  9. {
  10. Point3d pt1 = c.StartPoint;
  11. Point3d pt2 = c.EndPoint;
  12.  
  13. var pt11=curve2.GetClosestPointTo(pt1, false);
  14. var pt22= curve2.GetClosestPointTo(pt2, false);
  15.  
  16. var l1 = pt11.DistanceTo(pt1);
  17. var l2 = pt22.DistanceTo(pt2);
  18.  
  19. if (l1 < minVal)
  20. {
  21. minVal = l1;
  22. ptMin1 = pt11;
  23. ptMin2 = pt1;
  24. }
  25. if (l2 < minVal)
  26. {
  27. minVal = l2;
  28. ptMin1 = pt22;
  29. ptMin2 = pt2;
  30. }
  31.  
  32. }
  33. ed.WriteMessage("\n最短距离:" + minVal + "\n");
  34.  
  35. return new Line(ptMin1,ptMin2);
  36. }

关于GetClosestPointTo介绍如下:

AutoCad .Net二次开发求两曲线最小距离的更多相关文章

  1. 利用C#进行AUTOCAD的二次开发

    众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...

  2. AutoCAD.NET二次开发:创建自定义菜单的两种方法比较

    目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblo ...

  3. AutoCAD .NET二次开发(一)

    其他话不多说,直接进入主题,既然是二次开发,当然是用CAD平台已经封装好了很多类,我们需要熟悉和使用它们.常用的AutoCAD .NET API的四个主要DLL文件是: 名称 作用 备注 AcDbMg ...

  4. AutoCAD.NET二次开发:扩展数据之XData

    结果缓存——ResultBuffer 结果缓存即 Autodesk.AutoCAD.DatabaseServices.ResultBuffer 类型,使用 ResultBuffer 对象时需要提供一个 ...

  5. AutoCAD.NET二次开发:创建自定义菜单(AcCui)

    从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单. 下面介绍一下菜单的创建过程: 1.在项目中添加引 ...

  6. AutoCAD C#二次开发

    https://www.cnblogs.com/gisoracle/archive/2012/02/19/2357925.html using System; using System.Collect ...

  7. 【NX二次开发】分析曲线某位置的信息 UF_MODL_ask_curve_props

    分析曲线某位置的信息:点.切线.主副法线.半径等 extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_in ...

  8. AutoCAD .NET二次开发(四)

    在CAD中,属性信息一般是以注记的形式存在,但当属性数据内容较多时,显示就成了问题.扩展属性(Xdata)可以解决这一问题,比如南方Cass中就利用了这一点.我们经常用Lisp来读取操作扩展属性. 查 ...

  9. AutoCAD .NET二次开发(三)

    在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定.要深入理解这个,要学习一下进程与线程.在CAD.NET中,也有Lock与Unlock. 获取一个文档,在进行处 ...

随机推荐

  1. Libevent:9Evbuffers缓存IO的实用功能

    Libevent的evbuffer功能实现了一个字节队列,优化了在队列尾端增加数据,以及从队列前端删除数据的操作. Evbuffer用来实现缓存网络IO中的缓存部分.它们不能用来在条件发生时调度IO或 ...

  2. 在laravel框架中使用ajax请求报错419

    laravel框架中报419 419 unknown status 这个时候你需要将这个接口放到api路由上,这样可以跳过CSRF的检查

  3. ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装

    https://pytorch.org/get-started/locally/ pytorch 主页选择后安装

  4. @hdu - 5503@ EarthCup

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个队伍两两之间比赛,保证没有平局. 现在给出 n 个队伍分别 ...

  5. linux服务器时间更新

    yum install ntpdate ntpdate ntp1.aliyun.com(阿里云服务器时间)

  6. vscode golang vue配置

    { "files.autoSave": "off", "window.title": "${dirty}${activeEdito ...

  7. css3 word-wrap属性

    允许长单词换行到下一行: word-wrap:break-word

  8. Bert源码阅读

    前言 对Google开源出来的bert代码,来阅读下.不纠结于代码组织形式,而只是梳理下其训练集的生成,训练的self-attention和multi-head的具体实现. 训练集的生成 主要实现在c ...

  9. hdu 1289 Hat’s IEEE

    Problem - 1289 好题.其实就是模拟IEEE754的格式,不过要注意的是,这里用的32位是float,用double就不对了. 代码如下: #include <cstdio> ...

  10. 使用提示(Hints)

    对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FRO ...