2009-02-24 83 views
13

參照this programming game我目前正在建設中。WPF:旋轉後獲取新的座標

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

要翻譯WPF中一帆布,我使用兩種形式:TranslateTransform(移動它),並RotateTransform(旋轉它)[孩子一樣TransformationGroup]

當它未旋轉(或以90度旋轉,因爲它將是相同的)時,我可以很容易地獲得畫布左上角的x,y座標,但是我面臨的問題是獲取左上角(和其他3點)座標。

這是因爲當一個RotateTransform被施加,所述TranslateTransformXY特性不改變(且因此仍表明,左上方的是像虛線方(從圖像)

畫布正在從它的中心旋轉,所以這是它的起源。

所以我怎麼能得到「新」 x和4點的y座標旋轉後

[更新]

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

我已經找到了一種方法找到左上角旋轉後座標(你可以從全新的形象見)由旋轉加入OFFSETX和OFFSETY到起始的X和Y座標。

但我現在無法搞清楚其餘的座標(其他3)。

有了這個旋轉的形狀,我怎樣才能找出其餘3個角的x和y座標?

[編輯]

的所述第二圖像中點是不準確的EXACT POINTS。我在腦海中估計了點數。

[更新]解決方案:

首先,我要感謝Jason S爲他描述了整個過程背後的數學是漫長和非常豐富職務;通過閱讀您的文章並嘗試瞭解這些價值,我確實學到了很多東西。

但現在我已經找到了一個代碼片段(感謝EugeneZ的提TransformBounds)是不正是我想要的:

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 – 2014-03-19 16:14:06

回答

13

如果我明白你的問題正確:

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 

下面是相關的公式:

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

其中Kc=cos(theta)Ks=sin(theta)theta是逆時針旋轉的角度。 (以驗證:如果theta = 0,則這使得座標不變,否則如果xc = yc = 0,它將(1,0)映射到(cos(theta),sin(theta))和(0,1) sinat(theta),cos(theta))注意:這是用於座標系統,其中(x,y)=(1,1)在右上象限中,對於右下象限的座標系統,θ是順時針旋轉的角度而不是逆時針旋轉)

如果您知道與xy軸對齊的矩形的座標,xc將只是兩個x座標的平均值,而yc只是平均值兩個y座標。 (在你的情況下,它是xc = 75,yc = 85)。

如果你知道theta,你現在有足夠的信息來計算新的座標。 如果你不知道theta,你可以解決Kc,Ks。下面是你的榜樣的有關計算:

(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 

這是一個system of linear equations就能解決(讀者練習:在MATLAB是:

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

產生,在這種情況下,的Kc = 1.027 ,Ks = 0.3622這是沒有意義的(K = Kc + Ks 應該等於1代表純旋轉;在這種情況下它是K = 1.089),所以它不是純粹的旋轉矩形中心,這是你的繪圖指示阿泰。它似乎也不是關於原點的純粹旋轉。使用畢達哥拉斯定理比較旋轉前後旋轉中心的距離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,我沒有意識到他們是估計。 (雖然非常接近現實,但!)

1

我不知道,但這是你在找什麼 - 在笛卡爾座標系中旋轉一個點: link

+0

將看看它。謝謝。 – 2009-02-24 14:06:24

1

You ca n在您的Point上使用Transform.Transform()方法進行相同的轉換,以獲得應用這些轉換的新點。

+0

Transform()接受一個Point變量。該點的x和y應該是什麼? – 2009-02-24 15:44:04

+0

左上方和上方的畫布 – 2009-02-24 15:44:47

2

看看GeneralTransform.TransformBounds()方法。

6

我用這個方法:

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

其中rotateTransform是我的工作,並設置角度...等實例。