Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 圆段中的点_Algorithm_Math - Fatal编程技术网

Algorithm 圆段中的点

Algorithm 圆段中的点,algorithm,math,Algorithm,Math,我有一个圆,我想分成若干段,所有的段都由X和Y坐标定义。如何测试一个点(X,Y)是否在一个特定的段中 最好是一个代码示例。使用圆心,检查角度坐标(维基百科文章中的φ) φ的具体用途取决于线段的定义方式。例如,如果您有从0弧度开始的n相等的线段,floor(φ*n/(2*π))将为您提供线段编号。您不需要为此使用三角法(通常,应尽可能避免使用三角法……这会导致太多精度、域和转角问题) 要确定点p是否为另一点a的逆时针方向(即位于通过原点然后通过a的有向线的左侧所定义的半平面内),可以检查Ax*Py

我有一个圆,我想分成若干段,所有的段都由X和Y坐标定义。如何测试一个点(X,Y)是否在一个特定的段中

最好是一个代码示例。

使用圆心,检查角度坐标(维基百科文章中的φ)


φ的具体用途取决于线段的定义方式。例如,如果您有从0弧度开始的
n
相等的线段,
floor(φ*n/(2*π))
将为您提供线段编号。

您不需要为此使用三角法(通常,应尽可能避免使用三角法……这会导致太多精度、域和转角问题)

要确定点p是否为另一点a的逆时针方向(即位于通过原点然后通过a的有向线的左侧所定义的半平面内),可以检查
Ax*Py-Ay*Px
结果的符号。这通常称为“垂直点积”,与3D叉积的Z坐标相同

如果有两个点A和B(其中B定义了最大程度的逆时针)定义了一个扇区,且扇区小于圆的一半,则任何点A的逆时针方向和B的CW方向均可归类为该扇区

这只剩下一个超过一半的扇区。显然,一组给定的点最多只能定义一个这样的扇区。使用角度二分法可以做一些聪明的事情,但最简单的方法可能只是将点分类为该扇区中的点,如果不能将它们分类为任何其他扇区中的点

哦,忘了提一下——确定点的顺序,以便为扇区配对。不要违背我之前的建议,但这里最简单的事情就是按照它们的
atan2
(而不是
atan
…永远不要使用
atan

  • 如果x&y尚未相对于圆心,请减去圆心的坐标:

    x -= circle.x
    y -= circle.y
    
    angle = atan2(y, x)
    
  • 用于获取点相对于圆原点的角度:

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

    if (angle < 0) angle += 2 * pi
    

  • 如果您发现结果引用的是圆另一侧的一个段,您可能需要在开始时执行
    y=-y
    ,或在结束时执行
    segment=(numSegments-1)-segment
    ,以将其向右翻转,但是它基本上是可以工作的。

    你的线段是由圆和直线之间的两个交点定义的。你只需要知道:

    • 圆心和点之间的角度介于 由前两个点和中心形成的角度
    • 该点位于圆中(从该点到中心的长度小于半径)
    • 点与线的比较是从哪一侧开始的(它必须超出线)
    备注

    在几何图形中,一个圆形段(符号:⌓) 是圆的一个区域 它被割线或和弦与圆的其余部分“切断”

    以下是一段:


    解释你想在什么基础上划分更小的弧垂?顺便说一句,这可能会有帮助。除上述内容外,解决方法可能因编程语言而异。如果这不是编程问题,请参见@haz hazz你的编程语言是什么?@haz hazz你点击了✓ 接受我的回答,这意味着它解决了你的问题。如果没有,你应该取消点击它,并澄清它是你想要的部分还是部门,以及它们是如何布局的。非常有洞察力,感谢你发布(+1)。什么是一个即将解决的问题?:-)@NPE例如,使用atan2方法,需要记住的是,如果P的角度大于B且小于A,则P在AB扇区中,并且AB扇区包括角度从+pi到-pi的拐角处。不要按切线角度(
    atan(x/y)
    atan2(x/y)
    )对点进行排序,而是直接按切线(
    x/y
    )对点进行排序。您必须分别对平面(x0)的两半进行排序,然后将两个子列表(以任意顺序)连接起来。@Cimbali按
    x/y
    排序将导致y接近零的问题。要走这条路,最好根据
    xy
    |x | | y |
    分成四分之一,并按
    x/y
    y/x
    进行排序@Cimbali
    atan2
    实现比这更聪明。。。他们在进行除法之前比较震级。从数学上讲,这两者当然是等价的。但遵从现有算法是避免棘手情况的有效方法。角度将为您提供扇区,而不是线段。角度将为您提供扇区,而不是线段。扇区不是线段!