2009-09-24 200 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

我只想改變每個點,應用相同的旋轉矩陣各去一次。如果它是一個二維平面的旋轉,它看起來像這樣:

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

其中(x,y)是原始點,(X「 Y」)是旋轉座標,並且t是在測量的角來自X軸的弧度。書面形式的旋轉是逆時針的。

我的建議是在紙上做一次。繪製一個矩形,計算新的座標,並重新繪製矩形,以確保在編碼之前它是正確的。然後使用這個例子作爲單元測試來確保你編碼正確。

+1

+1 - 我傾向於旋轉回來,然後做任何工作,使生活更簡單。 – 2009-09-24 00:45:43

+2

通過這種方式,您只需執行2個觸發操作(如果在計算任何旋轉的頂點之前存儲'cos(t)'和'sin(t)'的結果)。 – jnylen 2009-09-24 01:55:41

+0

這個公式將如何順時針旋轉? – 2012-09-06 19:35:38

2

我想你是在正確的軌道上使用atan()返回一個角度。但是你想通過height除以width而不是其他方式。這會給你默認的(未旋轉的)角度到矩形的右上頂點。你應該可以這樣做:

// 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. 

爲清楚起見,顯然比必要的更加冗長。當然,使用變換矩陣的duffymo的解決方案可能更優雅和高效:)

編輯:現在我的代碼應該實際工作。我將(width/height)更改爲(height/width),並使用矩形中心的恆定半徑來計算頂點。工作Python(海龜)代碼http://pastebin.com/f1c76308c

+0

DEG_TO_RAD是我寫的一個宏。 – 2009-10-04 06:33:42