flenoir 发表于 2018-3-30 10:14:44

从一个点找到最近的物体

我正在寻找一个解决方案,从一个点找到最近的对象(大多数情况下是折线)。
有什么想法吗?
**** Hidden Message *****

gile 发表于 2018-3-30 10:58:28

嗨,
这里有一个,可能不是最有效的,但你可以从中获得灵感

公共void FindNearestCurve()
{
var doc=Application.DocumentManager.MdiActiveDocument
var db=doc.Database
var-ed=doc.Editor
var-ppr=ed.GetPoint(“\n点击一个点:”)
如果(ppr.Status!=PromptStatus.OK)
返回
var pt=ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem)
var-curveClass=RXObject.GetClass(typeof(Curve))
ObjectId closestId=ObjectId.Null
使用(var tr=new OpenCloseTransaction())
{
var-space=(BlockTableRecord)tr.GetObject(db.CurrentSpaceId,OpenMode.ForRead)
double dist=double.MaxValue
foreach(空间中的ObjectId)
{
如果(id.ObjectClass.IsDerivedFrom(curveClass))
{
var曲线=(曲线)tr。GetObject(id,OpenMode.ForRead)
双d=曲线。GetClosestPointTo(pt,false)。DistanceTo(pt)
如果(d
{
closestId=id
dist=d
}
}
}
}
如果(!closestId.IsNull)
{
ed.SetImpliedSelection(新[]{closestId})
}
}

jmaeding 发表于 2018-4-6 17:31:00

请注意,距离测试非常昂贵
如此昂贵,以至于当您在循环中处理数千件事情时,必须剔除不属于候选项的项目
如果“最接近”是指在任何方向上,则可以使用边界框进行此操作
如果你的意思是像Civil一样最接近的“垂直偏移”,你必须对每一个都进行昂贵的测试,没有捷径。

BIGAL 发表于 2018-4-6 21:06:20

首先,我不在.Net中写。也许用户使用交叉窗口而不是随机搜索可以使用grread绘制一个圆圈来限制正在搜索的对象。踏入圆圈是另一种方式,再次限制外部。如果是pline vertice类型的请求,则可以使用偏移量继续搜索对象,但同样,这是一项有点慢的任务。

dgorsman 发表于 2018-4-9 09:52:13

更好地定义“对象”和“最近的”,例如,如果它是一条多段线,如何测量-最近的顶点?沿着它的长度有点吗?块参照呢?这是插入点吗?它的子几何体上的一个点?
页: [1]
查看完整版本: 从一个点找到最近的物体