2012-01-25 14 views
1

私はここで数学的な計算に失敗するようです...座標空間から(x、y)点を別の座標空間に変換する必要があります - 極座標ではなくデカルトやデカルトのようなものに...ただ一つのバインドから別のバインドまで。左下(-100、-100)と右上(100,100)の矩形内にある特定の(x、y)の場合、その点が左下の矩形のどこにあるのかを知る必要があります、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)); 
} 

ありがとうございました!

+0

ハードコードされた '[0、200]'と '[-100,100] 'はどこから来ますか? –

+0

リマインダーJeanに感謝します。 James、これらの値は、すべての図形が(-100、-100)、(100,100)の範囲で定義されていたことに由来しています。 – user1028885

答えて

4

古い境界は(あなたの例では、それぞれ、-80および75)xLoOldxHiOldあると仮定すると、あなたの新しい境界が(あなたの例では、それぞれ、0および500)xLoNewxHiNewあり、あなたはあなたのxOldを正規化することができます

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

同じことをyとします。

+0

最後のビットは '+ xLoNew'でなければなりませんか? –

+0

絶対に。タイプミスが修正されました。 –

+0

ああ、私はそれについて言及しようとしていたが、誰かがそれに私を打つ:-pありがとう! – user1028885

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; 
    } 

両方の次元で座標をスケールする必要があります。

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

+0

ありがとう!リージョンの長方形の問題は問題になりません。古い境界と新しい境界は、setterメソッドで変更されたグローバル変数に保持されます。助けてくれてありがとう! – user1028885

0

これを行う滑らかで一般的な方法は、アフィン変換です。 元のフィールドの「伸縮性」を第2フィールドに特徴付ける2×2行列(Aと呼ぶ)と、オフセットを特徴付ける2×1行列(それをbと呼ぶ)があります。

次に、xを(2 x 1)入力として、yを(2 x 1)出力としてy = Ax + bとするだけです。

このテクニックを使うと、ローテーションのようにもっと多くの作業を行うことができますが、おそらくアプリケーションにとって重要ではありません。地獄のような単純な

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

2

:あなたが500に0から100まで-100をマップ変換をしたいです。

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

まずステップ[0、200]の範囲[-100、100]を変換することである:または[0、500]は範囲[-100、100]の範囲をマッピングする、盲目的に置きます

x ----> x + 100 

次のステップは、微 [0、500]

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

に範囲[0、200]を変換することである、あなたの変換は

読み出しyの
x ----> 2.5 * (x + 100) 

と同様に:

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

が、これはそれを明確にし、そしてあなたがより複雑な場合には、ロジックを再利用できるようになることを願っています。

+0

はい、ありがとうございます。なぜ私がそんなに苦労していたのか分かりません。私は数学的なマイナーとして恥ずかしい:-Xは私はちょうど脳のおならを持っていたと推測する – user1028885

+0

@ user1028885:あなたは大歓迎です。私は数学の学位を持っており、仕事中はいつも数学をしています。これらのことをするには紙と鉛筆が必要です。物事を混乱させるのは簡単です。 –

+1

典型的な数学者!あなたたちは数字にひどいです。あなたは本当に、物理学者です。 (PS:あなたはそれが本当だと知っています!;-) –

関連する問題