2013-07-15 5 views
0

У меня есть точка в системе координат 320*240, и я хочу преобразовать в другую систему координат, например, 1024*768 или 1920*1600.C# Преобразование точки из одной координаты экрана в другую координаты экрана

Есть ли предопределенные классы .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.ком/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); 

и могут быть повторно использованы другими элементами управления.

Смежные вопросы