我有一个圆圈,我希望将其划分为多个由X和Y坐标定义的线段。如何测试点(X,Y)是否在特定的段中?
最好使用代码示例。
答案 0 :(得分:1)
你不需要使用三角法(一般情况下,应尽可能避免使用三角法......这会导致太多的精度,域和角落问题)。
要确定点P是否是另一个点A的逆时针(在通过原点然后通过A的有向线的左侧定义的半平面的意义上),您可以检查Ax*Py - Ay*Px
结果的符号。这通常称为“垂直点积”,与3D叉积的Z坐标相同。
如果有两个点A和B(其中B定义CCW最大程度)定义扇区,并且扇区小于圆的一半,则任何B的A和CW的CCW都可归类为在那个部门。
只留下一个超过圆圈一半的扇区。显然,给定的一组点最多只能定义一个这样的扇区。你可以用角度二分法做一些聪明的事情,但最简单的方法可能只是将点分类为该部门,如果你不能将它们归类为任何其他部门。
哦,忘记提及 - 确定点数的顺序,以便将它们与扇区配对。不要违背我之前的建议,但最简单的方法就是按照atan2
(不是atan
......从不使用atan
)对它们进行排序。
答案 1 :(得分:0)
使用圆心位于中心的polar coordinate system,检查角度坐标(维基百科文章中的φ)。
您对φ的确切方式取决于细分的定义方式。例如,如果您有n
个相等的段,从0弧度开始,floor(φ * n / (2 * π))
将为您提供段号。
答案 2 :(得分:0)
您的线段由圆圈和线条之间的两个交叉点定义。你只需要知道:
<强>备注强>
在几何体中,圆形线段(符号:⌓)是圆的区域 这是&#34;切断&#34;通过割线或和弦从圆圈的其余部分开始。
以下是细分:
答案 3 :(得分:-1)
如果x&amp; y不是已经相对于圆心,减去圆心的坐标:
x -= circle.x
y -= circle.y
使用atan2
获取关于圆的原点的点的角度:
angle = atan2(y, x)
对于x轴以下的点,此角度为负,因此调整为始终为正:
if (angle < 0) angle += 2 * pi
假设您的细分具有相等的间距,请使用此公式获取细分的索引:
segment = floor((angle * numSegments) / (2 * pi))
如果您发现结果是指您想要的圆圈另一侧的片段,则可能必须在开头y = -y
或最后一个segment = (numSegments - 1) - segment
进行翻转它以正确的方式进行,但基本上应该有效。