첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

■ 원과 원의 교차점을 찾는 방법을 보여준다.

 

▶ 예제 코드 (C#)

using System;
using System.Drawing;

#region 원과 원 교차점 찾기 - FindCircleCircleIntersectionPoint(centerPointX1, centerPointY1, radius1,
    centerPointX2, centerPointY2, radius2, intersectionPoint1, intersectionPoint2)

/// <summary>
/// 원과 원 교차점 찾기
/// </summary>
/// <param name="centerPointX1">중심점 X1</param>
/// <param name="centerPointY1">중심점 Y1</param>
/// <param name="radius1">반경 1</param>
/// <param name="centerPointX2">중심점 X2</param>
/// <param name="centerPointY2">중심점 Y2</param>
/// <param name="radius2">반경 2</param>
/// <param name="intersectionPoint1">교차점 1</param>
/// <param name="intersectionPoint2">교차점 2</param>
/// <returns>교차점 수</returns>
public int FindCircleCircleIntersectionPoint
(
    float      centerPointX1,
    float      centerPointY1,
    float      radius1,
    float      centerPointX2,
    float      centerPointY2,
    float      radius2,
    out PointF intersectionPoint1,
    out PointF intersectionPoint2
)
{
    float deltaX = centerPointX1 - centerPointX2;
    float deltaY = centerPointY1 - centerPointY2;

    double distance = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);

    if(distance > radius1 + radius2)
    {
        intersectionPoint1 = new PointF(float.NaN, float.NaN);
        intersectionPoint2 = new PointF(float.NaN, float.NaN);

        return 0;
    }
    else if(distance < Math.Abs(radius1 - radius2))
    {
        intersectionPoint1 = new PointF(float.NaN, float.NaN);
        intersectionPoint2 = new PointF(float.NaN, float.NaN);

        return 0;
    }
    else if((distance == 0) && (radius1 == radius2))
    {
        intersectionPoint1 = new PointF(float.NaN, float.NaN);
        intersectionPoint2 = new PointF(float.NaN, float.NaN);

        return 0;
    }
    else
    {
        double a = (radius1 * radius1 - radius2 * radius2 + distance * distance) / (2 * distance);
        double h = Math.Sqrt(radius1 * radius1 - a * a);

        double centerX3 = centerPointX1 + a * (centerPointX2 - centerPointX1) / distance;
        double centerY3 = centerPointY1 + a * (centerPointY2 - centerPointY1) / distance;

        intersectionPoint1 = new PointF
        (
            (float)(centerX3 + h * (centerPointY2 - centerPointY1) / distance),
            (float)(centerY3 - h * (centerPointX2 - centerPointX1) / distance)
        );

        intersectionPoint2 = new PointF
        (
            (float)(centerX3 - h * (centerPointY2 - centerPointY1) / distance),
            (float)(centerY3 + h * (centerPointX2 - centerPointX1) / distance)
        );

        if(distance == radius1 + radius2)
        {
            return 1;
        }

        return 2;
    }
}

#endregion
728x90
그리드형(광고전용)
Posted by icodebroker
,