4

このプログラミングゲームを参考にして、現在作成中です。

WPFを使用してキャンバスをアニメーション化し、このBeginAnimationメソッドを使用して、キャンバスを別のキャンバス間で変換(移動)します。

BeginAnimationでは、xとyの両方の座標Fromと座標を指定する必要があります。これは、次のように使用している方法です。To

//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)を開始して、終了座標を計算するにはどうすればよいですか?つまり、キャンバスが最終的に翻訳される場所です。

代替テキストhttp://img244.imageshack.us/img244/4794/canvastranspositionmi5.jpg

上の画像では、私が達成したいことの例を描いています。

キャンバス(黒枠のボックス)の現在の方位(角度)が130度であり、200ピクセル(現在向いている場所に応じて、その角度を下るパスをたどる)に変換する必要があるとします。キャンバスの新しい座標(アニメーションが停止する場所:破線の境界線ボックス)になりますか?停止する場所のこれらの新しい座標を計算するにはどうすればよいですか?

[更新]解決策:

アンディキャメロンの両方の助けを借りて、それは最終的に意図したとおりに機能しています。

そして、ここに動作するコードがあります:

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);
4

4 に答える 4

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

于 2009-02-10T22:17:57.563 に答える
2

を使用cossinて、x座標とy座標の移動量を計算できます。これは単位円に基づいています。

単位円の角度は右側から反時計回りになります。したがって、単位円では、130度の角度は実際には320度です。

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

もう1つの注意点は、cosandsin関数が度ではなくラジアンを使用していることです。

angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)
于 2009-02-10T22:55:07.273 に答える
1

数学を使わずにできることを詳しく説明します。

私が言っていることを試していないので、間違いがあるかもしれないことに注意してください。

あなたが動かしているマスをビジュアル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 は、必要なものを反映します。

于 2009-02-10T23:17:53.177 に答える
0

Visual Aの原点からのオブジェクトの座標があり、Visual Bの原点からのオブジェクトの座標が必要な場合は、 TransformToVisualを見てください。

   var transformation = A.TransformToVisual(B);

必要に応じて、GeneralTransformからTransformに変換をキャストできます。次に、GeneralTransformオブジェクトのTransformメソッドを使用できます。

于 2009-02-10T22:33:59.617 に答える