0

座標系に点があり、または320*240と言う別の座標系に変換したい。 1024*7681920*1600

これを達成するための事前定義された.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それを別の座標系に移動しようとしています。

これを達成するためのより良い方法はありますか?

第二に、私はこのポイントを取得し続けています。動きが非常にぎくしゃくしているため、これを滑らかにするより良い方法はありますか?

ありがとう

4

2 に答える 2

0

両方の基準系の原点が同一の場合、(0, 0) はどうなりますか? あなたができる唯一のことは、3つの単純なルールに依存して、一方のシステムから他方のシステムに値をスケーリングすることです:

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 の 1 つの変数を計算するだけで済みます。

于 2013-07-15T12:50:56.847 に答える
0

座標を仮想システム (つまり 320x240) から実際の座標システム (つまりPrimaryScreenWidthx 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);

他のコントロールでも再利用できます。

于 2013-07-15T12:53:37.257 に答える