指向圆圈段

时间:2014-11-29 17:14:30

标签: algorithm math

我有一个圆圈,我希望将其划分为多个由X和Y坐标定义的线段。如何测试点(X,Y)是否在特定的段中?

最好使用代码示例。

4 个答案:

答案 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;通过割线或和弦从圆圈的其余部分开始。

以下是细分:

enter image description here

答案 3 :(得分:-1)

  1. 如果x&amp; y不是已经相对于圆心,减去圆心的坐标:

    x -= circle.x
    y -= circle.y
    
  2. 使用atan2获取关于圆的原点的点的角度:

    angle = atan2(y, x)
    
  3. 对于x轴以下的点,此角度为负,因此调整为始终为正:

    if (angle < 0) angle += 2 * pi
    
  4. 假设您的细分具有相等的间距,请使用此公式获取细分的索引:

    segment = floor((angle * numSegments) / (2 * pi))
    
  5. 如果您发现结果是指您想要的圆圈另一侧的片段,则可能必须在开头y = -y或最后一个segment = (numSegments - 1) - segment进行翻转它以正确的方式进行,但基本上应该有效。