세 점 $A$, $B$, $C$가 만드는 삼각형의 외접원의 반지름을 구해보자. 세 변을 나타내는 벡터는
$$\vec{a}= \vec{OC}-\vec{OB}, \quad \vec{b}=\vec{OA}-\vec{OC},\quad\vec{c}=\vec{OB}-\vec{OA}.$$
세 점이 일직선 위에 놓이지 않기 위해서는
$$\vec{a}\times \vec{b} \ne 0$$
를 만족해야 한다.
그림의 삼각형에서 $\angle(BOC)$가 $\angle(BAC)$의 두 배이므로,
$$\sin \theta =\frac{a/2}{R}.$$
이제 삼각형 면적은 세 변의 길이 ($a, b, c$)와 외접원의 반지름($R$)으로 표현된다:
$$\text{area}=\frac{1}{2}bc \sin \theta ~~\longrightarrow~~ \frac{abc}{4R}.$$
또한, 삼각형의 면적을 세 점이 일직선 위에 있는가를 테스트하는 식으로 표현하면
$$\text{area}=\frac{1}{2} | \vec{a}\times \vec{b}|$$
처럼 쓸 수 있다. 따라서 삼각형의 외접원의 반지름은 아래처럼 주어진다.
$$R = \frac{abc}{4\cdot \text{area}} = \frac{| \vec{a}||\vec{b} ||\vec{c} |}{2|\vec{a}\times \vec{b}| }.$$
double circumradius(CPoint A, CPoint B, CPoint C) {
double ax = C.x - B.x, ay = C.y - B.y;
double bx = A.x - C.x, by = A.y - C.y;
double crossab = ax * by - ay * bx;
if (crossab != 0) {
double a = hypot(ax, ay);
double b = hypot(bx, by);
double cx = B.x - A.x, cy = B.y - A.y;
double c = hypot(cx, cy);
return (0.5 * a * b * c / fabs(crossab));
} else
return 0; //collinear
};
728x90
'Image Recognition > Fundamental' 카테고리의 다른 글
삼각형의 외접원: 외접원의 중심 2 (9) | 2012.10.20 |
---|---|
삼각형의 외접원: 외접원의 중심 (0) | 2012.10.19 |
Ellipse Parameters (0) | 2012.10.13 |
float 타입 변수의 절대값은? (0) | 2012.02.17 |
x 보다 크거나 같은 가장 작은 2^n ? (0) | 2012.02.13 |