첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 직선과 직선의 교차 포인트 찾기

------------------------------------------------------------------------------------------------------------------------

using System.Drawing;

 

#region 직선과 직선의 교차 포인트 찾기 - FindLineLineIntersectionPoint(line1StartPoint, line1EndPoint, line2StartPoint, line2EndPoint,

    lineIntersect, segmentIntersect, intersectionPoint, closePoint1, closePoint2, t1, t2)

 

/// <summary>

/// 직선과 직선의 교차 포인트 찾기

/// </summary>

/// <param name="line1StartPoint">선 1 시작 포인트</param>

/// <param name="line1EndPoint">선 1 종료 포인트</param>

/// <param name="line2StartPoint">선 2 시작 포인트</param>

/// <param name="line2EndPoint">선 2 종료 포인트</param>

/// <param name="lineIntersect">선 교차 여부</param>

/// <param name="segmentIntersect">세그먼트 교차 여부</param>

/// <param name="intersectionPoint">교차 포인트</param>

/// <param name="closePoint1">근접 포인트 1</param>

/// <param name="closePoint2">근접 포인트 2</param>

/// <param name="t1">T1</param>

/// <param name="t2">T2</param>

public void FindLineLineIntersectionPoint(PointF line1StartPoint, PointF line1EndPoint, PointF line2StartPoint,

    PointF line2EndPoint, out bool lineIntersect, out bool segmentIntersect, out PointF intersectionPoint, out PointF closePoint1,

    out PointF closePoint2, out float t1, out float t2)

{

    float dx12 = line1EndPoint.X - line1StartPoint.X;

    float dy12 = line1EndPoint.Y - line1StartPoint.Y;

    float dx34 = line2EndPoint.X - line2StartPoint.X;

    float dy34 = line2EndPoint.Y - line2StartPoint.Y;

 

    float denominator = (dy12 * dx34 - dx12 * dy34);

 

    t1 = ((line1StartPoint.X - line2StartPoint.X) * dy34 + (line2StartPoint.Y - line1StartPoint.Y) * dx34) / denominator;

 

    if(float.IsInfinity(t1))

    {

        lineIntersect    = false;

        segmentIntersect = false;

 

        intersectionPoint = new PointF(float.NaN, float.NaN);

 

        closePoint1 = new PointF(float.NaN, float.NaN);

        closePoint2 = new PointF(float.NaN, float.NaN);

 

        t2 = float.PositiveInfinity;

 

        return;

    }

 

    lineIntersect = true;

 

    t2 = ((line2StartPoint.X - line1StartPoint.X) * dy12 + (line1StartPoint.Y - line2StartPoint.Y) * dx12) / -denominator;

 

    intersectionPoint = new PointF(line1StartPoint.X + dx12 * t1, line1StartPoint.Y + dy12 * t1);

 

    segmentIntersect = ((t1 >= 0) && (t1 <= 1) && (t2 >= 0) && (t2 <= 1));

 

    if(t1 < 0)

    {

        t1 = 0;

    }

    else if(t1 > 1)

    {

        t1 = 1;

    }

 

    if(t2 < 0)

    {

        t2 = 0;

    }

    else if(t2 > 1)

    {

        t2 = 1;

    }

 

    closePoint1 = new PointF(line1StartPoint.X + dx12 * t1, line1StartPoint.Y + dy12 * t1);

    closePoint2 = new PointF(line2StartPoint.X + dx34 * t2, line2StartPoint.Y + dy34 * t2);

}

 

#endregion

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요