2차원에서 세 점을 지나는 원의 중심을 Eigen 라이브러리를 이용해서 구하는 방법을 알려드리겠습니다.
우리가 일반적으로 알고 있는 원의 방정식은
(x-a)^2 + (y-b)^2 = r^2
이며, 이 식은 표준형이라고 합니다. 이 식을 전개해서 일반형으로 바꾸게 되면
x^2 + y^2 + ax + by + c = 0
이 됩니다. 이때 원의 중심은 -a/2, -b/2가 됩니다. 이 일반형의 식을 이용해서 원의 중심을 구해보도록 하겠습니다. 일반형 식에서 2차원의 점들이 주어졌을 때, 우리가 구해야 할 미지수는 a, b, c 이므로 a, b, c들만 좌변에 있도록 식을 수정해 보면
ax + by + c = -x^2 - y^2
이러한 식이 됩니다.
Eigen 라이브러리를 이용하여 위의 식을 풀기 위해서는 Ax = B 형태로 Matrix를 만들어줘야 합니다. 그래서 Ax Matrix가 ax + by + c 이 식을 표현해야 하고, B Matrix는 -x^2 - y^2를 표현해야 합니다. 세 점을 (x1, y1), (x2, y2), (x3, y3)라고 한다면 매트릭스 Ax = B는 아래와 같이 표현할 수 있습니다.
(x1 y1 1) (a) = (-(x1*x1) - (y1*y1))
(x2 y2 1) (b) = (-(x2*x2) - (y2*y2))
(x3 y3 1) (c) = (-(x3*x3) - (y3*y3))
이 Matrix 정보를 Eigen 라이브러리를 이용해서 구하게 되면 쉽게 a, b, c를 구할 수가 있습니다.
아래와 같이 A, B, C 3개의 점이 주어졌을 때
Eigen 라이브러리를 이용해서 중심을 구하는 코드입니다.
float x1 = 3.0;
float y1 = 3.0;
float x2 = 3.0;
float y2 = 2.0;
float x3 = 1.0;
float y3 = 2.0;
Eigen::MatrixXd A(3, 3);
A(0, 0) = x1;
A(0, 1) = y1;
A(0, 2) = 1;
A(1, 0) = x2;
A(1, 1) = y2;
A(1, 2) = 1;
A(2, 0) = x3;
A(2, 1) = y3;
A(2, 2) = 1;
Eigen::VectorXd b(3);
b(0) = -(x1*x1) - (y1*y1);
b(1) = -(x2*x2) - (y2*y2);
b(2) = -(x3*x3) - (y3*y3);
Eigen::VectorXd x = A.colPivHouseholderQr().solve(b);
// 결과 출력
std::cout << "미지수 x(0): " << -0.5*x(0) << std::endl;
std::cout << "미지수 x(1): " << -0.5*x(1) << std::endl;
원의 중심을 구하는 것 외에도 2차 curve fitting, line fitting 등의 문제를 Ax=B 형태(선형 시스템의 최소자승법)로 만들어서 Eigen 라이브러리를 이용해 해결하는 경우가 많으니 잘 활용하시기 바랍니다.
'3D Algorithm' 카테고리의 다른 글
AABB OBB 차이와 의미 (0) | 2023.12.11 |
---|---|
행기준 열기준 행렬 개발자 주의점(Transform Matrix) (0) | 2023.12.05 |
CCW(Counter Clockwise) 정의와 판별 알고리즘 (0) | 2023.11.13 |
Backface Culling 의미와 기본 원리 (0) | 2023.11.08 |
곡률 의미와 3D 개발 활용(Curvature) (0) | 2023.11.03 |