求两直线(线段)的交点 点斜式 解方程

 原文:

OpenCV计算两条直线的交点_opencv计算两直线交点_armos的博客-CSDN博客

bool getCrossPoint(cv::Point2i &out, cv::Point2i p1, cv::Point2i p2, cv::Point2i p3, cv::Point2i p4)
{
    int x1 = p1.x;
    int y1 = p1.y;
    int x2 = p2.x;
    int y2 = p2.y;

    int x3 = p3.x;
    int y3 = p3.y;
    int x4 = p4.x;
    int y4 = p4.y;

    double k1, b1;
    bool k1_None = false;
    if (x2 - x1 == 0)
    {
        k1_None = true;
    }
    else
    {
        k1 = (double)(y2 - y1) / (double)(x2 - x1); //求出LineA斜率
        b1 = (double)y1 - (double)x1 * k1;
    }

    double k2, b2;
    bool k2_None = false;
    if (x4 - x3 == 0)
    {
        k2_None = true;
        b2 = 0;
    }
    else
    {
        k2 = (double)(y4 - y3) / (double)(x4 - x3); //求出LineB斜率
        b2 = (double)y3 - (double)x3 * k2;
    }

    if (k1_None) // LineA 水平
    {
        if (!k2_None) // LineB 非水平线
        {
            out.x = x1;
            out.y = k2 * x1 + b2;
            cout << "1 x=" << out.x << ", y=" << out.y;
            return true;
        }
    }
    else if (k2_None) // LineA 非水平 LineB 水平
    {
        out.x = x3;
        out.y = k1 * x3 + b1;
        cout << "2 x=" << out.x << ", y=" << out.y;
        return true;
    }
    else if (k2 != k1) // LineA 非水平 LineB 水平
    {
        out.x = (double)(b2 - b1) / (double)(k1 - k2);
        out.y = k1 * (double)out.x + b1;
        cout << "3 x=" << out.x << ", y=" << out.y;
        return true;
    }

    out.x = 0;
    out.y = 0;
    return false;
}

猜你喜欢

转载自blog.csdn.net/weixin_45824067/article/details/131088161