Processing math: 100%

삼각형의 외접원을 기하학적인 방법이 아닌 대수적인 방법을 이용해서 구해보자. 중심이 (xc,yc)이고 반지름이 R인 원의 방정식은

(xxc)2+(yyc)2=R2

으로 주어진다. 이 식에서 세 개의 변수 xc, yc, R를 결정해야는데, 각 변수에 대해서 2차 방정식의 형태로 주어져 있으므로 좀 더 쉬운 1차식 형태가 되도록 변형을 해보자. 방정식을 전개하면

(2x)xc+(2y)yc+R2x2cy2c=x2+y2

  (2x)xc+(2y)yc+d=x2+y2,d=R2x2cy2c.

이제 원의 방정식은 xc, yc, d에 대한 1차식으로 정리되었다. 삼각형의 외접원의 방정식은 세 꼭짓점을 통과하므로 세 꼭지 짐 A(x1,y1), B(x2,y2), C(x3,y3)을 위의 식에 넣으면 3개의 방정식을 얻는다. 이 방정식을 행렬로 표현하면

 

따라서, Cramer의 규칙을 적용하면 다음과 같이 외접원의 중심 (또한 d을 구해서 외접원의 반지름을 구할 수 있다)을 얻을 수 있다.

 

determinant를 정리하면,

을 얻을 수 있다. 이 식의 분모는 세 꼭짓점이 일직선 위에 있지 않으면 0이 아니다. 한 꼭짓점과 다른 꼭짓점 간 좌표의 차이 4개 (x2x1,y2y1,x3x1,y3y1)와 좌표의 합 4개 (x1+x2,y1+y2,x1+x3,y1+y3)를 계산하여 중심점의 좌표를 얻을 수 있다.

구현된 코드는 http://kipl.tistory.com/113; 또는

int circumcenter2(CPoint P, CPoint Q, CPoint R, double *xc, double *yc) {
    double A = Q.x - P.x, B = Q.y - P.y;
    double C = R.x - P.x, D = R.y - P.y;
    double E = A * (P.x + Q.x) + B * (P.y + Q.y);
    double F = C * (P.x + R.x) + D * (P.y + R.y);
    double G = 2. * ( A * D - B * C);
    if (G != 0.) { // 세 점이 일직선에 놓이지 않는 경우; 이 경우만 외접원이 정의된다;
        *xc = (D * E - B * F) / G;
        *yc = (A * F - C * E) / G;
        return 1;
    } else return 0;
}

분모 G의 계산을 G=2(A(R.yQ.y)B(R.xQ.x)) 로 쓰는 경우가 많다. 위의 행렬식을 보면 같은 결과지만 식을 좀 더 대칭적으로 보이게 한다: G=2.(A(DB)B(CA))=2(ADBC).

728x90
,