2011-12-01 84 views
0

這是形式,但我不知道如何實現它。能有人幫我需要實現一個2D形狀的旋轉功能

enter image description here

enter image description here

rectangle::rectangle() //rectangle constructor 
{ 
    bl.real() = 0; //bottom 
    bl.imag() = 0; //left 

    tr.real() = 1; //top 
    tr.imag() = 1; //right 
} 

complex<double> rectangle::get_bl() const 
{ 
    return bl; 
} 

complex<double> rectangle::get_tr() const 
{ 
    return tr; 
} 

void rectangle::rotate(double angle) 
{ 
    //not sure how to do it tr = tr.real() * cos(angle) + tr.imag() *cos(angle); 


} 

主要

rectangle r; 
r.rotate(90); 

預期輸出(不是100%確定)

0 0 -1 1 
+0

你繞左下角點的矩形? – Blender

+0

@Blender是的(0,0) – code511788465541441

+0

你爲什麼要將矩形存儲爲兩個std :: complex? –

回答

2
  1. 你的形狀移到(0, 0)暫時(公式假定你正在繞原點旋轉,所以將左下角移至(0, 0))。
  2. 應用公式。
  3. 將其移回。

if (tr.real() < bl.real()) { 
    float tempX = tr.real() - bl.real(); 
    float tempY = tr.imag() - bl.imag(); 
} else { 
    float tempX = bl.real() - tr.real(); 
    float tempY = bl.imag() - tr.imag(); 
} 

tr.real() = tempX * cos(theta) - tempY * sin(theta) 
tr.imag() = tempx * sin(theta) + tempY * cos(theta) 
+0

,給出0 0 1.34207 -0.445923。是「theta」的角度?我不得不聲明tempX和tempY在if語句的外側,所以它的工作原理,但輸出看起來不正確 – code511788465541441

+0

你的意思是將形狀的中心移動到'(0,0)',否則你正在旋轉形狀它的左下角。編輯:看到了評論,你的回答是對的我的錯誤是正確的,圍繞'bl'角落做這件事似乎很奇怪。 – Serdalis

+0

@ user521180:'cos()'以弧度表示,而不是度數。轉換你的角度。 – Blender

0

的公式基本上是說:

new_x = shape.point[i].x*cos(angle) - shape.point[i].y*sin(angle) 
new_y = shape.point[i].x*sin(angle) + shape.point[i].y*cos(angle) 
shape.point[i].x = new_x 
shape.point[i].y = new_y 

角弧度,從度轉換爲弧度使用
degree*pi/180其中pi是恆定的3.14...

你需要對每一個點做到這一點形狀以完全旋轉期望程度的形狀。

該公式還假定點以(0,0)爲中心,即形狀的中心爲(0,0),所有點都相對於該中心。


一個提示,如果適用,嘗試和存儲形狀,點,從0th點順時針方向進行。例如,這個矩形是:

point[0] = {-1, 1} 
point[1] = { 1, 1} 
point[2] = { 1,-1} 
point[3] = {-1,-1} 

tl, br轉換爲points你需要做類似的東西:

point[0] = {tl.x, tl.y} 
point[1] = {br.x, tl.y} 
point[2] = {br.x, br.y} 
point[3] = {tl.x, br.y} 
+0

我有點困惑。這些變量如何與我的礦工匹配?你能否用我使用的變量名寫出該公式 – code511788465541441

+0

我不會推薦你這樣做。我同意,存儲矩形的最節省空間的方法是使用'tl','br',但在這種情況下使用的公式不適用於沒有進行某些處理的座標。這將是良好的做法:P – Serdalis