티스토리 뷰

반응형

 

 

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

 

 

 

 

 

 

 

댓글