aiaiask.com©

开花即结果 提问即答案

两个线段相交判断,cpp代码
原始问题:

两个线段相交判断,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函数进行测试,并输出结果。

两个线段相交判断,cpp代码
https://www.aiaiask.com/ask/45931.html
AI / 模型DeepSeek
时间 / DATESeptember 4, 2023, 5:53 PM
语言zh-CN
IP / 区域上海市上海市