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
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] Bitmap 클래스 : 32비트 ARGB 포맷 비트맵 구하기 (0) | 2020.08.08 |
---|---|
[C#/WINFORM] Bitmap 클래스 : 중앙값 필터(Median Filter) 만들기 (0) | 2020.08.08 |
[C#/WINFORM] Bitmap 클래스 : 회선 필터(Convolution Filter) 만들기 (0) | 2020.08.08 |
[C#/WINFORM] Bitmap 클래스 : 타겟 너비 비율에 맞는 비트맵 구하기 (0) | 2020.08.08 |
[C#/WINFORM] 삼변 측량(trilateration) 하기 (0) | 2020.08.08 |
[C#/WINFORM] 타원형 호로 두 포인트 연결하기 (0) | 2020.08.07 |
[C#/WINFORM] 원의 중간점을 지나는 호 그리기 (0) | 2020.08.07 |
[C#/WINFORM] Graphics 클래스 : FillEllipse/DrawEllipse 메소드를 사용해 포인트 그리기 (0) | 2020.08.07 |
[C#/WINFORM] Graphics 클래스 : DrawRectangle 메소드를 사용해 사각형 그리기 (0) | 2020.08.07 |
[C#/WINFORM] Graphics 클래스 : FillEllipse 메소드를 사용해 포인트 그리기 (0) | 2020.08.07 |