평면 위 세 점 $A$, $B$, $C$가 삼각형을 만들 때 외접원 중심을 구해보자. 점 $C$을 원점으로 하면, $A$, $B$는 각각
의 두 벡터로 표현이 된다 (원점을 $C$점으로 평행 이동했다고 생각하면 된다). 이 두 벡터에 각각 수직이고 삼각형과 같은 평면에 놓인 ($\vec a$, $\vec b$를 각각 시계 방향으로 회전시켜 만든) 두 벡터 $\vec m$, $\vec n$를 다음과 같이 정의하자.
그러면, 변 $CA$의 중점을 지나면서 수직인 직선의 방정식은
또, $CB$의 중점을 지나면서 수직인 직선의 방정식은
이 두 직선의 교점이 외접원의 중심이 된다. 매개변수 $s$, $t$를 구하기 위해서 두 식을 빼면
매개변수 $s$는 $\vec b$와 $\vec n$이 수직인 조건을 이용하면
따라서, 외접원의 중심은
여기서, 3개 벡터의 외적의 성질을 이용해서 (평면에서 외적은 숫자이다)
가 항등식으로 성립하고, 또한 $\vec a$, $\vec m$이 서로 수직이면서 길이가 같고, $\vec m$ 도 $\vec b$에 수직이면 길이가 같으므로
따라서,
여기서, 윗 식의 분모를 보면
이므로, 이 값이 0이 아니려면 세 점이 일직선에 있지 않으면 된다.
그런데 이 벡터는 점 $C$를 원점으로 하여서 계산을 한 것이므로, 원래의 좌표계에 대한 식으로 바꾸려면 $(C_x, C_y)$를 더해 주어야 한다.
또는, 성분으로 표현하면
int circumcenter ( CPoint A, CPoint B, CPoint C, double *xc, double *yc) {
double ax = A.x - C.x, ay = A.y - C.y ;
double bx = B.x - C.x, by = B.y - C.y ;
double asq = ax * ax + ay * ay;
double bsq = bx * bx + by * by;
double ccw = ax * by - ay * bx;
if ( ccw != 0. ) { //세 점임 일직선 위에 있지 않는 경우; 이 경우만 외접원이 정의됨;
*xc = C.x + ( by * asq - ay * bsq ) / ( 2 * ccw ) ;
*yc = C.y + ( -bx * asq + ax * bsq ) / ( 2 * ccw ) ;
return 1;
} else return 0;
}
728x90
'Image Recognition > Fundamental' 카테고리의 다른 글
Histogram Matching (0) | 2012.11.03 |
---|---|
삼각형의 외접원: 외접원의 중심 2 (9) | 2012.10.20 |
삼각형의 외접원: 외접원의 반지름 (0) | 2012.10.13 |
Ellipse Parameters (0) | 2012.10.13 |
float 타입 변수의 절대값은? (0) | 2012.02.17 |