求取两条直线的交点坐标

参考:https://blog.csdn.net/ycj9090900/article/details/53668753
Opencv学习笔记—–求取两条直线的交点坐标

bool find_crossPoint(Point p1, Point p2, Point p3, Point p4, Point &crossPoint){
    //****************************************************************************************
    //  求二条直线的交点的公式
    //  有如下方程 (x-x1)/(y-y1) = (x2-x1)/(y2-y1) ==> a1*x+b1*y=c1
    //            (x-x3)/(y-y3) = (x4-x3)/(y4-y3) ==> a2*x+b2*y=c2
    //  则交点为
    //                x= | c1 b1|  / | a1 b1 |      y= | a1 c1| / | a1 b1 |
    //                   | c2 b2|  / | a2 b2 |         | a2 c2| / | a2 b2 |
    //
    //   a1= y2-y1
    //   b1= x1-x2
    //   c1= x1*y2-x2*y1
    //   a2= y4-y3
    //   b2= x3-x4
    //   c2= x3*y4-x4*y3

    float a1 = p2.y - p1.y;
    float b1 = p1.x - p2.x;
    float c1 = p1.x*p2.y - p2.x*p1.y;
    float a2 = p4.y - p3.y;
    float b2 = p3.x - p4.x;
    float c2 = p3.x*p4.y - p4.x*p3.y;
    float det= a1*b2 - a2*b1;

    if(det == 0) return false;

    crossPoint.x = (c1*b2 - c2*b1)/det;
    crossPoint.y = (a1*c2 - a2*c1)/det;

    // Now this is cross point of lines
    // Do we need the cross Point of segments(need to judge x,y within 4 endpoints)
    // 是否要判断线段相交
    if((abs(crossPoint.x -(p1.x+p2.x)/2) <= abs(p2.x-p1.x)/2) &&
       (abs(crossPoint.y -(p1.y+p2.y)/2) <= abs(p2.y-p1.y)/2) &&
       (abs(crossPoint.x -(p3.x+p4.x)/2) <= abs(p4.x-p3.x)/2) &&
       (abs(crossPoint.y -(p3.y+p4.y)/2) <= abs(p4.y-p3.y)/2))
    {
        return true;
    }

    return false;
}

主函数调用:

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

bool find_crossPoint(Point p1, Point p2, Point p3, Point p4, Point &crossPoint);

int main()
{
    // test function find_crossPoint()
    Point cross;
    bool bCross;
    bCross = find_crossPoint(Point(0,0),Point(1,1),Point(0,2),Point(2,0),cross);
    //bCross = find_crossPoint(Point(0,0),Point(10,10),Point(0,30),Point(20,0),cross);
    if(bCross)
        cout << endl << "CrossPoint: " << "(" << cross.x << "," << cross.y << ")" << endl;
    else
        cout << endl << "CrossPoint: " << " null " << endl;

    system("pause");//waitKey(0);
    return 0;
}

Line1、Line2和交点如图:

直线求交点

代码运行结果:
这里写图片描述
求出来预期的(1,1)交点。


版权声明:本文为hjk61314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。