좌표 변환: 회전 이동

아래 그림에서와 같이, 원래의 좌표를 (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δ
라는 수식으로 정리될 수 있다.


이렇게 구한 공식을 도형의 각 꼭지점에 대해서 적용하면 회전 이동한 도형을 구할 수 있다.

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;
}

댓글

이 블로그의 인기 게시물

자바 암호화 확장 (JCE) 관련 자바 1.8.0_151 이후 변경 사항

Apache Commons CSV