2009-02-10 27 views
4

參照this programming game我目前正在建造。數學(在WPF中):在翻譯之後獲取新的x,y座標

我正在使用WPF設置畫布動畫,並且我使用BeginAnimation方法將畫布轉換(移動)到另一個畫布上。

隨着BeginAnimation,我需要指定x和y的FromTo座標,這是我使用這個像這樣的方法:

//X 
Animator_Body_X.From = Translate_Body.X; //Current x-coordinate 
Animator_Body_X.To = //The end X-coordinate 
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X); 

//Y 
Animator_Body_Y.From = Translate_Body.Y; //Current y-coordinate 
Animator_Body_Y.To = //The end Y-coordinate 
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y); 

現在畫布需要使用翻譯一個給定的角度,我可以從該方法中獲得。

所以我的問題是,給定了畫布當前旋轉的角度(0-359),開始x和y座標(畫布當前位於的位置)和距離(px),我該如何計算結束座標?即畫布最終將被翻譯成的位置。

alt text http://img244.imageshack.us/img244/4794/canvastranspositionmi5.jpg

在上圖中,我畫的是我想達到一個例子。

假設畫布(固體邊界框)的當前標題(角度)爲130度,並且需要將它翻譯(沿着該角度下的路徑;即根據當前所在的位置)200像素...畫布的新座標(它將停止動畫:虛線邊框)將會是什麼?我如何計算這些新座標的停止位置?

[更新]解決方案:

由於雙方AndyCameron的幫助下,終於如預期運行。

這裏是工作代碼:

double headingRadians = Heading * (Math.PI/180); 

Animator_Body_X.From = Translate_Body.X; 
Animator_Body_X.To = Math.Sin(headingRadians) * pix + Translate_Body.X; 
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X); 

Animator_Body_Y.From = Translate_Body.Y; 
Animator_Body_Y.To = ((Math.Cos(headingRadians) * pix) * -1) + Translate_Body.Y; 
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y); 

回答

3

假設你從12點順時針旋轉,新的x座標將是:

sin(130) * 200 = 153 + original x-coordinate 

而且新Y-座標將是

cos(130) * 200 = -129 + original y-coordinate (assuming negative 'y' is down) 

正如下面,請注意,在C#,例如,sincos以弧度爲單位,而不是度數 - 乘以Math.PI/180以首先獲得弧度值。

+0

它幾乎與你的方程一起工作。 但它向後移動,而不是向前移動。我應該在等式中改變什麼? – 2009-02-10 22:40:44

+0

由x和y的變量,你的意思是出發點? – 2009-02-10 22:46:09

+1

是的 - 出發點。 如果在向下移動頁面時,'y'座標變大,則可能必須將cos(130)* 200的結果乘以-1。 – 2009-02-10 22:52:23

0

TransformToVisual如果您在從視覺上有產地的對象的協調和你希望你的對象從Visual乙原點的座標,那麼你做

var transformation = A.TransformToVisual(B); 

你可以從GeneralTransform投轉型如果需要轉換。 然後你可以使用你的GeneralTransform對象的Transform方法。

2

您可以使用cossin計算x和y座標中的移動量。這是基於unit circle

單位圓的角度從右側開始逆時針旋轉。所以在單位圓中你130度的角度實際上是320度。

actualAngle = 90 - 130 = -40 
(which is the same as 320 degrees when used in sin/cos) 

另外要注意的是,cossin功能使用radians代替度。

angleInRadians = 320 * pi/180 (about 5.59) 
x = cos(angleInRadians) * 200 + 300 (about 453.21) 
y = sin(angleInRadians) * 200 + 400 (about 271.44) 
0

我將詳細介紹瞭如何在不使用數學做:

需要注意的是,我沒有嘗試我在說什麼,也許有一些錯誤。

我會打電話給你方是移動視覺B,

我會打電話給方視覺A.

的集裝箱現在,你希望能夠到的B產地做B超的翻譯到B',並從A原點檢索B'座標。

如果您的翻譯是(200,0),那麼從B原點開始的B'座標是(200,0)。 你想從A原點獲得這些座標。所以你必須這樣做。

var transform = B.TransformToVisual(A); 
var pointFromAOrigin = transform.Transform(new Point(200,0)); 

pointFromAOrigin反映你想要什麼。