gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:24:05 27 4
gpt4 key购买 nike

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

然后迭代点列表并获取中心集合。仅供引用...这个函数收到了一个线列表,这些线的端点是点,因此我进行了一些迭代以获得所有正确的点。

    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

最佳答案

您可以使用 GraphicsPath 对象来找出这一点。 -未测试-我认为您将能够根据传入的数据 (x,y,w,h) 构造一个矩形结构,那么这个临时算法就可以为您服务。

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

关于vb.net - 需要确定 VB.net 中的点列表是否都是同一个圆的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com