座標変換

数学xy→画像xy

ここでは、数学座標(x,y)を画像座標(px,py)に変換する方法を説明します。

数学座標系から画像座標系への変換

数学座標(x,y)から画像座標に変換(px,py)に変換する計算式は以下のとおりです。

px = ax + b…式①
py = cy + d…式②

abcdは任意の値で、この値でどのように変換するかを決めます。ちなみに、これらの式では回転はできません。

次に、abcdの決め方を説明します。

まず、数学座標と変換後の画像座標を対応させたものを2組用意します。

数学座標(x1,y1) → 画像座標(px1,py1)

数学座標(x2,y2) → 画像座標(px2,py2)

次に、式①に2つの組のx座標を代入します。

px1 = ax1 + b…式③
px2 = ax2 + b…式④

ここから式③と式④からabを求めていきます。

式③から式④を引くと、

px1 - px2 = ax1 - ax2     …式⑤

となります。

式⑤の右辺をaでまとめると

px2 - px2 = a( x1 - x2 )…式⑥

となります。

式⑥の両辺を( x1 - x2 )で割るとaが求まります。

a = ( px1 - px2 ) / ( x1 - x2 )

次に、bを求めていきます。

式③の両辺にx2を掛けた式⑦と、式④の両辺にx1を掛けた式⑧を作ります。

px1・x2 = ax1・x2 + bx2…式⑦
px2・x1 = ax2・x1 + bx1…式⑧

式⑦から式⑧を引くと、

px1・x2 - px2・x1 = bx2 - bx1     …式⑨

となります。

式⑨の右辺をbでまとめると

px1・x2 - px2・x1 = b( x2 - x1 )  …式⑩

となります。

式⑲の両辺を( x2 - x1 )で割るとbが求まります。

b = ( px1・x2 - px2・x1 ) / ( x2 - x1 )

同様に、式②に2つの組のy座標を代入します。

py1 = cy1 + d…式⑤
py2 = cy2 + d…式⑥

これをabを求めた方法でcdを求めると、

c = ( py1 - py2 ) / ( y1 - y2 )
d = ( py1・y2 - py2・y1 ) / ( y2 - y1 )

となります。

まとめると、

a = ( px1 - px2 ) / ( x1 - x2 )
b = ( px1・x2 - px2・x1 ) / ( x2 - x1 )
c = ( py1 - py2 ) / ( y1 - y2 )
d = ( py1・y2 - py2・y1 ) / ( y2 - y1 )

です。

下の図は、2つ数学座標の範囲(x1,y1)-(x2,y2)を画像全体の範囲に変換する例です。

数学座標と画像座標の対応

変換後の画像座標px1=0、py1=0、px2=Width-1、py2=Height-1を指定すると、指定した数学座標の範囲を画像全体に変換することができます。

Javaソースコード

ここまで説明した内容をJavaソースコードにしました。参考にしてください。

Transformation2d.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
public class Transformation2d {
	// 変換パラメータ a,b,c,d
	private double a = 0.0;
	private double b = 0.0;
	private double c = 0.0;
	private double d = 0.0;

	// パラメータを計算
	boolean set( double x1, double y1, double x2, double y2,
				double px1, double py1, double px2, double py2 )
	{
		// ゼロとみなす値
		double e = 0.0000000001;

		// 初期値を代入
		a = b = c = d = 0.0;

		// x1とx2が同じ値であればエラー
		if ( e > Math.abs( x1 - x2 ) ) return false;

		// y1とy2が同じ値であればエラー
		if ( e > Math.abs( y1 - y2 ) ) return false;

		// パラメータの計算
		a = ( px1 - px2 ) / ( x1 - x2 );
		b = ( px1 * x2 - px2 * x1 ) / ( x2 - x1 );
		c = ( py1 - py2 ) / ( y1 - y2 );
		d = ( py1 * y2 - py2 * y1 ) / ( y2 - y1 );

		return true;
	}


	// 変換後のx座標を取得
	public double getX( double x )
	{
		return a * x + b;
	}

	// 変換後のy座標を取得
	public double getY( double y )
	{
		return c * y + d;
	}
}

ここから、メソッドについて簡単に説明していきます。

008
009
010
	// パラメータを計算
	boolean set( double x1, double y1, double x2, double y2,
				double px1, double py1, double px2, double py2 )

数学座標の範囲(x1,y1)-(x2,y2)と変換後の画像座標の範囲(px1,py1)-(px2,py2)を与えて変換パラメータを設定するメソッドです。x1とx2が同じ値、またはy1とy2が同じ値の場合、エラーとなります。

034
035
	// 変換後のx座標を取得
	public double getX( double x )

数学座標のxを与えて、画像座標pxを戻すメソッドです。

040
041
	// 変換後のy座標を取得
	public double getY( double y )

数学座標のyを与えて、画像座標pyを戻すメソッドです。

以上です。

関連コンテンツ

画像の座標系はどのように定義されていますか?

2020.03.23

平面上の位置を表す座標系の1つXY座標系について詳しく解説。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

デジタル画像データを構成している要素について解説しています。

2015.12.22

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

画像って何?

2022.07.25

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

指定した基準座標から、指定したマンハッタン距離にある座標に●を描画!

2023.02.15

Swingパッケージを使ってxy-座標とグリッド(格子)を描画するプログラムをクラスを作成しました。

2023.01.27

Graphicsオブジェクトにxy-座標とグリッド(格子)を描画するクラスを作成しました。Javaのソースコードで詳しく解説しています。

2023.01.24

Swingパッケージを使って絶対値のグラフを表示するJavaソースコードを紹介しています。

2019.09.21

Swingパッケージを使って立方根のグラフを表示するJavaソースコードを紹介しています。

2019.10.06

Swingパッケージを使ってコサイン(cos)のグラフを表示するJavaソースコードを紹介しています。

2019.09.21

Swingパッケージを使って放物線のグラフを表示するJavaソースコードを紹介しています。

2019.09.21

Swingパッケージを使って平方根のグラフを表示するJavaソースコードを紹介しています。

2019.09.21

Swingパッケージを使ってタンジェント(tan)のグラフを表示するJavaソースコードを紹介しています。

2019.09.21

Swingパッケージを使って数式のグラフを表示する方法を解説します。サイン(sin)カーブを表示するJavaソースコードを紹介しています。

2019.09.14

広告