2020/3/23

単位ベクトル

はじめに

単位ベクトルとは、長さ(ノルム)が1のベクトルのことです。下の図のように方向に関係なく、長さが1であれば単位ベクトルです。長さが1でないベクトルは単位ベクトルではありません。

単位ベクトルの例単位ベクトルの例

下の図は、ベクトルの原点座標(x1,y1)と方向座標(x2,y2)が与えられたときに、そのベクトルと同じ原点(x1,y1)を持ち、同じ方向の単位ベクトル座標(x,y)を計算する方法を表しています。

ベクトルの距離
単位ベクトルの計算方法

与えられた2つの座標(x1,y1)と(x2,y2)の距離lをピタゴラスの定理によって計算し、その距離lでx成分の差dxとy成分の差dyを割りdx'とdy'を求めます。dx'とdy'のそれぞれに(x1,y1)を足して(x,y)を求めます。

Javaソースコード

これをJavaソースコードにしたものが以下です。

UnitVector.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
046
047
048
049
050
051
052
053
public class UnitVector {
	public static void main( String[] args ) {
		double x1, y1;
		double x2, y2;
		double l;
		double dx, dy;
		double x, y;

		// 1つ目の座標を代入
		x1 = 60.0;
		y1 = 20.0;

		// 2つ目の座標を代入
		x2 = 10.0;
		y2 = 40.0;

		// x座標の差を計算してdxに代入
		dx = x2 - x1;
		// y座標の差を計算してdyに代入
		dy = y2 - y1;

		// 2点間の距離を計算してlに代入
		l = Math.sqrt( dx * dx + dy * dy );

		// (x1,y1)から距離1の座標(x,y)を計算
		x = dx / l + x1;
		y = dy / l + y1;

		// 結果を表示
		System.out.println( "x=" + x );
		System.out.println( "y=" + y );
		System.out.println( "距離=" + dist( x1, y1, x, y ) );
	}


	// (x1,y1)-(x2,y2)の直線距離を計算するメソッド
	private static double dist( double x1, double y1, double x2, double y2 )
	{
		double l;
		double dx, dy;

		// x座標の差を計算してdxに代入
		dx = x2 - x1;
		// y座標の差を計算してdyに代入
		dy = y2 - y1;

		// 2点間の距離を計算してlに代入
		l = Math.sqrt( dx * dx + dy * dy );

		// 計算した距離を返す
		return l;
	}
}

実行結果

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis UnitVector.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac UnitVector.java

実行

C:\talavax\javasample>java UnitVector

出力結果

x=59.07152330911474
y=20.371390676354103
距離=1.000000000000002

Javaソースコード解説

ここから、単位ベクトルの成分(x,y)を計算している箇所の説明をしていきます。

017
018
019
020
		// x座標の差を計算してdxに代入
		dx = x2 - x1;
		// y座標の差を計算してdyに代入
		dy = y2 - y1;

与えられた2つの座標(x1,y1)と(x2,y2)のx成分の差dxとy成分の差dyを計算しています。

022
023
		// 2点間の距離を計算してlに代入
		l = Math.sqrt( dx * dx + dy * dy );

dxの2乗とdyを2乗した値を足して平方根を計算して変数lに代入しています。このlが2つの座標距離です。

025
026
027
		// (x1,y1)から距離1の座標(x,y)を計算
		x = dx / l + x1;
		y = dy / l + y1;

dxとdyをそれぞれlで割って、単位ベクトルの成分xとyを求めています。このソースでは、lが0.0の場合にdxとdyを割らないように制御していません。dxとdyを0で割ると計算値がInfinity(無限大)になります。

029
030
031
032
		// 結果を表示
		System.out.println( "x=" + x );
		System.out.println( "y=" + y );
		System.out.println( "距離=" + dist( x1, y1, x, y ) );

単位ベクトルの成分のxを2乗した値とyを2乗した値を足すと1になります。この結果を確認するためにコンソール出力しています。

以上です。

関連コンテンツ

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

2022.10.25

単位円の意味をくわしく解説しています。

2020.03.23

正方形の面積、周の長さ、関連する記事を紹介しています。興味のある方は、ご覧ください。

2020.03.23

三角形って何?

2022.07.26

長方形の面積、周の長さ、関連する記事を紹介しています。興味のある方は、ご覧ください。

2020.03.23

正六角形について解説しています。1辺の長さから面積を計算する方法についても詳しく解説しています。

2020.03.23

Math.sinメソッド、Math.cosメソッドを使わない計算方法を詳しく解説します。

2017.08.09

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

2020.03.23

値の2乗を計算するメソッドの作り方を解説しています。

2020.03.23

平方根の意味と、Math.sqrtメソッドの使い方をソースコードを使って詳しく解説しています。

2020.03.23

計算の結果が∞となるときの表現方法について解説しています。

2016.02.15

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

2020.03.23

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

2020.03.23

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

2022.10.17

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

メソッドを抜けるときに使用する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

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

2015.11.29

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

2021.05.18

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

2021.05.18

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

2016.12.16

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

2022.07.07

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

2022.07.27

ピタゴラスの定理は、直角三角形の三辺の長さの関係を表すもので、2つの座標間の距離計算などに利用できます。興味がある方は、記事をご覧ください。

2020.03.23

2つの座標(x1,y1)と(x2,y2)の直線距離を求める計算式は?

2020.03.23

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

2022.08.03

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

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

2020.03.23

広告