네 개의 점에서 두 개의 라인 교점 코드를 구하여 실현하다

5426 단어 코드
이미 알고 있는 한 라인의 시작점과 끝점을 (x1, y1), (x2, y2), 다른 하나는 (x3, y3), (x4, y4)로 설정합니다.먼저 두 라인의 일차 함수를 구한 다음에 연립하여 교점 좌표를 구한다
교점 공식: x= (y3x4x2-y4x3-y3x4x1+y4x3-y1x2x4+y2x1x4+y2x1x4+y1x2x3-y2x1x3)/x4y2-x4y1-x3y2+x3y1-x2y4+x2y3+x1y4-x1y3
y=(-y3x4y2+y4x3y2+y3x4y1-y4x3y1+y1x2y4-y1x2y3-y2x1y4+y2x1y3)/y4x2-y4x1-y3x2+x1y3-y2x4+y2x3+y1x4-y1x3
코드 구현:
CvPoint CrossPoint(const CvPoint line1, const CvPoint line2, const CvPoint line3, const CvPoint line4) //  
{
    double x_member, x_denominator, y_member, y_denominator;
    CvPoint cross_point;
    x_denominator = line4.x*line2.y - line4.x*line1.y - line3.x*line2.y + line3.x*line1.y 
        - line2.x*line4.y + line2.x*line3.y + line1.x*line4.y - line1.x*line3.y;

    x_member = line3.y*line4.x*line2.x - line4.y*line3.x*line2.x - line3.y*line4.x*line1.x + line4.y*line3.x*line1.x
        - line1.y*line2.x*line4.x + line2.y*line1.x*line4.x + line1.y*line2.x*line3.x - line2.y*line1.x*line3.x;

    if (x_denominator == 0)
        cross_point.x = 0;
    else
        cross_point.x = x_member / x_denominator;

    y_denominator = line4.y*line2.x - line4.y*line1.x - line3.y*line2.x + line1.x*line3.y 
        - line2.y*line4.x + line2.y*line3.x + line1.y*line4.x - line1.y*line3.x;

    y_member = -line3.y*line4.x*line2.y + line4.y*line3.x*line2.y + line3.y*line4.x*line1.y - line4.y*line3.x*line1.y
        + line1.y*line2.x*line4.y - line1.y*line2.x*line3.y - line2.y*line1.x*line4.y + line2.y*line1.x*line3.y;

    if (y_denominator == 0)
        cross_point.y = 0;
    else
        cross_point.y = y_member / y_denominator;

    return cross_point;  //    (0,0)
}

좋은 웹페이지 즐겨찾기