需要确定点列表是否都是VB.net中同一个圆圈的一部分

时间:2013-12-15 01:57:58

标签: vb.net geometry

VB.NET

我的数据来自各种CAD包的导出DXF文件。当导出圆弧(定义为真圆的一部分)时,它有时会导出为一串线段而不是圆弧。

我有一个积分列表,我试图猜测它们是否来自同一个圆圈。基本上我遍历所有点并使用一种方法从三个点找到一个圆的中心点。我的目的是比较生成的所有计算中心点,并确定它们是否彼此接近。

我的第一个想法是,我可以检查中心点是否都相等,但由于四舍五入和基本的估算程序首先产生点(我无法控制) )。

我的第二个是检查圆周点的x和y值的标准偏差,并将其与中心的x,y的标准偏差进行比较,并从中做出一些判断。 VB.net似乎没有本机stdev函数,我有时候有点懒。

是否有人对如何确定点列表是否来自同一个圈子有一个简单的想法?

以下是我的功能:

确定给定三点的圆心:

    Public Function getCenter(p1 As Point2D, p2 As Point2D, p3 As Point2D) As Point2D
        Dim yDelta_a As Double = p2.Y - p1.Y
        Dim xDelta_a As Double = p2.X - p1.X
        Dim yDelta_b As Double = p3.Y - p2.Y
        Dim xDelta_b = p3.X - p2.X
        Dim center As New Point2D
        Dim aSlope As Double = yDelta_a / xDelta_a
        Dim bSlope As Double = yDelta_b / xDelta_b
        center.X = (aSlope * bSlope * (p1.Y - p3.Y) + bSlope * (p1.X + p2.X) - aSlope * (p2.X + p3.X)) / (2 * (bSlope - aSlope))
        center.Y = -1 * (center.X - (p1.X + p2.X) / 2) / aSlope + (p1.Y + p2.Y) / 2

        Return center

    End Function

然后迭代点列表并获得一组中心。 FYI ...这个函数收到了一个包含端点的行列表,所以我做了一些迭代来得到所有正确的点。

    Public Function MakesCircle(lines As List(Of Line))
        Dim points As New List(Of Point2D)
        If lines.Count < 2 Then
            Return False
        Else
            //Get points from lines
            For i As Int16 = 0 To lines.Count - 2
                points.Add(lines(i).StartPoint)
            Next
            points.Add(lines.Last.StartPoint)
        End If

        //"Prime the pump" for the center calculation loop
        Dim centers As New List(Of Point2D)
        Dim a As Point2D = points(0)
        Dim b As Point2D = points(1)
        Dim c As Point2D = points(2)

        //Calc all the centers
        For i As Int16 = 3 To lines.Count - 1
            centers.Add(getCenter(a, b, c))
            a = b
            b = c
            c = points(i)
        Next
        //This is where I need logic to determine if the points all actually belong to the same circle
        Return True
    End Function

2 个答案:

答案 0 :(得分:1)

您可以使用GraphicsPath对象来查找此内容。 - 未经测试 - 我想你可以根据(x,y,w,h)中的数据构造Rectangle Structure,然后这个make-shift算法会为你做。

Private Function areAllPointsInEllipsis(ellipsis As Rectangle, pts() As Point) As Boolean
  Dim result As Boolean 
  Using gp As New System.Drawing.Drawing2D.GraphicsPath
    gp.AddEllipsis(ellispsis)
    result = pts.All(Function(pt) gp.IsVisible(pt))
  End Using
  Return result
End Function

答案 1 :(得分:0)

我所做的是生成从平均中心点到构成圆周的每个点的所有距离。找到最大和最小距离。它们可以使用半径百分比的阈值 - 一种偏心度量。如果最大值和最小值之间的差值低于半径的1%,那么我称之为圆圈。