越线检测简单实现
算法思想,参考:传送门
c++代码简单测试
#include <iostream>
using namespace std;
struct point
{
int x;
int y;
};
struct line
{
point A;
point B;
};
int calculate(line line1, line line2)
{
int x1 = line1.B.x - line1.A.x;
int y1 = line1.B.y - line1.A.y;
int x2 = line2.B.x - line2.A.x;
int y2 = line2.B.y - line2.A.y;
int ret = x1 * y2 - x2 * y1;
if(ret > 0)
return 1;
else if(ret < 0)
return -1;
else
return 0;
}
int lineMaxMin(line line1, point C, point D)
{
int maxX, minX, maxY, minY;
maxX = line1.A.x > line1.B.x ? line1.A.x : line1.B.x;
minX = line1.A.x < line1.B.x ? line1.A.x : line1.B.x;
maxY = line1.A.y > line1.B.y ? line1.A.y : line1.B.y;
minY = line1.A.y < line1.B.y ? line1.A.y : line1.B.y;
// 先判断两条线最值问题,减少计算,,,,修改:下面的if条件判断没多大意义
if ((C.x <= maxX && C.x >= minX && D.x <= maxX && D.x >= minX) || (C.y <= maxY && C.y >= minY && D.y <= maxY && D.y >= minY))
{
// 需要计算
line AC{line1.A, C};
line AD{line1.A, D};
int ret1 = calculate(line1, AC);
int ret2 = calculate(line1, AD);
// ret小于0,点在线的顺时针方向
cout << "ret1 = " << ret1 << "\t ret2 = " << ret2 << endl;
if (ret1 == 0 && ret2 == 0)
{
cout << "水平" << endl;
return 0;
}
else
{
if (ret1 >= 0)
{
cout << "C -> D 顺时针" << endl;
return 1;
}
else
{
cout << "C -> D 逆时针" << endl;
return 2;
}
}
}
else
{
// 不需要计算,
cout << "不需要计算,没有越线" << endl;
return -1;
}
}
int main()
{
point A{0, 0};
point B{100, 0};
point C{35, 0};
point D{20, 0};
line AB{A, B};
int ret = lineMaxMin(AB, C, D);
cout << "ret = " << ret << endl;
return 0;
}