글 수 44
좌표 회전 변환이란?
예를들어 (1,2) 의 좌표를 기준으로 (4,4)를 40도 회전하였을때 좌표는 어디인가? 를 구할수 있는 변환이다.
원점에 대해서 θ도 회전시킬 때, 기존 좌표를 (x , y), 변환된 좌표를 (x' , y')라 하면 다음과 같은 식이 성립합니다.
식의 증명은 아래와 같이 삼각함수 덧셈공식을 이용하면 가능합니다.
#include <stdio.h>
#include <math.h> // sin(.), cos(..)
#define PI 3.14159
/*
원점(origin) : O( 0, 0 )
회전할 대상(taget) : T( tx, ty ),
회전중심점(center) : C( cx, cy),
회전후의점(new pt) : N( nx, ny),
주어진 회전중심점 C에 대하여 회전하는 문제는
회전중심점 C가 원점 0와 일치하도록 회전할 점 T를 함께 평행이동한 후
z-축을 중심으로하여 원점 0에서 주어진 각 q만큼 회전하고
다시 원점 0가 처음 주어진 회전중심점 C와 일치하도록 함께 평행이동합니다.*/
void rotate( float* nx, float* ny, float tx, float ty, float cx, float cy, float q )
{
float cosq = cos( q ), sinq = sin( q );
// 회전중심점 C가 원점 O와 일치하도록 회전할 점 T를 함께 평행이동
tx -= cx, ty -= cy;
// 원점 O에 대하여 회전할 점 T를 q라디안 만큼 회전
*nx = tx * cosq - ty * sinq;
*ny = ty * cosq + tx * sinq;
// 원점 O가 원래의 회전 중심점 C와 일치하도록 회전된 점 N과 함께 이동
*nx += cx, *ny += cy;
}
int main(void)
{
float tx, ty, cx, cy, nx, ny;
float deg, q;
printf( "회전대상점의 x좌표 입력 >> " );
scanf( "%f", &tx );
printf( "회전대상점의 y좌표 입력 >> " );
scanf( "%f", &ty );
printf( "\n회전중심점의 x좌표 입력 >> " );
scanf( "%f", &cx );
printf( "회전중심점의 y좌표 입력 >> " );
scanf( "%f", &cy );
printf( "\n회전각도(degree) 입력 >> " );
scanf( "%f", ° );
// 각도를 라디안으로 환산
q = deg * PI / 180;
rotate( &nx, &ny, tx, ty, cx, cy, q );
printf( "\n점(%.0f,%.0f)을 점(%.0f,%.0f)에 대하여 \n%.f도 만큼 회전한 위치는 (%.0f,%.0f)입니다.\n", tx, ty, cx, cy, deg, nx, ny );
return 0;
}
#include <math.h> // sin(.), cos(..)
#define PI 3.14159
/*
원점(origin) : O( 0, 0 )
회전할 대상(taget) : T( tx, ty ),
회전중심점(center) : C( cx, cy),
회전후의점(new pt) : N( nx, ny),
주어진 회전중심점 C에 대하여 회전하는 문제는
회전중심점 C가 원점 0와 일치하도록 회전할 점 T를 함께 평행이동한 후
z-축을 중심으로하여 원점 0에서 주어진 각 q만큼 회전하고
다시 원점 0가 처음 주어진 회전중심점 C와 일치하도록 함께 평행이동합니다.*/
void rotate( float* nx, float* ny, float tx, float ty, float cx, float cy, float q )
{
float cosq = cos( q ), sinq = sin( q );
// 회전중심점 C가 원점 O와 일치하도록 회전할 점 T를 함께 평행이동
tx -= cx, ty -= cy;
// 원점 O에 대하여 회전할 점 T를 q라디안 만큼 회전
*nx = tx * cosq - ty * sinq;
*ny = ty * cosq + tx * sinq;
// 원점 O가 원래의 회전 중심점 C와 일치하도록 회전된 점 N과 함께 이동
*nx += cx, *ny += cy;
}
int main(void)
{
float tx, ty, cx, cy, nx, ny;
float deg, q;
printf( "회전대상점의 x좌표 입력 >> " );
scanf( "%f", &tx );
printf( "회전대상점의 y좌표 입력 >> " );
scanf( "%f", &ty );
printf( "\n회전중심점의 x좌표 입력 >> " );
scanf( "%f", &cx );
printf( "회전중심점의 y좌표 입력 >> " );
scanf( "%f", &cy );
printf( "\n회전각도(degree) 입력 >> " );
scanf( "%f", ° );
// 각도를 라디안으로 환산
q = deg * PI / 180;
rotate( &nx, &ny, tx, ty, cx, cy, q );
printf( "\n점(%.0f,%.0f)을 점(%.0f,%.0f)에 대하여 \n%.f도 만큼 회전한 위치는 (%.0f,%.0f)입니다.\n", tx, ty, cx, cy, deg, nx, ny );
return 0;
}
