티스토리 뷰
반응형
3점을 지나는 원곡선의 중심좌표 및 반지름을 구하는 공식을 정리하였다.
원의 기본 방정식 :
(X - X0)^2 + (Y - Y0)^2 = R^2
X^2 - 2XX0 + X0^2 + Y^2 - 2YY0 + Y0^2 = R^2
X^2 - 2XX0 + Y^2 - 2YY0 = R^2 - X0^2 - Y0^2
여기서, 반지름 R, 원 중심 X0 및 Y0는 상수이므로, 아래와 같이 C로 치환하면,
C = R^2 - X0^2 - Y0^2
X^2 + Y^2 = C + 2XX0 + 2YY0
2X X0 + 2Y Y0 + C = X^2 + Y^2
즉, 세점 (Xi, Yi), (Xj, Yj), (Xk, Yk) 가 주어졌을때,
[ 2Xi 2Yi 1 ] [X0] = [ Xi^2 + Yi^2 ]
[ 2Xj 2Yj 1 ] [Y0] = [ Xj^2 + Yj^2 ]
[ 2Xk 2Yk 1 ] [ C ] = [ Xk^2 + Yk^2 ]
이때, 3X3 행렬의 역행렬은 아래와 같이 구할 수 있다.
Excel VBA Code
Sub test()
Dim M(), V(), adjM() As Double
ReDim M(0 To 2, 0 To 2)
ReDim V(0 To 2)
ReDim adjM(0 To 2, 0 To 2)
Dim dDet As Double
Dim Pt1(1), Pt2(1), Pt3(1) As Double
' 3 Points
Pt1(0) = 0.7
Pt1(1) = 2.44
Pt2(0) = 3.12
Pt2(1) = 3.13
Pt3(0) = 3.54
Pt3(1) = 1.47
'
' (X - X0)^2 + (Y - Y0)^2 = R^2
'
' X^2 - 2XX0 + X0^2 + Y^2 - 2YY0 + Y0^2 = R^2
'
' X^2 - 2XX0 + Y^2 - 2YY0 = R^2 - X0^2 - Y0^2
'
' Let C = R^2 - X0^2 - Y0^2
'
' X^2 + Y^2 = C + 2XX0 + 2YY0
'
' 2X X0 + 2Y Y0 + C = X^2 + Y^2
'
' | 2Xi 2Yi 1 | X0 = Xi^2 + Yi^2
' | 2Xj 2Yj 1 | Y0 = Xj^2 + Yj^2
' | 2Xk 2Yk 1 | C = Xk^2 + Yk^2
'
M(0, 0) = 2 * Pt1(0)
M(0, 1) = 2 * Pt1(1)
M(0, 2) = 1
M(1, 0) = 2 * Pt2(0)
M(1, 1) = 2 * Pt2(1)
M(1, 2) = 1
M(2, 0) = 2 * Pt3(0)
M(2, 1) = 2 * Pt3(1)
M(2, 2) = 1
V(0) = Pt1(0) ^ 2 + Pt1(1) ^ 2
V(1) = Pt2(0) ^ 2 + Pt2(1) ^ 2
V(2) = Pt3(0) ^ 2 + Pt3(1) ^ 2
' Inverse of M (3X# Martrix)
' 참고..
'
dDet = M(0, 0) * (M(1, 1) * M(2, 2) - M(1, 2) * M(2, 1)) _
- M(0, 1) * (M(1, 0) * M(2, 2) - M(1, 2) * M(2, 0)) _
+ M(0, 2) * (M(1, 0) * M(2, 1) - M(1, 1) * M(2, 0))
adjM(0, 0) = (M(1, 1) * M(2, 2) - M(1, 2) * M(2, 1)) / dDet
adjM(0, 1) = (M(0, 2) * M(2, 1) - M(0, 1) * M(2, 2)) / dDet
adjM(0, 2) = (M(0, 1) * M(1, 2) - M(0, 2) * M(1, 1)) / dDet '
adjM(1, 0) = (M(1, 2) * M(2, 0) - M(1, 0) * M(2, 2)) / dDet
adjM(1, 1) = (M(0, 0) * M(2, 2) - M(0, 2) * M(2, 0)) / dDet
adjM(1, 2) = (M(0, 2) * M(1, 0) - M(0, 0) * M(1, 2)) / dDet
adjM(2, 0) = (M(1, 0) * M(2, 1) - M(1, 1) * M(2, 0)) / dDet
adjM(2, 1) = (M(0, 1) * M(2, 0) - M(0, 0) * M(2, 1)) / dDet
adjM(2, 2) = (M(0, 0) * M(1, 1) - M(0, 1) * M(1, 0)) / dDet
' transformed Circle
Dim dX0, dY0, dC0, dRadii As Double
dX0 = adjM(0, 0) * V(0) + adjM(0, 1) * V(1) + adjM(0, 2) * V(2) ' X of Center
dY0 = adjM(1, 0) * V(0) + adjM(1, 1) * V(1) + adjM(1, 2) * V(2) ' Y of Center
dC0 = adjM(2, 0) * V(0) + adjM(2, 1) * V(1) + adjM(2, 2) * V(2)
dRadii = Math.Sqr(dC0 + dX0 ^ 2 + dY0 ^ 2) ' Radius
End Sub
반응형
'EXCEL > VBA' 카테고리의 다른 글
[Excel VBA] MS WORD 자동화 (3) - WORD FILE 쓰기 (0) | 2024.01.17 |
---|---|
[Excel VBA] MS WORD 자동화 (2) - 파일 생성 / 열기 / 저장 (0) | 2024.01.17 |
[Excel VBA] MS WORD 자동화 (1) 준비하기 (0) | 2024.01.17 |
[Excel VBA] TEXT FILE I/O 입력 출력 (0) | 2024.01.17 |
[Excel VBA] Dictionary 사용법 정리 (0) | 2024.01.15 |
댓글