Geometry 确定圆弧是表示反射角还是锐角

Geometry 确定圆弧是表示反射角还是锐角,geometry,angle,points,Geometry,Angle,Points,我有一个看似简单但非常令人困惑的问题 假设我有一组顶点(x1,y1),(x2,y2),(x3,y3)。。。。。。表示弧的。这些点可以是顺时针或逆时针方向,但顺序都类似。 我知道弧的中心(xc,yc) 我如何判断圆弧是否对锐角/钝角或反射角 一个明显的解决方案是取atan2((最后一个)-(中心))和atan2((第一个)-(中心))的差。但是,如果圆弧经过圆周率变为-PI的点,这种方法就失败了 此外,由于弧点是从一个相当嘈杂的像素图片中导出的,因此顶点并不完全平滑 我无法专心解决这个问题 谢谢

我有一个看似简单但非常令人困惑的问题

假设我有一组顶点(x1,y1),(x2,y2),(x3,y3)。。。。。。表示弧的。这些点可以是顺时针或逆时针方向,但顺序都类似。 我知道弧的中心(xc,yc)

我如何判断圆弧是否对锐角/钝角或反射角

一个明显的解决方案是取atan2((最后一个)-(中心))和atan2((第一个)-(中心))的差。但是,如果圆弧经过圆周率变为-PI的点,这种方法就失败了

此外,由于弧点是从一个相当嘈杂的像素图片中导出的,因此顶点并不完全平滑

我无法专心解决这个问题


谢谢你的帮助

由于您所描述的原因,处理二维角度是一件痛苦的事情,因此最好使用向量数学,它是旋转不变的

定义二维叉积,
A^B=Ax*By-Ay*Bx
。如果
A
相对于
B
顺时针旋转,则为正值,反之亦然

逻辑是:

  • 计算
    C=(最后一个点-中心)^(第一个点-中心)
  • 如果
    C=0
    ,则弧要么闭合,要么180度(忘记了该弧的名称)
  • 如果
    C>0
    ,则弧必须是(i)顺时针和锐/钝或(ii)逆时针和反射
  • 如果
    C<0
    ,则相反
伪代码:

int arc_type(Point first, Point last, Point center, bool clockwise)
{
    // cross-product
    float C = (last.x - center.x) * (first.y - center.y)
            - (last.y - center.y) * (first.x - center.x);

    if (Math.abs(C) < /* small epsilon */)
        return 0;                      // 180-degree

    return ((C > 0) ^ clockwise) ? 1   // reflex
                                 : -1; // acute / obtuse
}
int弧_类型(第一点、最后一点、点中心、布尔顺时针)
{
//叉积
浮点C=(last.x-center.x)*(first.y-center.y)
-(last.y-center.y)*(first.x-center.x);
if(数学abs(C)0)^顺时针)?1//反射
:-1;//尖锐/迟钝
}

请注意,如果您事先不知道圆弧是顺时针还是逆时针,可以在相邻点上使用相同的叉积方法。您需要确保点的顺序是一致的-如果不一致,您可以再次使用叉积,按(相对)角度对它们进行排序。

您的方向正确。请注意,如果您已有的差异
atLP atFP