原始问题:
两个线段相交判断,cpp代码
以下是一个用C++编写的判断两个线段是否相交的代码示例:
#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函数进行测试,并输出结果。
Prev:小红书的top5行业有哪些,可以通过哪些学习通道和方式来提升小红书广告运营能力