2009-09-24 5 views
6

안녕하세요 여러분, 회전 된 사각형 (2D)의 정점을 계산하려고합니다.회전 된 사각형의 정점 계산

직사각형이 회전되지 않았 으면 충분합니다. 그 부분을 알아낼 수 있습니다.

사각형이 회전 된 경우 꼭지점을 계산할 수있는 두 가지 방법이 있다고 생각했습니다. 1) 로컬/오브젝트/모델 공간 (아래에서 알아 낸 것들)에서 월드 공간으로 버텍스를 변환하는 방법을 찾아보십시오. 나는 솔직히 아무런 단서도없고, 그것이 최선의 방법이라면 나는 그것을 알아낼 수 있다면 많이 배울 것 같은 기분이 든다. ...

2) trig를 사용하여 어떻게 든 그 끝점을 알아 낸다. 직사각형은 월드 공간에서 직사각형의 위치에 상대적입니다. 이것은 내가 지금까지 해보려고했던 방식이었고, 나는 단지 방법을 알아 내지 못했습니다.

여기에, 어떤 도움

void Rect::calculateVertices() 
{ 
    if(m_orientation == 0) // if no rotation 
    { 
     setVertices(
     &Vertex((m_position.x - (m_width/2) * m_scaleX), (m_position.y + (m_height/2) * m_scaleY), m_position.z), 
     &Vertex((m_position.x + (m_width/2) * m_scaleX), (m_position.y + (m_height/2) * m_scaleY), m_position.z), 
     &Vertex((m_position.x + (m_width/2) * m_scaleX), (m_position.y - (m_height/2) * m_scaleY), m_position.z), 
     &Vertex((m_position.x - (m_width/2) * m_scaleX), (m_position.y - (m_height/2) * m_scaleY), m_position.z)); 
    } 
    else 
    { 
     // if the rectangle has been rotated.. 
    } 

    //GLfloat theta = RAD_TO_DEG(atan(((m_width/2) * m_scaleX)/((m_height/2) * m_scaleY))); 
    //LOG->writeLn(&theta); 

} 

답변

16

난 그냥 하나 하나에 동일한 회전 행렬을 적용, 각 지점을 변환 것이다 주셔서 감사합니다 지금까지 정점을 계산하는 기능입니다. 이 2 차원 평면 회전의 경우는 다음과 같을 것이다 :

x' = x*cos(t) - y*sin(t) 
y' = x*sin(t) + y*cos(t) 

여기서 (x, y)는 원 포인트 회전 좌표는 (X는 ', Y')이며, t는 측정 된 각도 라디안 x 축. 회전은 기록 된대로 시계 반대 방향입니다.

내 권장 사항은 종이에 한 번만 제출하는 것입니다. 직사각형을 그린 후 새 좌표를 계산하고 코드를 작성하기 전에 직사각형을 다시 그리면됩니다. 그런 다음이 예제를 단위 테스트로 사용하여 올바르게 코딩했는지 확인하십시오.

+1

+1에 근무중인 파이썬 (거북이) 코드 - 나는 다시 돌아가는 것을 선호하고 어떤 일을하는 것이 더 쉽습니다. –

+2

회전 된 정점을 계산하기 전에'cos (t)'와'sin (t)'의 결과를 저장하면 2 trig 연산 만 수행하면됩니다. – jnylen

+0

이 수식은 시계 방향으로 어떻게 회전합니까? –

2

각도를 반환하려면 atan()을 사용하여 올바른 길을 가고 있다고 생각합니다. 그러나 heightwidth으로 나눈 값을 다른 값으로 나누지 않고 전달하려고합니다. 그러면 직사각형의 오른쪽 위 정점에 대한 기본 (회전되지 않은) 각도가 제공됩니다. 이 같은 나머지를 할 수 있어야한다 : 명확성을 위해, 필요 이상으로

// Get the original/default vertex angles 
GLfloat vertex1_theta = RAD_TO_DEG(atan(
      (m_height/2 * m_scaleY) 
      /(m_width/2 * m_scaleX))); 
GLfloat vertex2_theta = -vertex1_theta; // lower right vertex 
GLfloat vertex3_theta = vertex1_theta - 180; // lower left vertex 
GLfloat vertex4_theta = 180 - vertex1_theta; // upper left vertex 

// Now get the rotated vertex angles 
vertex1_theta += rotation_angle; 
vertex2_theta += rotation_angle; 
vertex3_theta += rotation_angle; 
vertex4_theta += rotation_angle; 

//Calculate the distance from the center (same for each vertex) 
GLfloat r = sqrt(pow(m_width/2*m_scaleX, 2) + pow(m_height/2*m_scaleY, 2)); 

/* Calculate each vertex (I'm not familiar with OpenGL, DEG_TO_RAD 
* might be a constant instead of a macro) 
*/ 
vertexN_x = m_position.x + cos(DEG_TO_RAD(vertexN_theta)) * r; 
vertexN_y = m_position.y + sin(DEG_TO_RAD(vertexN_theta)) * r; 

// Now you would draw the rectangle, proceeding from vertex1 to vertex4. 

분명히 더 longwinded. 물론 변환 매트릭스를 사용하는 더피 모의 솔루션은 아마도 더 우아하고 효율적일 것입니다 :

EDIT : 이제 내 코드가 실제로 작동해야합니다. (width/height)(height/width)으로 변경하고 직사각형 중심에서 일정한 반경을 사용하여 정점을 계산했습니다. http://pastebin.com/f1c76308c

+0

DEG_TO_RAD는 내가 작성한 매크로입니다. –