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 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:17 编辑
crtrccrt2024-8-6 06:10
LSP,准确又快速,还能批量
要比批量c#可太幸福了,
编辑器能够提示数据结构的修改,
还能多线程并行,
还能调用SIMD指令集,
还能注重CPU cache line的miss情况
箭头_Row 发表于 2024-8-6 15:07
https://www.cnblogs.com/JJBox/p/12571436.html
找邊界算法這個帖子里很詳細哦。但下面語句是整個帖子 ...
自带的在非视口和后台无法使用。。所以想办法造一个。。 太难得的好材料啊 怎么不是按照我文章做捏 LSP,准确又快速,还能批量 你有种再说一遍 发表于 2024-8-5 18:48
怎么不是按照我文章做捏
你那文章看过,逻辑有点复杂,目前我的水平还改写不出来。。。 crtrccrt 发表于 2024-8-6 06:10
LSP,准确又快速,还能批量
语言不是门槛,逻辑算法是核心。。。 论坛是有代码块的,另外有太多你自带的函数了,别人没有一点参考性
页:
[1]
2