2010-08-17 4 views
0

내 응용 프로그램에서는 마우스 위치에 따라 중심을 중심으로 회전 지점을 허용합니다. 나는 기본적으로이 같은 다른 점을 중심으로 점을 회전 해요 :이 호에 대한 도움

void CGlEngineFunctions::RotateAroundPointRad(const POINTFLOAT &center, const POINTFLOAT &in, POINTFLOAT &out, float angle) 
{ 
//x' = cos(theta)*x - sin(theta)*y 
//y' = sin(theta)*x + cos(theta)*y 

POINTFLOAT subtr; 
subtr.x = in.x - center.x; 
subtr.y = in.y - center.y; 

out.x = cos(angle)*subtr.x - sin(angle)*subtr.y; 
out.y = sin(angle)*subtr.x + cos(angle)*subtr.y; 

out.x += center.x; 
out.y += center.y; 
} 

을 POINTFLOAT이 문제는 포인트가 MouseMove 이벤트에 업데이트 할 필요가있다 단순히

struct POINTFLOAT { 
float x; 
float y; 
} 

입니다. 다음 작업을 수행하지 않고이 작업을 수행 할 방법을 찾고 있습니다.

난간이 더러워 져서 여분의 메모리를 사용하고 있다고 느낍니다. 이전의 회전 각도와 현재의 각도를 알고있는 방법이 있나요? 저는 원래의 포인트에 항상 변형을 적용하는 것을 피할 수 있습니다. 그리고 수정중인 포인트를 기반으로 구축 할 수 있습니까? 마우스까지 그렇게 대신 이전 지점을 저장하는, 문제를

감사합니다 그래서

+4

매번 내가 C와 C++로 태그 된 질문을 볼 때 내 머리가 폭발하려고한다. – James

+2

(http://php.net/manual/en/function.explode.php) [c, C++ and php] (http://stackoverflow.com/questions/tagged/c%20c%2b%2b%20php) 태그가 붙어 있습니까? : p – kennytm

+0

또한 수학 기반 질문 인 것처럼 보입니다. 즉, math.stackexchange에서 더 나은 답변을 찾을 수 있습니다. – James

답변

1

새 회전에서 이전 회전을 빼면 이미 수정 된 회전에 사용할 수있는 값이 생깁니다. 이를 위해서는 이전 로테이션을 저장해야하며 좌표가 점점 더 정확해질수록 정확도가 높아집니다. 그것은 정부 업무에 충분히 가깝습니다.

+0

그래서 ang이 3이고 이제는 4 일뿐입니다. 1 유형만큼 회전해야합니다. – jmasterx

+0

@Milo : 맞아. 괜찮아 질거야. 좌표를 잃는 좌표에 대해 다시 읽으십시오. 동일한 점이 많이 발생하면 반올림 오류로 인해 엉망이 될 수 있습니다. – cHao

+0

이 오차 범위는 눈에 띄게 눈에 띄게됩니까? 벡터 드로잉 응용 프로그램에서 다각형을 회전 중입니다. – jmasterx

1

를하지 이잖아까지

*이 중심이 절대 변하지 않을 것입니다, 당신은 오히려 이전의 각도를 저장하는 것?

아마 내가 그렇게하는 것을 막을 수 있습니다. 두 개의 float 구조체를 유지하는 대신 단일 플로트 (각도)를 유지하면서 응용 프로그램에 복잡성을 추가 할 수 있습니다.

6 개월 후에 코드를 다시 살펴보고 왜 한시적으로 하나의 플로트를 저장하기 위해 삼각법을 사용하여 모든 시간을 보냈는지 궁금 할 것입니다.

내 2 ¢. 그럼에도 불구하고 흥미로운 삼각 문제입니다.

+0

아니, 그저 2 개의 수레를 저장하는 것이 아니라 단지 1 포인트가 될 것입니다. 그것은 수천의 마우스 포인트를 복사하는 것을 의미합니다. 그리고 마우스를 움직일 때 원본을 수정 한 다음 오래된 것들을 다시 복사 한 다음 수정합니다. , 그것의 많은 ... – jmasterx

+0

오, 그것은 다각형을위한거야! 내가 참조. 그렇다면 그렇습니다. 카오 (Khao)는 권리가 있습니다. – MPelletier