#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;
}
判断二维线段相交
最新推荐文章于 2022-01-14 19:42:18 发布