两个线段相交判断,cpp代码
以下是一个用C++编写的判断两个线段是否相交的代码示例:
```cpp
#include <iostream>
struct Point {
int x, y;
};
// 判断两个线段是否相交
bool isIntersect(Point p1, Point q1, Point p2, Point q2) {
// 通过叉积判断两个线段是否相交
int o1 = (q1.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (q1.y - p1.y);
int o2 = (q1.x - p1.x) * (q2.y - p1.y) - (q2.x - p1.x) * (q1.y - p1.y);
int o3 = (q2.x - p2.x) * (p1.y - p2.y) - (p1.x - p2.x) * (q2.y - p2.y);
int o4 = (q2.x - p2.x) * (q1.y - p2.y) - (q1.x - p2.x) * (q2.y - p2.y);
// 如果两个线段的方向不同,则相交
if (o1 * o2 < 0 && o3 * o4 < 0) {
return true;
}
// 如果两个线段共线且重叠,则相交
if (o1 == 0 && o2 == 0 && o3 == 0 && o4 == 0) {
if ((p2.x >= p1.x && p2.x <= q1.x) || (p2.x <= p1.x && p2.x >= q1.x) ||
(q2.x >= p1.x && q2.x <= q1.x) || (q2.x <= p1.x && q2.x >= q1.x) ||
(p2.y >= p1.y && p2.y <= q1.y) || (p2.y <= p1.y && p2.y >= q1.y) ||
(q2.y >= p1.y && q2.y <= q1.y) || (q2.y <= p1.y && q2.y >= q1.y)) {
return true;
}
}
return false;
}
int main() {
Point p1 = {1, 1};
Point q1 = {10, 1};
Point p2 = {1, 2};
Point q2 = {10, 2};
if (isIntersect(p1, q1, p2, q2)) {
std::cout << "线段相交" << std::endl;
} else {
std::cout << "线段不相交" << std::endl;
}
return 0;
}
```
这段代码定义了一个`Point`结构体表示点的坐标,然后使用`isIntersect`函数判断两个线段是否相交。函数内部通过计算叉积的方式判断线段的方向,如果两个线段的方向不同,则相交;如果两个线段共线且重叠,则相交。最后在`main`函数中调用`isIntersect`函数进行测试,并输出结果。
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。