找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1261|回复: 2

[分享] Triangle.NET

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2021-6-29 16:17:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一个开源的高效 三角网 库 https://github.com/garykac/triangle.net

一个简单测试,没有使用 USE_Z 生成凸包 和 测试拾取点所在的三角形

  1.         [CommandMethod("tt")]
  2.         public void CmdTinTriangle()
  3.         {
  4.             var doc = Application.DocumentManager.MdiActiveDocument;
  5.             var ed = doc.Editor;
  6.             var filter = new SelectionFilter(new[] { new TypedValue(0, "POINT") });
  7.             var pso = new PromptSelectionOptions() { MessageForAdding = "\nselect points: " };
  8.             var psr = ed.GetSelection(pso, filter);
  9.             if (psr.Status != PromptStatus.OK) return;
  10.             using (var tr = doc.Database.TransactionManager.StartTransaction())
  11.             {
  12.                 try
  13.                 {
  14.                     var polygon = new TriangleNet.Geometry.Polygon();
  15.                     foreach (ObjectId id in psr.Value.GetObjectIds())
  16.                     {
  17.                         var pnt = (DBPoint)tr.GetObject(id, OpenMode.ForRead);
  18.                         polygon.Add(new TriangleNet.Geometry.Vertex(pnt.Position.X, pnt.Position.Y));
  19.                     }

  20.                     var options = new ConstraintOptions { Convex = true };
  21.                     var mesh = (TriangleNet.Mesh)polygon.Triangulate(options);


  22.                     var btr = (BlockTableRecord)tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite);
  23.                     var pts = new List<Point2d>();
  24.                     foreach (var sg in mesh.Segments)
  25.                     {
  26.                         if (sg.Label != 1) continue;

  27.                         var v1 = mesh.Vertices.First(t => t.ID == sg.P0);
  28.                         pts.Add(new Point2d(v1.X, v1.Y));

  29.                     }

  30.                     var pline = new Polyline();
  31.                     for (int i = 0; i < pts.Count; i++)
  32.                     {
  33.                         pline.AddVertexAt(i,pts[i], 0.0, 0.0, 0.0);
  34.                     }
  35.                     pline.Closed = true;

  36.                     btr.AppendEntity(pline);
  37.                     tr.AddNewlyCreatedDBObject(pline, true);

  38.                     var ppr = doc.Editor.GetPoint("\ntest point: ");
  39.                     if (ppr.Status == PromptStatus.OK)
  40.                     {
  41.                         var qs = new TriangleNet.Tools.TriangleQuadTree(mesh);

  42.                         var tri =(Triangle) qs.Query(ppr.Value.X, ppr.Value.Y);

  43.                         var pnts = mesh.Vertices;
  44.                         var p1 = pnts.First(t => t.ID == tri.GetVertexID(0));
  45.                         var p2 = pnts.First(t => t.ID == tri.GetVertexID(1));
  46.                         var p3 = pnts.First(t => t.ID == tri.GetVertexID(2));

  47.                         Addpline(tr, btr,
  48.                             new List<Point2d>()
  49.                                 {new Point2d(p1.X, p1.Y), new Point2d(p2.X, p2.Y), new Point2d(p3.X, p3.Y)});

  50.                     }

  51.                     tr.Commit();
  52.                 }
  53.                 catch
  54.                 {
  55.                     tr.Abort();
  56.                 }
  57.             }
  58.         }

  59.         private void Addpline(Transaction tr, BlockTableRecord btr, List<Point2d> pts)
  60.         {
  61.             var pline = new Polyline();
  62.             for (var i = 0; i < pts.Count; i++)
  63.             {
  64.                 pline.AddVertexAt(i, pts[i], 0.0, 0.0, 0.0);
  65.             }
  66.             pline.Closed = true;

  67.             btr.AppendEntity(pline);
  68.             tr.AddNewlyCreatedDBObject(pline, true);
  69.         }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-11-3 09:00:06 | 显示全部楼层
三角函数库
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 20:23 , Processed in 0.171761 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表