2009-02-24 22 views
13

this programming gameについては、現在ビルド中です。 (それを回転させる)WPF:回転後の新しい座標の取得

[同じTransformationGroup子供] TranslateTransformは(それを移動する)、およびRotateTransform

alt text http://img12.imageshack.us/img12/2089/shapetransformationf.jpg

WPFでキャンバスを翻訳するためには、私は2つのフォームを使用していますキャンバスの左上x、y座標は、回転していないとき(または90degで回転しているときは同じなので)簡単に取得できますが、私が直面している問題は左上(および他の3点)座標。

RotateTransform

が印加されると、TranslateTransformXY特性が変化(ひいては依然として正方形の左上の点線の正方形(画像から)

ようなものであることを示していないからです

それがその起源であるので、キャンバスは、その中心から回転している。

のでどのように私は回転後に「新しい」xと4点のy座標を得ることができますか?

回転からOffsetXとOffsetYを追加することで、私は回転後左上座標を見つけるための方法を発見した[UPDATE]

alt text http://img25.imageshack.us/img25/8676/shaperotationaltransfor.jpg

(あなたが新しいイメージから見ることができるように)開始X座標とY座標に変換します。

しかし、残りの座標(他の3つ)を計算するのに問題があります。

この回転した形状の場合、残りの3つのコーナーのx座標とy座標をどのように把握できますか?

[EDIT]

2画像の点、正確かつEXACT POINTSされません。私は私の頭の中で見積もりでポイントを作った。

[UPDATE]策:すべての

まず、私は彼が全体のプロセスの背後にある数学を記述すること長々と非常に有益なポストのためJason Sに感謝したいと思います。あなたの投稿を読んだり、価値観を試したりすることによって、私は確かに多くのことを学んだ。

しかし、私は今、私が欲しいものを正確に行うコードスニペット(TransformBoundsEugeneZの言及のおかげで)を発見した:

public Rect GetBounds(FrameworkElement of, FrameworkElement from) 
{ 
    // Might throw an exception if of and from are not in the same visual tree 
    GeneralTransform transform = of.TransformToVisual(from); 

    return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight)); 
} 

参考:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/86350f19-6457-470e-bde9-66e8970f7059/

+0

あなたが最も簡単な方法は、 http://stackoverflow.com/a/22511805/2106820 –

答えて

13

私はあなたの質問の権利を理解している場合:

(x'-xc) = Kc*(x-xc) - Ks*(y-yc) 
(y'-yc) = Ks*(x-xc) + Kc*(y-yc) 

Kc=cos(theta)Ks=sin(theta)thetaが反時計回りに回転の角度です:

given: 
shape has corner (x1,y1), center (xc,yc) 
rotated shape has corner (x1',y1') after being rotated about center 

desired: 
how to map any point of the shape (x,y) -> (x',y') by that same rotation 

をここでは、関連の方程式です。 (theta = 0の場合、これは座標を変化させず、xc = yc = 0の場合、(1,0)から(cos(theta)、sin(theta))および(0,1)注意:これは、(x、y)=(1,1)が右上の象限にある座標系用です。右下の四分円にあるあなたの場合、シータは次のようになります。 )反時計回りではなく時計回りの角度)

xy軸に揃えられた長方形の座標を知っていれば、xcは2つのx座標の平均になり、ycはちょうど2つのy座標。

シータが分かっていれば、新しい座標を計算するのに十分な情報が得られるようになりました。 シータがわからない場合は、Kc、Ksを解くことができます。解決することができsystem of linear equations(読者のための運動です

(62-75) = Kc*(50-75) - Ks*(50-85) 
(40-85) = Ks*(50-75) + Kc*(50-85) 

-13 = -25*Kc + 35*Ks = -25*Kc + 35*Ks 
-45 = -25*Ks - 35*Kc = -35*Kc - 25*Ks 

:ここではあなたの例に関連する計算だMATLABにそれはあります:

[-25 35;-35 -25]\[-13;-45] 

、この場合には、生成するために、Kcを= 1.027 、Ks = 0.3622これは意味をなさない(K = Kc + Ks は、純粋なローテーションでは1になります;この場合はK = 1.089です)四角形の中心、これはあなたの描画の指示ですates。それは原点についての純粋な回転ではないようです。確認するには、ピタゴラス定理を使用して、回転前後の回転中心からの距離を比較します。d = deltax + deltay (xc = 75、yc = 85、前の距離は43.01、後の距離は46.84、比率はK = 1.089、原点を中心に回転する前は70.71、後の距離は73.78、比は1.043です。 1.01以下の比率は整数への座標の丸めによって発生すると考えられますが、これは丸め誤差よりも明らかに大きい)

ここにはいくつかの情報がありません。あなたはどのように数字を得ましたか(62,40)?

これは、回転の背後にある数学の基本的な要点です。

編集:aha、私は彼らが見積もりであることを認識しませんでした。 (しかし、現実的にはかなり近いです)

+0

これらの数値は、開始X座標とY座標をOffsetXに加算し、回転行列。したがって、OffsetXが12で、「回転していない」シェイプのXが50の場合、新しいX(回転後)は62です。Y座標 –

+0

Btwについても同様です。実際のポイントは、オフセットでさえ本当のものではありません。私はちょうどイメージのためにそれらを作った –

+0

私は値が大まかな見積もりだと思う、彼は例としてイラストを示した。 – Drahcir

1

私はわからないんだけどこれはあなたが探しているものです - デカルト座標系の点の回転: link

+0

はそれを見ているのでしょう見つける見つけることができます。ありがとう。 –

1

n同じTransformでPoint上でTransform.Transform()メソッドを使用して、これらの変換が適用された新しいポイントを取得します。

+0

Transform()はPoint変数を受け入れます。その点のxとyはどうなるべきですか? –

+0

キャンバスの左端と上端 –

+0

あなたの更新された質問に関連して、Transform()メソッドは、あなたの四角形の他のコーナーを含め、任意のポイントで必要なものを正確に行います。 –

2

GeneralTransform.TransformBounds()メソッドを見てください。 rotateTransformは私が等...仕事と角度を設定しているインスタンスをある

Point newPoint = rotateTransform.Transform(new Point(oldX, oldY)); 

6

は、私は、このメソッドを使用します。ここで

関連する問題