1

私はここでちょっとした数学の失敗をしているようです... (x,y) 点をある座標空間から別の座標空間に変換する必要があります-極座標からデカルト座標などの意味ではありません...ただある束縛から別の束縛へ。つまり、特定の (x,y) が左下 (-100, -100) と右上 (100,100) の長方形に収まる場合、その点が左下 (0 ,0) と右上 (500, 500)。

これは単純な数学のように感じますが、正しく理解するのにかなりの時間を費やしています...

これは、Java で書かれた小さなコンピュータ グラフィックス プログラム用です。基本的に、変化するクリップ ウィンドウがあり、そのクリップ ウィンドウはビュー ウィンドウ全体を占める必要があります。クリップとビューの初期値は、上記の長方形によってこの順序で指定されます。ただし、クリップは、たとえば、左下 (-80、-65) と右上 (75、65) の長方形に変更される可能性があります。次に、その長方形内にあるポイントを、ビュー ウィンドウ内にあるポイント (左下 (0,0)、右上 (500, 500)) に変換する必要があります。

これが私が今持っているものです:

public int normalizeX(float x) {
    float clipWidth = clipRight - clipLeft;
    int viewWidth = viewRight - viewLeft;
    x += 100; //Get x into range [0, 200] instead of [-100, 100]
    //First convert x to value within clip width, then "scale" to viewport width
    return (int)(((clipWidth*x)/200) * (viewWidth/clipWidth));
}

public int normalizeY(float y) {
    float clipHeight = clipTop - clipBottom;
    int viewHeight = viewTop - viewBottom;
    y += 100; //Get y into range [0, 200] instead of [-100, 100]
    //First convert y to value within clip height, then "scale" to viewport height
    return (int)(((clipHeight*y)/200) * (viewHeight/clipHeight));
}

助けてくれてありがとう!

4

4 に答える 4

4

古い境界が(この例ではそれぞれ -80 と 75) であり、新しい境界が(この例ではそれぞれ 0 と 500) であると仮定すると、次のように新しい座標系に正規xLoOld化できます。xHiOldxLoNewxHiNewxOld

xNew = (xOld-xLoOld) / (xHiOld-xLoOld) * (xHiNew-xLoNew) + xLoNew

yについても同じです。

于 2012-01-25T21:03:39.863 に答える
2

このようなものがあなたを助けるかもしれません。

    public static float scale(
           float x,
           float old_min, float old_max,
           float new_min, float new_max)
    {
        float old_range = old_max - old_min;
        float new_range = new_max - new_min;
        return new_min + (x - old_min) * new_range / old_range;
    }

両方の次元で座標をスケーリングする必要があります。int へのキャストなど、他の計算は省略しました。

Regionまたはなどの適切な型を作成Rectangleして、少なくともこの関数の引数の数を減らしてコードを簡素化することもお勧めします。

于 2012-01-25T21:03:18.470 に答える
2

地獄のように単純です: -100 を 0 に、100 を 500 にマッピングする変換が必要です。または、やみくもに言えば、範囲 [-100, 100] を範囲 [0, 500] にマッピングします。

[-100, 100] ----> [0, 500]

最初のステップは、範囲 [-100, 100] を [0, 200] に変換することです。

x ----> x + 100

次のステップは、範囲 [0, 200] を [0, 500] に変換することです。

x ----> x * 500 / 200 = 2.5 * x

罰金では、あなたの変換は読み取ります

x ----> 2.5 * (x + 100) 

y についても同様です。

y ----> 2.5 * (y + 100).

これで明確になり、より複雑なケースでロジックを再利用できるようになることを願っています。

于 2012-01-25T21:18:27.817 に答える
0

これを行うための巧妙で一般的な方法は、アフィン変換を使用することです。元のフィールドから2番目のフィールドへの「伸縮性」を特徴付ける2x2マトリックス(Aと呼びます)と、オフセットを特徴付ける2 x 1マトリックス(bと呼びます)があります。

次に、xを(2 x 1)入力、yを(2 x 1)出力として、y = Ax+bになります。

この手法では、(回転など)さらに多くのことを実行できますが、これらはアプリケーションにとっておそらく重要ではありません。

http://en.wikipedia.org/wiki/Affine_transformation

于 2012-01-25T21:09:40.103 に答える