2010-08-17 70 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簡直是

struct POINTFLOAT { 
float x; 
float y; 
} 

的問題是,該點需要鼠標移動上進行更新。我正在尋找一種方式來做到這一點而不做以下:

Store original points 
Rotate Original points 
Copy result 
Show Result 
Rotate Original points 
Copy result 
Show Result.... 

我覺得存儲原件似乎凌亂和使用額外的內存。有沒有辦法,知道前一個旋轉角度和當前的旋轉角度,我可以避免將變換始終應用於原始點,並且僅僅基於我正在修改的點?

*中心將永遠不會改變,直到鼠標擡起所以那不是一個問題

感謝

+4

每當我看到一個問題,標記C和C++我的頭想要爆炸 – James 2010-08-17 15:35:47

+2

將頭[[explode()'](http://php.net/manual/en/function.explode.php)如果它被標記爲[c,C++和php](http://stackoverflow.com/questions/tagged/c%20c%2b%2b%20php)? :p – kennytm 2010-08-17 15:38:18

+0

此外,這似乎是一個基於數學的問題,即可能在math.stackexchange上找到更好的答案。 – James 2010-08-17 15:38:49

回答

1

如果你從新的旋轉減去舊的旋轉,你會得到一個值,你應該能夠用來旋轉已經修改的點。請注意,這需要存儲舊的旋轉,並且越多地翻譯它們,座標越精確,越不準確。不過,這對政府工作來說已經足夠接近了。

+0

所以如果ang是3,現在是4,我只需要旋轉1種類型的東西? – jmasterx 2010-08-17 15:45:54

+0

@Milo:對。這應該可以。重讀有關座標精度的部分 - 雖然這會發生很多相同的問題,但舍入誤差可能會讓你感到困惑。 – cHao 2010-08-17 15:48:48

+0

這個誤差幅度是否明顯可見?我正在旋轉矢量繪圖應用程序中的多邊形。 – jmasterx 2010-08-17 15:50:49

1

所以,而不是存儲前一點,你寧願保存先前的角度?

也許我可以阻止你這樣做。與其保持兩個浮點數的結構不同,你會保持一個浮點數(角度),但增加應用程序的複雜性,獲得很少的收益。

在6個月內重新訪問該代碼,您會想知道爲什麼您一直用三角函數來處理一個浮點數。

我的2¢。這是一個有趣的觸發問題:)

+0

不,它不只是保存2個漂浮,它不會是隻有1點,它可能是幾千,這意味着在按下鼠標複製千點,然後修改首次鼠標移動,原稿,然後重新複製舊的,然後對其進行修改等,它的很多... – jmasterx 2010-08-17 15:44:24

+0

哦,這是一個多邊形!我懂了。那麼,是的,cHao有權利。 – MPelletier 2010-08-17 16:11:24