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
答案 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%,那么我称之为圆圈。