wang2006zhi 发表于 2024-8-5 17:39:51

BO算法-画线求交填充法

本帖最后由 wang2006zhi 于 2025-2-14 12:17 编辑

/// <summary>
/// 寻找填充边界
/// </summary>

public void Tt5()
{
    using var tr = new DBTrans();
    if (!Env.Editor.GetPoint(out Point3d point,"\n 获取一个点"))
      return;
    var selPtc = point.GetPointCollection(5000);
    if (!Env.Editor.SelEnts(out List<Curve> curs,selPtc))
      return;
    var extens = curs.GetExtents();
    var h = extens.GetHeight();
    var w = extens.GetWidth();
    double n = 100;
    h /= n;
    w /= n;
    var pts = new List<Point3d>();
    HashSet<Point3d> pos = ;
    Queue<Point3d> points = new Queue<Point3d>();
    points.Enqueue(point);
    while (points.Count > 0)
    {
      var p = points.Dequeue();
      var sha = p + new Vector3d(0, h, 0);
      var xia = p + new Vector3d(0, -h, 0);
      var zuo = p + new Vector3d(-w, 0, 0);
      var you = p + new Vector3d(w, 0, 0);
      Addpoint(p, sha);
      Addpoint(p, xia);
      Addpoint(p, zuo);
      Addpoint(p, you);
    }

    var newPts=pts.OrderBy(o => (point - o).AngleOnPlane())
      .ThenBy(x => x.X)
      .ThenBy(y => y.Y).ToList();

    var pl=newPts.MakePolyline();
    pl.ColorIndex = 1;
    pl.ConstantWidth = 5;
    pl.Closed = true;
    tr.CurrentSpace.AddEntity(pl);
   
    bool IsIntersectWith(Curve line)
    {
      return curs.Any(c =>
      {
            var ptC = new Point3dCollection();
            c.IntersectWith(line, Intersect.OnBothOperands, ptC, IntPtr.Zero, IntPtr.Zero);
            if (ptC.Count<=0)
                return false;
            foreach (Point3d o in ptC)
            {
                pts.Add(o);
            }
            return true;
      });
    }
   
    void Addpoint(Point3d p, Point3d p1)
    {
      if (pos.Contains(p1))
            return;
      var line = new Line(p, p1);
      if (!IsIntersectWith(line))
            points.Enqueue(p1);
      pos.Add(p1);
    }
   
}

箭头_Row 发表于 2024-8-6 15:07:07

本帖最后由 箭头_Row 于 2024-8-6 21:48 编辑

https://www.cnblogs.com/JJBox/p/12571436.html

找邊界算法這個帖子里很詳細哦。但下面語句是整個帖子的精華濃縮:

// 到了Acad2011: 就可以通过以下语句获取
Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
ed.TraceBoundary(........);


// 获取Boundary 注意TraceBoundary 中 deleteisland 的设置
   using DBObjectCollection dbo = Env.Editor.TraceBoundary(ppr.Value, false);
   if (dbo.Count != 1)
   {
       Env.Print("\n闭合空间错误,调整后重试!");
       return;
   }
   pline = (Polyline)dbo;
   if (pline.NumberOfVertices == 0)
   {
       Env.Print("\n闭合空间错误,调整后重试!");
       return;
   }

這個自帶的Api又準又快速哦!

你有种再说一遍 发表于 2024-8-6 19:15:13

本帖最后由 你有种再说一遍 于 2024-8-6 19:17 编辑

crtrccrt2024-8-6 06:10
LSP,准确又快速,还能批量
要比批量c#可太幸福了,
编辑器能够提示数据结构的修改,
还能多线程并行,
还能调用SIMD指令集,
还能注重CPU cache line的miss情况

wang2006zhi 发表于 2024-8-7 13:32:28

箭头_Row 发表于 2024-8-6 15:07
https://www.cnblogs.com/JJBox/p/12571436.html

找邊界算法這個帖子里很詳細哦。但下面語句是整個帖子 ...

自带的在非视口和后台无法使用。。所以想办法造一个。。

lelelewfxy 发表于 2024-8-5 18:27:24

太难得的好材料啊

你有种再说一遍 发表于 2024-8-5 18:48:37

怎么不是按照我文章做捏

crtrccrt 发表于 2024-8-6 06:10:59

LSP,准确又快速,还能批量

wang2006zhi 发表于 2024-8-6 12:28:06

你有种再说一遍 发表于 2024-8-5 18:48
怎么不是按照我文章做捏
你那文章看过,逻辑有点复杂,目前我的水平还改写不出来。。。

wang2006zhi 发表于 2024-8-6 12:31:41

crtrccrt 发表于 2024-8-6 06:10
LSP,准确又快速,还能批量

语言不是门槛,逻辑算法是核心。。。

d1742647821 发表于 2024-8-7 22:16:35

论坛是有代码块的,另外有太多你自带的函数了,别人没有一点参考性
页: [1] 2
查看完整版本: BO算法-画线求交填充法