判断二维线段相交

来源:互联网 发布:java解析syslog 编辑:程序博客网 时间:2024/06/08 10:19
#include <iostream>typedef struct Point {float x, y;} Vector;struct Line {Point p1, p2;};bool iscross(const Line & l1, const Line & l2, Point * pOut = nullptr){Vector v1 = {l1.p2.x - l1.p1.x, l1.p2.y - l1.p1.y};Vector v2 = {l2.p2.x - l2.p1.x, l2.p2.y - l2.p1.y};Point cross;if (v1.x * v2.y == v2.x * v1.y)// 平行或相交{return false;}else if (l1.p1.x == l1.p2.x)// l1垂直于x轴{cross.x = l1.p1.x;cross.y = l2.p1.y + (l2.p2.y - l2.p1.y) / (l2.p2.x - l2.p1.x) * (l1.p1.x - l2.p1.x);}else if (l2.p1.x == l2.p2.x)// l2垂直于x轴{return iscross(l2, l1, pOut);}else{float k1 = (l1.p2.y - l1.p1.y) / (l1.p2.x - l1.p1.x);float b1 = l1.p1.y + k1 * l1.p1.x;float k2 = (l2.p2.y - l2.p1.y) / (l2.p2.x - l2.p1.x);float b2 = l2.p1.y + k1 * l2.p1.x;cross.x = -(b1 - b2) / (k1 - k2);cross.y = k1 * cross.x + b1;}// 如果两线段的MBR(最小边界矩形)都包含交点,则相交if ((cross.x >= l1.p1.x && cross.x <= l1.p2.x || cross.x <= l1.p1.x && cross.x >= l1.p2.x) && (cross.y >= l1.p1.y && cross.y <= l1.p2.y || cross.y <= l1.p1.y && cross.y >= l1.p2.y)&&(cross.x >= l2.p1.x && cross.x <= l2.p2.x || cross.x <= l2.p1.x && cross.x >= l2.p2.x) && (cross.y >= l2.p1.y && cross.y <= l2.p2.y || cross.y <= l2.p1.y && cross.y >= l2.p2.y)){if (pOut){pOut->x = cross.x;pOut->y = cross.y;}return true;}else{return false;}}int main(){Line l1 = {{10.0f, 10.0f}, {0.0f, 0.0f}};Line l2 = {{1.0f, 0.0f}, {1.0f, 0.75f}};Point cross = {-1.0f, -1.0f};bool b = iscross(l1, l2, &cross);std::cout << std::boolalpha << b << ", (" << cross.x << ", " << cross.y << ")" << std::endl;system("pause");return 0;}

0 0
原创粉丝点击