좌표 변환: 회전 이동
아래 그림에서와 같이, 원래의 좌표를 (x, y)라 하고, y축으로부터의 각도를 θ라고 하자. 또, 회전 시키고자하는 각도를 δ라 하고, 회전된 좌표를 (x', y')라고 한다.
이 때, 회전의 기준점과 원래의 좌표 사이의 거리를 r이라고 하면, 회전된 이후의 좌표와 회전 기준점 사이의 거리 또한 r로써 동일하다.
수식으로 정리하면,
x = r sinθ
y = r cosθ
x' = r sin(θ+δ)
y' = r cos(θ+δ)
삼각함수의 덧셈정리를 이용하여 x'와 y'를 풀어보면,
x' = r (sinθ cosδ + cosθ sinδ)
= r sinθ cosδ + r cosθ sinδ
y' = r (cosθ cosδ - sinθ sinδ)
= r cosθ cosδ - r sinθ sinδ
x = r sinθ, y = r cosθ이므로,
x' = x cosδ + y sinδ
y' = y cosδ - x sinδ
δ가 반시계방향인 경우에는,
x' = x cosδ - y sinδ
y' = y cosδ + x sinδ
라는 수식으로 정리될 수 있다.
이렇게 구한 공식을 도형의 각 꼭지점에 대해서 적용하면 회전 이동한 도형을 구할 수 있다.
이 때, 회전의 기준점과 원래의 좌표 사이의 거리를 r이라고 하면, 회전된 이후의 좌표와 회전 기준점 사이의 거리 또한 r로써 동일하다.
수식으로 정리하면,
x = r sinθ
y = r cosθ
x' = r sin(θ+δ)
y' = r cos(θ+δ)
삼각함수의 덧셈정리를 이용하여 x'와 y'를 풀어보면,
= r sinθ cosδ + r cosθ sinδ
y' = r (cosθ cosδ - sinθ sinδ)
= r cosθ cosδ - r sinθ sinδ
x = r sinθ, y = r cosθ이므로,
x' = x cosδ + y sinδ
y' = y cosδ - x sinδ
δ가 반시계방향인 경우에는,
x' = x cosδ - y sinδ
y' = y cosδ + x sinδ
라는 수식으로 정리될 수 있다.
이렇게 구한 공식을 도형의 각 꼭지점에 대해서 적용하면 회전 이동한 도형을 구할 수 있다.
public void rotateBy(float d, float x0, float y0) { float dX = x - x0; float dY = y - y0; double rad = Math.abs(Math.toRadians(d)); float cosD = (float) Math.cos(rad); float sinD = (float) Math.sin(rad); if (d>=0) { x = dX * cosD + dY * sinD; y = dY * cosD - dX * sinD; } else { x = dX * cosD - dY * sinD; y = dY * cosD + dX * sinD; } x += x0; y += y0; }
댓글
댓글 쓰기