双值比较与 DXF 绘图中“点”相等性的容差

问题描述

我有一个简单的算法有时会失败,因为它比较双打。我查看 DXF 绘图并获取所有线段,并将其分解为一系列点。当循环遍历所有点以识别它是否形成一个循环时(即,如果一条线接触,我应该在一个点上得到 2 次点击)并检查输出它们是否接近。所以有时这个算法和带有 delta 比较方法的 equals 会通过,然后有时会失败......

那么一个点应该有多近才能将其视为相同点或重叠?

这些应该是一样的,但是我认为四舍五入会发生,并且数字会根据我设置的容差略有调整,使其有时相等有时不相等..

点:[4.6408,14.8708] 点:[4.6799,14.8156]

即使它是一个 DXF 文件,它似乎并不精确或以某种方式设置以获得相同的值,但它们非常近似和细粒度,所以我什至不确定 DXF 文件本身是如何工作的,因为当您使用时一个绘图程序,你可以制作一个不同的线实体,这些实体实际上相互接触,用户界面将这些线对齐在一起……所以我应该只将它与小数点后一位进行比较吗?没有小数位?

我想问题是这些图纸是由各种不同的程序以各种不同的方式制作的,也许 DXF 文件格式还有其他东西我可以检查以识别这一点?现在我是这样做的,而且看起来“有问题”。

有什么想法或建议吗?我确实有一个比较/等于的方法,它需要一个容忍度,我应该让它变得很紧吗?

谢谢,

解决方法

我知道这是 VBA,但我只是想传达所涉及的原则

["\"opera\"","\"admatic\""]

C# 的代码会有所不同。在上面的 Private Function ComparePoints(ptPoint() As Double,ptVariant As Variant,Optional ByVal dElevation As Double = 0#) As Boolean ComparePoints = False If (UBound(ptVariant) = 1) Then If (ptPoint(0) = Round(ptVariant(0),3) And _ ptPoint(1) = Round(ptVariant(1),3) And _ ptPoint(2) = Round(dElevation,3)) Then ComparePoints = True End If Else If (ptPoint(0) = Round(ptVariant(0),3) _ And ptPoint(1) = Round(ptVariant(1),3) _ And ptPoint(2) = Round(ptVariant(2),3)) Then ComparePoints = True End If End If End Function Public Function Round(ByVal dValue As Double,ByVal iPrec As Integer) As Double Dim strText As String Dim strNumber As String Dim strFormatString As String If (iPrec <= 0) Then strFormatString = "0" Else strFormatString = "0." & String$(iPrec,"0") End If strText = CStr(dValue) strNumber = Format$(strText,strFormatString) Round = CDbl(strNumber) End Function 是为测试而设计的:

  • 一个3D 坐标与另一个3D 坐标
  • 3D 坐标相对于 2D 坐标(带高程)

后者在使用 ComparePoints 元素时适用。

请注意,以上假设所有坐标都在世界坐标系中,以便进行比较。坐标变换是另一个问题。