C++ 找到三个点的方向的经典算法是错误的?

C++ 找到三个点的方向的经典算法是错误的?,c++,algorithm,geometry,computational-geometry,C++,Algorithm,Geometry,Computational Geometry,算法可以在这里()和这里()引用 尝试下面的代码p1={0,0},p2={4,4},p3={0,3},或者p1={0,0},p2={4,4},p3={0,5},我认为这两种情况都应该是按时钟的,但算法输出的是按时钟的 // A C++ program to find orientation of three points #include <iostream> using namespace std; struct Point { int x, y; }; // To f

算法可以在这里()和这里()引用

尝试下面的代码p1={0,0},p2={4,4},p3={0,3},或者p1={0,0},p2={4,4},p3={0,5},我认为这两种情况都应该是按时钟的,但算法输出的是按时钟的

// A C++ program to find orientation of three points
#include <iostream>
using namespace std;

struct Point
{
    int x, y;
};

// To find orientation of ordered triplet (p1, p2, p3).
// The function returns following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
int orientation(Point p1, Point p2, Point p3)
{
    // See 10th slides from following link for derivation
    // of the formula
    int val = (p2.y - p1.y) * (p3.x - p2.x) -
            (p2.x - p1.x) * (p3.y - p2.y);

    cout << val << endl;
    if (val == 0) return 0; // colinear

    return (val > 0)? 1: 2; // clock or counterclock wise
}

// Driver program to test above functions
int main()
{
    Point p1 = {0, 0}, p2 = {4, 4}, p3 = {0, 3};
    int o = orientation(p1, p2, p3);
    if (o==0)        cout << "Linear";
    else if (o == 1) cout << "Clockwise";
    else             cout << "CounterClockwise";
    return 0;
}
<代码> //C++程序查找三点的方位 #包括 使用名称空间std; 结构点 { int x,y; }; //找到有序三重态(p1,p2,p3)的方向。 //该函数返回以下值 //0-->p、q和r是共线的 //1-->顺时针 //2-->逆时针方向 内部方向(点p1、点p2、点p3) { //有关推导,请参见以下链接中的第10张幻灯片 //公式 int val=(p2.y-p1.y)*(p3.x-p2.x)- (p2.x-p1.x)*(p3.y-p2.y);
cout让我们绘制序列
(0,0)->(4,4)->(0,3)


如您所见,它是逆时针的。因此代码工作正常,您只是在判断时出错。

顺时针或逆时针取决于您的轴方向

真正重要的是,三角形测试为对齐点提供0,一侧为正,另一侧为负


只要拿一个测试用例,你就会永远知道什么是正确的“有符号性”。

(0,0)->(4,4)->(0,3)对我来说听起来像是逆时针方向的。是的,@serhiyb,你可以试试我的代码,它按逆时针方向输出。这是正确的答案。那么你的问题是什么?(0,0)->(4,4)->(0,3)是逆时针方向。算法输出是逆时针方向。完美匹配!第二个例子也是如此。@serhiyb,很抱歉我之前读错了你的评论。为什么你认为它是逆时针方向?我认为它是逆时针方向。谢谢,我想我对逆时针方向的含义有一些错误的理解,通过你的示例图,我得到了根据经验,经典算法是正确的。