문제

벡터 (C ++)의 특정 지점 주위에서 벡터를 회전 시키려고합니다.

1 2 3
4 5 6
7 8 9

포인트 (1,1) ( "5") 90도 주위를 돌면서 회전합니다.

7 4 1
8 5 2
9 6 3

지금은 사용 중입니다.

x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))

하지만 나는 그것이 회전하는 것을 원하지 않는다 (0,0)

도움이 되었습니까?

해결책

처럼 Mehrdad Afshari 댓글을 달았습니다 페스토원래 좌표 시스템으로 다시 번역을 포함한 게시물은 다음과 같습니다.

x_rotated = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle)) + x_origin
y_rotated = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle)) + y_origin

다른 팁

해결책은 벡터를 회전 중심이 (0,0) 인 좌표계로 변환하는 것입니다. 회전 행렬을 적용하고 벡터를 원래 좌표계로 다시 번역하십시오.

dx = x of rotation center  
dy = y of rotation center

V2 = V - [dx, dy, 0]  
V3 = V2 * rotation matrix  
Result = V3 + [dx, dy, 0]

(0,0)가 왼쪽 상단 코너가되고 지점 (x_origin, y_origin)을 중심으로 회전하는 표준 벡터 구현을 사용한다고 가정하면 다음을 수행해야합니다.

x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))

Y는입니다 y_origin - y 내려 가면 y 값이 증가하기 때문입니다.

당신은 a를 사용해야합니다 번역 매트릭스 다른 지점에 대해 회전하려면 이동합니다.

나는 Marc Booth의 답변이 잘못되었다는 것을 알았습니다 (0.1,0)가 0 도로 회전하고 그의 공식으로 (0, -1,0)을 얻었습니다).

double cs = cos_deg(new_degrees);
double sn = sin_deg(new_degrees);

double translated_x = x - x_origin;
double translated_y = y - y_origin;

double result_x = translated_x * cs - translated_y * sn;
double result_y = translated_x * sn + translated_y * cs;

result_x += x_origin;
result_y += y_origin;

물론 이것은 더 단순화 될 수 있지만 가능한 한 간단하게 만들고 싶습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top