C++ 找到三个点的方向的经典算法是错误的?
算法可以在这里()和这里()引用 尝试下面的代码p1={0,0},p2={4,4},p3={0,3},或者p1={0,0},p2={4,4},p3={0,5},我认为这两种情况都应该是按时钟的,但算法输出的是按时钟的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
// 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,很抱歉我之前读错了你的评论。为什么你认为它是逆时针方向?我认为它是逆时针方向。谢谢,我想我对逆时针方向的含义有一些错误的理解,通过你的示例图,我得到了根据经验,经典算法是正确的。