2006년 4월 1일 토요일

[CG]circular arc 그리기

. (x1, y1), (x2, y2), (x3, y3) 세점이 주어졌을 때
(x1, y1) -> (x2, y2) -> (x3, y3)를 차례로 지나는 arc를 그린다.
. 점을 지나는 순서를 지켜야 한다는 사실이 중요하다. 그렇게 해야 unique하게 arc가 결정된다.
. 두 점과 원의 중심이 주어지는 경우에는 arc가 unique하게 결정되지 않고 시계방향과 반시계방향의 2개가 나온다.

// theta들은 360 degree(not radian)

// 두 각이 입력되었을 때 같은 각인지 검사한다.
bool isEqualDegree(const int theta1, const int theta2)
{
int diff = (theta1 - theta2) % 360;

if (diff == 0)
return true;

return false;
}

int arcDirectionTest(const int theta1, const int theta2, const int theta3)
{
// 시계방향으로 돌아야 할지, 반시계방향으로 돌아야 할지 test
// direction = 1 : 반시계방향
// direction = -1 : 시계방향
int direction = 1;

for (int theta_i = theta1; theta_i < 360 + theta1; theta_i++)
{
if (isEqualDegree(theta_i, theta3)) {
// theta2를 theta3보다 먼저 지나게 그려야 하므로
// 방향을 바꾸자.
direction = -1;
break;
}

if (isEqualDegree(theta_i, theta2)) {
// theta2를 theta3보다 먼저 지나고 있으므로 방향 유지
break;
}
}

return direction;
}

// arc 그리기
direction = arcDirectionTest(theta1, theta2, theta3);
int theta_i = theta1;

while(1)
{
if (theta_i >= 180) {
theta_i = -179;
}

if (theta_i <= -180) {
theta_i = 180
}
// -179 <= theta_i <= 180

glVertex3f(x0 + r * cos(theta_i) , y0 + r * sin(theta_i), 0);

if (isEqualDegree(theta_i, theta3))
break;

theta_i += direction
}

댓글 없음:

댓글 쓰기