2011년 7월 26일 화요일

삼각형의 외접원 구하기

삼각형의 세 꼭지점 A, B, C에 대한 외접원의 반지름 r과 중심점 O는 다음과 같이 구할 수 있다. 


위의 수식에서는 삼각형의 꼭지점 A, B, C의 벡터와 외접원의 중심점 O의 벡터로 표현되었다.


/* tri : given triangle
 * org : the center of circumscribed-circle
 * return value : the radius of circumscribed-circle */
real_t triangle_circumcircle(point_t *org, triangle_t *tri)
{
  real_t area, a, b, c;
  real_t alpha, beta, gamma;
  point_t *A, *B, *C;
  point_t *d1, *d2, *d3;

  assert(org);
  assert(tri);

  A = tri->a, B = tri->b, C = tri->c;
  area = parallelogram_area_of_3points(A, B, C);
  a = distance_between_points(B, C);
  b = distance_between_points(C, A);
  c = distance_between_points(A, B);

  d1 = point_new();
  d2 = point_new();

  point_subtract(d1, A, B);
  point_subtract(d2, A, C);
  alpha = a * point_dotproduct(d1, d2) / (2 * sqr(area));

  point_subtract(d1, B, A);
  point_subtract(d2, B, C);
  beta = b * point_dotproduct(d1, d2) / (2 * sqr(area));

  point_subtract(d1, C, A);
  point_subtract(d2, C, B);
  gamma = c * point_dotproduct(d1, d2) / (2 * sqr(area));

  point_destroy(d2);
  point_destroy(d1);

  org->x = alpha * A->x + beta * B->x + gamma * C->x;
  org->y = alpha * A->y + beta * B->y + gamma * C->y;
  org->z = alpha * A->z + beta * B->z + gamma * C->z;

  return a*b*c/(2*area);
}

댓글 1개: