2つの異なる2D座標系間で変換するにはどうすればよいですか?


10

画像に座標を描画できるように、ある座標系から別の座標系に座標を変換しようとしています。

基本的に、宛先座標系は次のとおりです。

X range: 0 to 1066
Y range: 0 to 1600

(私が1066 x 1600のサイズで描いているちょうど標準的な画像)

画像上に描画しようとしている位置は実際には同じサイズですが、座標系が異なります。すべての座標のスパンは1066x1600です。

しかし、座標の例は次のようになります。

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

この座標系の範囲は次のとおりです。

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

これは非常に単純な数学だと思いますが、何らかの理由で理解できません。

提供された座標を最初の座標系に変換するにはどうすればよいですか?


3
2つの座標系が同じ基本ベクトルを持っている場合は、単にスケーリング係数を使用できます。それらが同じ基本ベクトルを持っていない場合は、基本変更が必要です。
タラドール

回答:


7

最初の値を正規化できます。これにより、[0,1]の範囲の値が得られます。これはXパーセントと考えることができます。これは、値が最小値と最大値の間にマッピングされる割合です。次に、目的の座標系でXパーセントの値を確認することで、目的の座標系のどこにパーセンテージが属しているかを確認できます。言語の例としてJavaコードを使用しますが、概念は、どの言語にも翻訳できるほど明確であると確信しています。

だから正規化:

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

入力する例を使用して:

xPercent = normalize(x,0,1066);

次に、それが宛先システムのどこにあるかを見つけます。のようなもので

destX = xPercent*(Math.abs(max-min)) + min;

または、値を使用するには:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

たとえば、x値が1000の場合、それを目的の座標系にマッピングします467.29

または、座標系が常に同じである場合、それらの間の比率を事前に計算できます。

そう:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;

なぜJava(C#)なのか?彼はJavaコードを要求しませんでした:)
kravemir

6
それは例を与えることです。そのまま使う必要はなく、コンセプトも十分クリアです。
MichaelHouse

しかし、これを行うと、destX = xPercent *(Math.abs(533.33--533.33))+ -533.33; 常に負の値を取得します。結果の座標系は0〜1066ですが、すべての座標を切り替える必要がありますか?
Geesu

それらを切り替えても、別の投稿と同じように、まだdump.tanaris4.com/sota.pngを取得しています。おそらく、C#と描画に関連する別の問題が発生している可能性があります。みんなありがとう!
Geesu

わかった、なんらかの理由でxPercent = 1.0f-xPercent
Geesu

4

それは簡単な数学です:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src-ソース座標系

res-結果調整システム

編集-数学の説明

( src - src_min ) / ( src_max - src_min )ソース座標系と同じ長さのゼロから始まる座標系に変換します(0.0, src_max - src_min )。次に、値を座標系にスケーリングします(0.0, 1.0)

* ( res_max - res_min ) これは、結果座標系の長さでゼロから始まる座標系に値をスケーリングします (0.0, dst_max - dst_min)

+ res_min 値を結果の座標系に変換します (dst_min, dst_max)


私もこれを考えましたが、正しく表示されません。dump.tanaris4.com / sota.png 最終的な座標は、白い円が下にある場所に当たるはずです
Geesu

1
これはそれらの数学をまったく説明していません、なぜですか?:)
MichaelHouse

@ Byte56私にとっては、特に算術演算のみを使用する場合、何かを理解するのに十分な公式ですが、それを必要とする人々のために説明を追加しました:)
kravemir

1
@Geesu次に、あなたはおそらく何か他の悪いことをしています(マトリックスをレンダリングしていますか?)
クラベミール

2
更新していただきありがとうございます。理由を説明しようとする答えを出す方がよいと私は思います。それ以外の場合は、この質問同様の問題を解決する方法ではなく、この質問に対する答えを提供するだけです。それは「人に魚を与え、人に魚を教える」タイプのものです。
MichaelHouse

3

2D座標変換の基本方程式(代数では、回転は含まれません)は次のとおりです。

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

TargetCoordinate(T1、T2)はSourceCoordinateの2点に対応する(S1、S2)に2点を与え、TranslateFactorそしてScalingFactor解くことによって与えられます。

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

その結果:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

あなたの場合、x座標

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

したがって、

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

y座標は同じ手順に従います


S1とS2は、ゼロによる除算につながる同じx / y座標を持つことはできません。
zwcloud

0

いくつかの仮定を行います:

  • あなたは、(最終的に)便利さとパワーのために、マトリックスの実装に興味を持っています。そして
  • 同次座標に精通している。

その後、質問は次のように移行します。私の基底変化に対する同種の変換行列は何ですか?

これに答えるには、まず3つの補助的な質問に対する答えが必要です。

  1. 私の起源はどこに移動しましたか?
  2. X軸はどうなりましたか?(M11、M12)を点の座標とする
  3. Y軸はどうなりましたか?

これらの3つの質問に対する回答を次のように定義します。

  1. (M31、M32)は、元の座標系での新しい原点の座標です。
  2. (M11、M12)は、元の座標系での新しい単位xベクトルの座標です。
  3. (M21、M22)は、元の座標系での新しい単位yベクトルの座標です。

次に、同次変換行列は次のとおりです。

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

ここでの規則は、ポイントは行ベクトルで表されるというものです。これは、通常のコンピュータグラフィックスの規則です。数学者や物理学者はしばしばオプソイトを使用します。


座標系は、次のようなマトリックスで記述できます。M11= Xaxis.X、M12 = Xaxis.Y、M21 = Yaxis.X、M22 = Yaxis.Y、M31 = origin.X、M32 = origin.Y。座標システム行列A及びPはAの座標として点の表現である座標系行列B、P * A *インバース(B)、所与、Bの座標として点の表現をもたらす
ジムBalter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.