2013-07-15 78 views
0

我在320*240座標系中有一個點,並且我想要變換到不同的座標系,比如說1024*7681920*1600C#將一個點從一個屏幕座標變換到另一個屏幕座標

是否有預定義的.net類來實現此目的?

我試圖解決它像這樣 -

screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; 
screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight; 
double newWidth = x/320 * screenWidth; 
double newHeight = y/240 * screenHeight; 
bola.SetValue(Canvas.LeftProperty, newWidth); 
bola.SetValue(Canvas.TopProperty, newHeight); 

我正在從320*240點座標系中,我試圖將它移動到另一個座標系。

有沒有更好的方法來實現這一目標?

其次,我繼續得到這一點,有沒有更好的方法來平滑這一點,因爲它在運動中非常緊張?

由於

+0

如果x和y是整數,x/320和y/240都是整數除法,這就是爲什麼結果可能是錯誤的。對於x = 300,您將擁有0.如果是您的情況,請重新編寫公式:double newWidth = x/320.0 * screenWidth和double newHeight = y/240.0 * screenHeight –

+0

這裏的一切都在這裏。 – sunder

+1

看看Matrix.Transform: http://msdn.microsoft。COM/EN-US /庫/ ms607598.aspx – svenv

回答

0

如果在參考這兩個系統的原點是相同的,是什麼的情況下(0,0);你能做的唯一的事情是依靠三個簡單的規則縮放從一個到另一個系統的值:

curX -> in 340 
newX -> in newWidth(1024) 

newX = newWidth(1024) * curX/340 OR newX = curX * ratio_newWidthToOldWidth 

相同的高度(newY = curY * ratio_newHeightToOldHeight)。

這已經是一個非常簡單的方法,爲什麼尋找更簡單的替代方案?

在任何情況下,您都應該記住,寬高比會從一個分辨率變化到另一個分辨率(即您提供的示例中的1.33和1.2),因此如果您盲目應用此轉換,對象可能會改變(將適應給定的屏幕,但可能會比你想要的更糟糕)。因此,你可能要保持原始的寬度與高度比這樣做:

newX = ... 
newY = ... 
if(newX/newY != origXYRatio) 
{ 
    newX = newY * origXYRatio // or vice versa 
} 

因此,在這種情況下,你只需要計算一個變量,X或Y

0

你將您的座標從一些虛擬系統(即320x240)轉換爲真正的座標系(即PrimaryScreenWidth x PrimaryScreenHeight)。我認爲除了你正在做的事情之外,還有更好的方法去做。

爲了提高代碼的可讀性,你可能會引入的功能,以更好地傳達你在做什麼:

// Or whatever the type of "ctl" is ... 
private void SetPositionInVirtualCoords(Control ctl, double x, double y) 
{ 
    screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; 
    screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;   
    ctl.SetValue(Canvas.LeftProperty, x * (screenWidth/320.0)); 
    ctl.SetValue(Canvas.TopProperty, y * (screenHeight/240.0)); 
} 

...讓你的主要代碼可以作爲閱讀:

SetPositionInVirtualCoords(bola, x, y); 

並可以被其他控件重新使用。