본문 바로가기
3D Algorithm

세 점을 지나는 원 중심 계산(Eigen Library 이용한 최소자승법)

by DarkRock 2023. 11. 28.
반응형

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 라이브러리를 이용해 해결하는 경우가 많으니 잘 활용하시기 바랍니다.

반응형