处理CAD绘图中的不精确绘图

时间:2011-01-12 07:50:10

标签: c# c++ algorithm drawing cad

我有一个CAD应用程序,允许用户绘制线条和多边形以及所有这些。

我面临的一个棘手的问题是用户绘图可能非常不精确,例如,用户可能想要绘制两个相互连接的矩形。因此,应该有两条矩形共享一条线。但是,用户很容易,而不是绘制一条线,绘制彼此非常接近的两条线,彼此接近,从屏幕上看,你会被误认为是是相同的一行,只是当你放大一点时它们不是。

我的应用程序需要用户正确绘制线条(或者我的预处理必须能够进行自动校正),否则我的内部算法(让我们称之为算法)将无法正确处理输入。

解决此类问题的最佳策略是什么?我正在考虑将点坐标四舍五入到一定程度的精度,但是虽然我不能确切地指出这种方法的问题,但我感觉这不是正确的做事方式,这将引入一系列新问题。

编辑:为了争论,捕捉不是一个可用的选项。就此而言,各种“输入方”指导都不可用。必须通过对我的代码进行预处理来完成更正,当绘图完成时,但就在我将其提交给我的算法之前。

疯狂的限制,你说。但是用户可以在我的应用程序中构建输入,或者他们可以在其他CAD软件中构建输入,然后提交到我的引擎进行计算。我无法控制他们在其他CAD软件中的输入方式。

编辑2:我可以让用户指定要发生的“簇半径”,但重要的是,我需要确保我的预处理算法是一致的,并且不会真正引入新的集合问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

对齐点。用户应该能够捕捉到终点(以及更多),然后,当您检测到捕捉时,只需将用户点击的点更改为捕捉点。检查AutoCAD,功能行End,Middle等。

编辑:如果您想要离线捕捉,那么您只需检查每对点是否彼此靠近。问题是这在NP问题中所以需要花费很多时间,因为你不能真正得到O(n ^ 2)时间复杂度。您需要的此算法应该在“群集”下。

EDIT2:我认为您不应该认为输入数据不好。但是如果你真的想要这样做,那么简单的方法是取每个点,检查用户是否有其他点定义了半径,如果是,则找到应该合并为一个点的整个组,找到平均坐标点并指向所有点他们到那一点。但请记住 - 大多数设计师都知道什么是捕捉点,如果他们不使用它们,他们就有了有效的想法。

答案 1 :(得分:2)

我的基本问题在我看来(我希望我理解正确),以确定两条线是否相同"相同"线。

根据我自己的经验,你的感觉是正确的,在输入中对坐标进行四舍五入可能不是一个好主意。

也许你应该保留输入中的坐标,但是实现你的功能让我们将它命名为IsSameLine你在" 算法" (如果我理解你的描述正确,谁将确定两个矩形是否连接)。

IsSameLine可以考虑某个(可能是可配置的)屏幕分辨率,将输入线的端点从源坐标转换为屏幕坐标,并检查它们在屏幕坐标中是否相同。

即。让我们假设您有一个输入文件,其中包含以下范围(lowerleft)(upperRight)((10,10),(24,53))。问题是如果在"缩放到范围"中绘制点(11,15)和(11.1,15.1)会有多远。 1600x1200像素的屏幕上的水平。因此,您可以确定从源坐标到"屏幕坐标的转换"。然后如上所述在IsSameLine中使用此转换。

我不确定这对你来说实际上是一个很好的解决方案。

另一种(可能更好?)可能性是如果两条线的点相距最大ε距离,则实现IsSameLine返回true。 epsilon可以有一个基于输入矢量数据范围计算的默认值,并且可能为用户提供为其提供另一个值的可能性。

答案 2 :(得分:2)

我看到的一个问题是你的聚类/捕捉算法必须自己决定哪个点移动到哪个点上。

在实时输入中,捕捉很简单:第一个点保持不变,第二个点捕捉到第一个点。如果在离线模式下你会得到一堆你知道应该被拼接在一起的点,你不知道结果点应该在哪里。计算平均值,可能会产生一个全新的点?从所有候选人中选择最重要的中心点?随机挑一个?尝试将您的点与x / y / z轴上的其他点对齐吗?

如果您的程序允许任何用户交互,您可以检测可能是合并候选者的点群集,并向用户显示不同的合并目标点以供选择。
否则,你可以使这种行为可配置:取一个合并半径(“如果两个或多个poins在n个单位之内......”)和合并算法(“...将它们合并到最中心的给出“)作为参数的点,并从配置文件中读取它们。