算術演算関数

宣言VECTOR VGet( float x, float y, float z ) ;

概略ベクトルを取得する

引数 float x : 取得するベクトルのX成分
float y : 取得するベクトルのY成分
float z : 取得するベクトルのZ成分
戻り値引数 x,y,z を代入したVECTOR 構造体
解説  引数 x, y, z を VECTOR 構造体のメンバ変数 x, y, z に代入して返すだけの関数です。
戻り値.x = x ; 戻り値.y = y ; 戻り値.z = z ;
サンプル

  VECTOR 構造体 Vect に値を代入します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値( x=100.0f y=200.0f z=400.0f )を代入 Vect = VGet( 100.0f, 200.0f, 400.0f ) ; // Vect の内容を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VAdd( VECTOR In1, VECTOR In2 ) ;

概略二つのベクトルを加算する

引数 VECTOR In1 : 加算されるベクトル
VECTOR In2 : 加算するベクトル
戻り値In1 と In2 の値を加算した VECTOR 構造体
解説  引数 In1 と In2 の x, y, z 成分を加算した結果を戻り値として返す関数です。
戻り値.x = In1.x + In2.x ; 戻り値.y = In1.y + In2.y ; 戻り値.z = In1.z + In2.z ;
サンプル

  VECTOR 構造体 Vect1 と Vect2 を加算して、結果を Vect1 に代入します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect1 と Vect2 に値を代入 Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ; Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ; // Vect1 と Vect2 を加算して結果を Vect1 に代入 Vect1 = VAdd( Vect1, Vect2 ) ; // Vect1 の内容を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VSub( VECTOR In1, VECTOR In2 ) ;

概略二つのベクトルを減算する

引数 VECTOR In1 : 減算されるベクトル
VECTOR In2 : 減算するベクトル
戻り値In1 から In2 の値を減算した VECTOR 構造体
解説  引数 In1 から In2 の x, y, z 成分を減算した結果を戻り値として返す関数です。
戻り値.x = In1.x - In2.x ; 戻り値.y = In1.y - In2.y ; 戻り値.z = In1.z - In2.z ;
サンプル

  VECTOR 構造体 Vect1 から Vect2 を減算して、結果を Vect1 に代入します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect1 と Vect2 に値を代入 Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ; Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ; // Vect1 から Vect2 を減算して結果を Vect1 に代入 Vect1 = VSub( Vect1, Vect2 ) ; // Vect1 の内容を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float VDot( VECTOR In1, VECTOR In2 ) ;

概略二つのベクトルの内積を取得する

引数 VECTOR In1 : 内積するベクトル1
VECTOR In2 : 内積するベクトル2
戻り値In1 と In2 の内積値
解説  引数 In1 と In2 の内積を返す関数です。
戻り値 = In1.x * In2.x + In1.y * In2.y + In1.z * In2.z ;
サンプル

  VECTOR 構造体 Vect1 と Vect2 の内積を画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect1 と Vect2 に値を代入 Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ; Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ; // Vect1 と Vect2 の内積を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Dot %f", VDot( Vect1, Vect2 ) ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VCross( VECTOR In1, VECTOR In2 ) ;

概略二つのベクトルの外積を取得する

引数 VECTOR In1 : 外積するベクトル1
VECTOR In2 : 外積するベクトル2
戻り値In1 と In2 の外積値
解説  引数 In1 と In2 の外積を返す関数です。
戻り値.x = In1.y * In2.z - In1.z * In2.y ; 戻り値.y = In1.z * In2.x - In1.x * In2.z ; 戻り値.z = In1.x * In2.y - In1.y * In2.x ;
サンプル

  VECTOR 構造体 Vect1 と Vect2 の外積を画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect1 と Vect2 に値を代入 Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ; Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ; // Vect1 と Vect2 の外戚を Vect1 に代入 Vect1 = VCross( Vect1, Vect2 ) ; // Vect1 の内容を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VScale( VECTOR In, float Scale ) ;

概略ベクトルのスケーリングをする

引数 VECTOR In : スケーリングをするベクトル
float Scale : スケーリング値
戻り値スケーリングした結果の VECTOR 構造体
解説  引数 In のベクトルを Scale 倍して返す関数です。
戻り値.x = In.y * Scale ; 戻り値.y = In.z * Scale ; 戻り値.z = In.x * Scale ;
サンプル

  VECTOR 構造体 Vect の内容を 8.0f 倍して、その結果を画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // Vect を 8.0f 倍して、その結果を Vect に代入 Vect = VScale( Vect, 8.0f ) ; // Vect の内容を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float VSize( VECTOR In ) ;

概略ベクトルのサイズを取得する

引数 VECTOR In : サイズを取得したいベクトル
戻り値ベクトルのサイズ
解説  引数 In のベクトルのサイズを取得する関数です。
戻り値 = sqrt( In1.x * In1.x + In1.y * In1.y + In1.z * In1.z ) ;
サンプル

  VECTOR 構造体 Vect のサイズを画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // Vect のサイズを画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Size %f", VSize( Vect ) ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float VSquareSize( VECTOR In ) ;

概略ベクトルのサイズの2乗を取得する

引数 VECTOR In : サイズの二乗を取得したいベクトル
戻り値ベクトルのサイズの二乗
解説  引数 In のベクトルのサイズの二乗を取得する関数です。

 ベクトルのサイズを算出するには処理負荷の高い平方根計算を行わなければならないので、 二つのサイズの比較等、 サイズの二乗でも処理に支障が発生しない場合はこちらの関数を使用したほうが処理負荷が低くて済みます。
戻り値 = In1.x * In1.x + In1.y * In1.y + In1.z * In1.z ;
サンプル

  VECTOR 構造体 Vect のサイズの二乗を画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // Vect のサイズの二乗を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Size %f", VSquareSize( Vect ) ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VNorm( VECTOR In ) ;

概略正規化ベクトルを取得する

引数 VECTOR In : 正規化したいベクトル
戻り値正規化したベクトル
解説  引数 In を正規化したベクトルを取得する関数です。
 正規化とはベクトルの方向は変えずにサイズを1にすることで、 ベクトルの方向成分だけを取得したい場合などに行います。
float size ; size = VSize( In ) ; 戻り値.x = In1.x / size ; 戻り値.y = In1.y / size ; 戻り値.z = In1.z / size ;
サンプル

  VECTOR 構造体 Vect を正規化した値を画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // Vect の値を正規化して、その結果を Vect に代入する Vect = VNorm( Vect ) ; // Vect の値を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VTransform( VECTOR InV, MATRIX InM ) ;

概略行列を使ったベクトルの変換

引数 VECTOR InV : 変換処理を行いたいベクトル
MATRIX InM : 変換処理に使用するベクトル
戻り値変換後のベクトル
解説  引数 InV のベクトルを引数 InM の行列を使用して変換処理を行います。
 計算的には InV を1x4行列として扱い( 4つめの要素は 1.0f とします ) InM の行列の左から乗算した結果を返します。
戻り値.x = InV.x * InM.m[0][0] + InV.y * InM.m[1][0] + InV.z * InM.m[2][0] + InM.m[3][0] ; 戻り値.y = InV.x * InM.m[0][1] + InV.y * InM.m[1][1] + InV.z * InM.m[2][1] + InM.m[3][1] ; 戻り値.z = InV.x * InM.m[0][2] + InV.y * InM.m[1][2] + InV.z * InM.m[2][2] + InM.m[3][2] ;
サンプル

  VECTOR 構造体 Vect をスケーリング行列を使用して 0.5f 倍します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; MATRIX Matrix ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // 0.5倍スケーリングを行う行列を作成 Matrix = MGetScale( VGet( 0.5f, 0.5f, 0.5f ) ) ; // 0.5倍スケーリングを行う行列を使用してベクトルのサイズを0.5倍した結果を Vect に代入する Vect = VTransform( Vect, Matrix ) ; // Vect の値を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR VTransformSR( VECTOR InV, MATRIX InM ) ;

概略行列を使ったベクトルの変換( スケーリング+回転成分のみ )

引数 VECTOR InV : 変換処理を行いたいベクトル
MATRIX InM : 変換処理に使用するベクトル
戻り値変換後のベクトル
解説  引数 InV のベクトルを引数 InM の行列を使用して変換処理を行います。
 計算的には InV を1x4行列として扱い( 4つめの要素は 0.0f とします ) InM の行列の左から乗算した結果を返します。
 VTransform と違い InV を行列として見立てた際の第4要素が 0.0f なので MGetTranslate 等の第4要素の 1.0f と乗算することで平行移動を実現している効果が反映されません。
戻り値.x = InV.x * InM.m[0][0] + InV.y * InM.m[1][0] + InV.z * InM.m[2][0] ; 戻り値.y = InV.x * InM.m[0][1] + InV.y * InM.m[1][1] + InV.z * InM.m[2][1] ; 戻り値.z = InV.x * InM.m[0][2] + InV.y * InM.m[1][2] + InV.z * InM.m[2][2] ;
サンプル

  VECTOR 構造体 Vect をスケーリング行列を使用して 0.5f 倍します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Vect ; MATRIX Matrix ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Vect に値を代入 Vect = VGet( 100.0f, 200.0f, 500.0f ) ; // 0.5倍スケーリングを行う行列を作成 Matrix = MGetScale( VGet( 0.5f, 0.5f, 0.5f ) ) ; // 0.5倍スケーリングを行う行列を使用してベクトルのサイズを0.5倍した結果を Vect に代入する Vect = VTransformSR( Vect, Matrix ) ; // Vect の値を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetIdent( void ) ;

概略単位行列を取得する

引数 なし
戻り値単位行列
解説  単位行列を戻り値として返してくる関数です。
戻り値行列 m[0][0]=1.0f m[0][1]=0.0f m[0][2]=0.0f m[0][3]=0.0f m[1][0]=0.0f m[1][1]=1.0f m[1][2]=0.0f m[1][3]=0.0f m[2][0]=0.0f m[2][1]=0.0f m[2][2]=1.0f m[2][3]=0.0f m[3][0]=0.0f m[3][1]=0.0f m[3][2]=0.0f m[3][3]=1.0f
サンプル

  単位行列を取得して画面に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 単位行列を Matrix に代入 Matrix = MGetIdent() ; // Matrix の値を画面に表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetScale( VECTOR Scale ) ;

概略拡大行列を取得する

引数 VECTOR Scale : 拡大値
戻り値拡大行列
解説  引数 Scale で指定された拡大値で拡大する行列を戻り値として返してくる関数です。
 拡大行列は VTransform 関数でベクトルに対して変換を行うと、 変換対象のベクトルがこの関数の引数 Scale で指定した分だけ拡大します。
戻り値行列 m[0][0]=Scale.x m[0][1]=0.0f m[0][2]=0.0f m[0][3]=0.0f m[1][0]=0.0f m[1][1]=Scale.z m[1][2]=0.0f m[1][3]=0.0f m[2][0]=0.0f m[2][1]=0.0f m[2][2]=Scale.z m[2][3]=0.0f m[3][0]=0.0f m[3][1]=0.0f m[3][2]=0.0f m[3][3]=1.0f
サンプル

  拡大行列を取得してベクトルの拡大変換を行います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // 拡大行列を Matrix に代入 Matrix = MGetScale( VGet( 2.0f, 5.0f, 8.0f ) ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "拡大行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetTranslate( VECTOR Trans ) ;

概略平行移動行列を取得する

引数 VECTOR Trans : 平行移動値
戻り値平行移動行列
解説  引数 Trans で指定された平行移動を行う行列を戻り値として返してくる関数です。
 平行移動行列は VTransform 関数でベクトルに対して変換を行うと、 変換対象のベクトルがこの関数の引数 Trans で指定した分だけ移動し( 値が加算され )ます。
戻り値行列 m[0][0]=1.0f m[0][1]=0.0f m[0][2]=0.0f m[0][3]=0.0f m[1][0]=0.0f m[1][1]=1.0f m[1][2]=0.0f m[1][3]=0.0f m[2][0]=0.0f m[2][1]=0.0f m[2][2]=1.0f m[2][3]=0.0f m[3][0]=Trans.x m[3][1]=Trans.y m[3][2]=Trans.z m[3][3]=1.0f
サンプル

  平行移動行列を使用してベクトルの平行移動変換を行います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // 平行移動行列を Matrix に代入 Matrix = MGetTranslate( VGet( 100.0f, 80.0f, 85.0f ) ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "平行移動行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetRotX( float XAxisRotate ) ;

概略X軸回転行列を取得する

引数 float XAxisRotate : 回転値( 単位:ラジアン )
戻り値X軸回転行列
解説  引数 XAxisRotate で指定された回転値分だけX軸回転する回転行列を戻り値として返してくる関数です。
 X軸回転行列は VTransform 関数でベクトルに対して変換を行うと、 変換対象のベクトルがこの関数の引数 XAxisRotate で指定した分だけX軸回転します。
戻り値行列 float Sin, Cos ; Sin = sin( XAxisRotate ) ; Cos = cos( XAxisRotate ) ; m[0][0]=1.0f m[0][1]=0.0f m[0][2]=0.0f m[0][3]=0.0f m[1][0]=0.0f m[1][1]= Cos m[1][2]=Sin m[1][3]=0.0f m[2][0]=0.0f m[2][1]=-Sin m[2][2]=Cos m[2][3]=0.0f m[3][0]=0.0f m[3][1]=0.0f m[3][2]=0.0f m[3][3]=1.0f
サンプル

  X軸回転行列を使用してベクトルのX軸回転を行います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // X軸回転行列を Matrix に代入( 45度回転する行列 ) Matrix = MGetRotX( DX_PI_F / 4.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "X軸回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetRotY( float YAxisRotate ) ;

概略Y軸回転行列を取得する

引数 float YAxisRotate : 回転値( 単位:ラジアン )
戻り値Y軸回転行列
解説  引数 YAxisRotate で指定された回転値分だけY軸回転する回転行列を戻り値として返してくる関数です。
 Y軸回転行列は VTransform 関数でベクトルに対して変換を行うと、 変換対象のベクトルがこの関数の引数 YAxisRotate で指定した分だけY軸回転します。
戻り値行列 float Sin, Cos ; Sin = sin( YAxisRotate ) ; Cos = cos( YAxisRotate ) ; m[0][0]=Cos m[0][1]=0.0f m[0][2]=-Sin m[0][3]=0.0f m[1][0]=0.0f m[1][1]=1.0f m[1][2]=0.0f m[1][3]=0.0f m[2][0]=Sin m[2][1]=0.0f m[2][2]= Cos m[2][3]=0.0f m[3][0]=0.0f m[3][1]=0.0f m[3][2]=0.0f m[3][3]=1.0f
サンプル

  Y軸回転行列を使用してベクトルのY軸回転を行います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // Y軸回転行列を Matrix に代入( 45度回転する行列 ) Matrix = MGetRotY( DX_PI_F / 4.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "Y軸回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetRotZ( float ZAxisRotate ) ;

概略Z軸回転行列を取得する

引数 float ZAxisRotate : 回転値( 単位:ラジアン )
戻り値Z軸回転行列
解説  引数 ZAxisRotate で指定された回転値分だけZ軸回転する回転行列を戻り値として返してくる関数です。
 Z軸回転行列は VTransform 関数でベクトルに対して変換を行うと、 変換対象のベクトルがこの関数の引数 ZAxisRotate で指定した分だけZ軸回転します。
戻り値行列 float Sin, Cos ; Sin = sin( ZAxisRotate ) ; Cos = cos( ZAxisRotate ) ; m[0][0]= Cos m[0][1]=Sin m[0][2]=0.0f m[0][3]=0.0f m[1][0]=-Sin m[1][1]=Cos m[1][2]=0.0f m[1][3]=0.0f m[2][0]=0.0f m[2][1]=0.0f m[2][2]=1.0f m[2][3]=0.0f m[3][0]=0.0f m[3][1]=0.0f m[3][2]=0.0f m[3][3]=1.0f
サンプル

  Z軸回転行列を使用してベクトルのZ軸回転を行います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // Z軸回転行列を Matrix に代入( 45度回転する行列 ) Matrix = MGetRotZ( DX_PI_F / 4.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "Z軸回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetRotAxis( VECTOR RotateAxis, float Rotate ) ;

概略指定軸で指定角度回転する行列を取得する

引数 VECTOR RotateAxis : 回転軸 float Rotate : 回転値( 単位:ラジアン )
戻り値回転行列
解説  引数 RotateAxis を回転軸として、引数 Rotate で指定された回転値分だけ回転する回転行列を戻り値として返してくる関数です。
 MGetRotYMGetRotX はそれぞれ回転軸を Y軸、X軸としていますが、 時には基本軸以外を軸として回転したい場合があります、この関数はそんなときに使用します。

サンプル

  MGetRotAxis 関数を使用して敢えてY軸回転行列を作成します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ; // MGetRotAxis を使用して敢えてY軸回転行列を Matrix に代入( 45度回転する行列 ) Matrix = MGetRotAxis( VGet( 0.0f, 1.0f, 0.0f ), DX_PI_F / 4.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "Y軸回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetRotVec2( VECTOR In1, VECTOR In2 ) ;

概略ある向きからある向きへ変換する回転行列を取得する

引数 VECTOR In1 : ある向きのベクトル VECTOR In2 : ある向きを変換後のベクトル
戻り値回転行列
解説  引数 In1 の向きを引数 In2 の向きに変換するような回転行列を戻り値として返してくる関数です。
 ただ、元の向きから90度以上回転する場合は期待した回転行列が得られない可能性があります。

サンプル

  X軸のプラスの方向をY軸のマイナスの方向に回転する行列を取得する。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // X軸のプラスの方向をY軸のマイナスの方向に回転する行列を取得する Matrix = MGetRotVec2( VGet( 1.0f, 0.0f, 0.0f ), VGet( 0.0f, -1.0f, 0.0f ) ) ; // X軸に対してプラスの値を Vect1 に代入 Vect1 = VGet( 80.0f, 0.0f, 0.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetAxis1( VECTOR XAxis, VECTOR YAxis, VECTOR ZAxis, VECTOR Pos ) ;

概略指定の3軸上のベクトルを基本軸上のベクトルに変換する行列を取得する

引数 VECTOR XAxis : 任意のX軸の基本軸上での方向
VECTOR YAxis : 任意のY軸の基本軸上での方向
VECTOR ZAxis : 任意のZ軸の基本軸上での方向
VECTOR Pos : 任意の3軸の基本軸上での原点
戻り値変換行列
解説  任意の3軸上のXYZ値を基本軸上のXYZ値に変換する行列を作成します。
戻り値行列 m[0][0]=XAxis.x m[0][1]=XAxis.y m[0][2]=XAxis.z m[0][3]=0.0f m[1][0]=YAxis.x m[1][1]=YAxis.y m[1][2]=YAxis.z m[1][3]=0.0f m[2][0]=ZAxis.x m[2][1]=ZAxis.y m[2][2]=ZAxis.z m[2][3]=0.0f m[3][0]=Pos.x m[3][1]=Pos.y m[3][2]=Pos.z m[3][3]=1.0f
サンプル

  基本軸上のYのプラス値をX軸
  基本軸上のZのプラス値をY軸
  基本軸上のXのマイナス値をZ軸とし、
  且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする
  3軸上のベクトルを基本軸上のベクトルに変換する行列を取得する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 基本軸上のYのプラス値をX軸 // 基本軸上のZのプラス値をY軸 // 基本軸上のXのマイナス値をZ軸とし、 // 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする // 3軸上のベクトルを基本軸上のベクトルに変換する行列の取得 Matrix = MGetAxis1( VGet( 0.0f, 1.0f, 0.0f ), VGet( 0.0f, 0.0f, 1.0f ), VGet( -1.0f, 0.0f, 0.0f ), VGet( 100.0f, 0.0f, 200.0f ) ) ; // 上記軸上のX軸とY軸に対してプラスのベクトル Vect1 に代入 Vect1 = VGet( 80.0f, 50.0f, 0.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "変換行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MGetAxis2( VECTOR XAxis, VECTOR YAxis, VECTOR ZAxis, VECTOR Pos ) ;

概略基本軸上のベクトルを指定の3軸上のベクトルに変換する行列を取得する

引数 VECTOR XAxis : 任意のX軸の基本軸上での方向
VECTOR YAxis : 任意のY軸の基本軸上での方向
VECTOR ZAxis : 任意のZ軸の基本軸上での方向
VECTOR Pos : 任意の3軸の基本軸上での原点
戻り値変換行列
解説  基本軸上のXYZ値を任意の3軸上のXYZ値に変換する行列を作成します。
戻り値行列 m[0][0]=XAxis.x m[0][1]=YAxis.x m[0][2]=ZAxis.x m[0][3]=0.0f m[1][0]=XAxis.y m[1][1]=YAxis.y m[1][2]=ZAxis.y m[1][3]=0.0f m[2][0]=XAxis.z m[2][1]=YAxis.z m[2][2]=ZAxis.z m[2][3]=0.0f m[3][0]=-( Pos.x * XAxis.x + Pos.y * XAxis.y + Pos.z * XAxis.z ) m[3][1]=-( Pos.x * YAxis.x + Pos.y * YAxis.y + Pos.z * YAxis.z ) m[3][2]=-( Pos.x * ZAxis.x + Pos.y * ZAxis.y + Pos.z * ZAxis.z ) m[3][3]=1.0f
サンプル

  基本軸上のベクトルを
  基本軸上のYのプラス値をX軸
  基本軸上のZのプラス値をY軸
  基本軸上のXのマイナス値をZ軸とし、
  且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする
  3軸上のベクトルに変換する行列を取得する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 基本軸上のベクトルを // 基本軸上のYのプラス値をX軸 // 基本軸上のZのプラス値をY軸 // 基本軸上のXのマイナス値をZ軸とし、 // 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする // 3軸上のベクトルに変換する行列の取得 Matrix = MGetAxis2( VGet( 0.0f, 1.0f, 0.0f ), VGet( 0.0f, 0.0f, 1.0f ), VGet( -1.0f, 0.0f, 0.0f ), VGet( 100.0f, 0.0f, 200.0f ) ) ; // 任意の3軸上の原点に位置する基本軸上のベクトルを Vect に代入 Vect1 = VGet( 100.0f, 0.0f, 200.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix の値を画面に表示 DrawString( 0, 0, "変換行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MAdd( MATRIX In1, MATRIX In2 ) ;

概略二つの行列の足し算を行う

引数 MATRIX In1 : 足し算を行う行列1
MATRIX In2 : 足し算を行う行列2
戻り値足し算を行った結果の行列
解説  引数 In1 と In2 で渡した行列の足し算を行い、 結果の行列を戻り値として返す関数です。
 行列の足し算は行列の要素を単純に足すだけのものです。
戻り値行列 m[0][0] = In1.m[0][0] + In2.m[0][0] m[0][1] = In1.m[0][1] + In2.m[0][1] m[0][2] = In1.m[0][2] + In2.m[0][2] m[0][3] = In1.m[0][3] + In2.m[0][3] m[1][0] = In1.m[1][0] + In2.m[1][0] m[1][1] = In1.m[1][1] + In2.m[1][1] m[1][2] = In1.m[1][2] + In2.m[1][2] m[1][3] = In1.m[1][3] + In2.m[1][3] m[2][0] = In1.m[2][0] + In2.m[2][0] m[2][1] = In1.m[2][1] + In2.m[2][1] m[2][2] = In1.m[2][2] + In2.m[2][2] m[2][3] = In1.m[2][3] + In2.m[2][3] m[3][0] = In1.m[3][0] + In2.m[3][0] m[3][1] = In1.m[3][1] + In2.m[3][1] m[3][2] = In1.m[3][2] + In2.m[3][2] m[3][3] = In1.m[3][3] + In2.m[3][3]
サンプル

  ベクトルを0.8倍する行列と0.2倍する行列を足して、その行列を使用して
 ベクトルを変換します、0.8倍と0.2倍を足すと1.0倍なので、ベクトルは
 変換前と同じ値になります。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix, Matrix1, Matrix2 ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 0.8倍に拡大する行列と0.2倍に拡大する行列を Matrix1 と Matrix2 に代入 Matrix1 = MGetScale( VGet( 0.8f, 0.8f, 0.8f ) ) ; Matrix2 = MGetScale( VGet( 0.2f, 0.2f, 0.2f ) ) ; // 二つの行列を足したものを Matrix に代入 Matrix = MAdd( Matrix1, Matrix2 ) ; // 適当な値を Vect1 に代入 Vect1 = VGet( 100.0f, 0.0f, 200.0f ) ; // Vect1 を Matrix3 を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix1 の値を画面に表示 DrawString( 0, 0, "0.8倍行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ; // Matrix2 の値を画面に表示 DrawString( 0, 96, "0.2倍行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ; DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ; DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ; // Matrix の値を画面に表示 DrawString( 0, 192, "加算後の行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MMult( MATRIX In1, MATRIX In2 ) ;

概略二つの行列の乗算を行う

引数 MATRIX In1 : 乗算する左側の行列
MATRIX In2 : 乗算する右側の行列
戻り値乗算した結果の行列
解説  引数 In1 と In2 を乗算した結果の行列を戻り値として返す関数です。
 行列と行列の乗算は複数の行列の効果を合成することができます。 ( 合成された行列は In1 → In2 の順で効果が現れます( 例:拡大行列と平行移動行列を乗算した場合、 その行列を使用して変換( VTransform )したベクトルは拡大行列→平行移動行列の順で変換( VTransform )した場合と同じ結果になります ) )
戻り値行列 m[0][0] = In1.m[0][0] * In2.m[0][0] + In1.m[0][1] * In2.m[1][0] + In1.m[0][2] * In2.m[2][0] + In1.m[0][3] * In2.m[3][0] ; m[0][1] = In1.m[0][0] * In2.m[0][1] + In1.m[0][1] * In2.m[1][1] + In1.m[0][2] * In2.m[2][1] + In1.m[0][3] * In2.m[3][1] ; m[0][2] = In1.m[0][0] * In2.m[0][2] + In1.m[0][1] * In2.m[1][2] + In1.m[0][2] * In2.m[2][2] + In1.m[0][3] * In2.m[3][2] ; m[0][3] = In1.m[0][0] * In2.m[0][3] + In1.m[0][1] * In2.m[1][3] + In1.m[0][2] * In2.m[2][3] + In1.m[0][3] * In2.m[3][3] ; m[1][0] = In1.m[1][0] * In2.m[0][0] + In1.m[1][1] * In2.m[1][0] + In1.m[1][2] * In2.m[2][0] + In1.m[1][3] * In2.m[3][0] ; m[1][1] = In1.m[1][0] * In2.m[0][1] + In1.m[1][1] * In2.m[1][1] + In1.m[1][2] * In2.m[2][1] + In1.m[1][3] * In2.m[3][1] ; m[1][2] = In1.m[1][0] * In2.m[0][2] + In1.m[1][1] * In2.m[1][2] + In1.m[1][2] * In2.m[2][2] + In1.m[1][3] * In2.m[3][2] ; m[1][3] = In1.m[1][0] * In2.m[0][3] + In1.m[1][1] * In2.m[1][3] + In1.m[1][2] * In2.m[2][3] + In1.m[1][3] * In2.m[3][3] ; m[2][0] = In1.m[2][0] * In2.m[0][0] + In1.m[2][1] * In2.m[1][0] + In1.m[2][2] * In2.m[2][0] + In1.m[2][3] * In2.m[3][0] ; m[2][1] = In1.m[2][0] * In2.m[0][1] + In1.m[2][1] * In2.m[1][1] + In1.m[2][2] * In2.m[2][1] + In1.m[2][3] * In2.m[3][1] ; m[2][2] = In1.m[2][0] * In2.m[0][2] + In1.m[2][1] * In2.m[1][2] + In1.m[2][2] * In2.m[2][2] + In1.m[2][3] * In2.m[3][2] ; m[2][3] = In1.m[2][0] * In2.m[0][3] + In1.m[2][1] * In2.m[1][3] + In1.m[2][2] * In2.m[2][3] + In1.m[2][3] * In2.m[3][3] ; m[3][0] = In1.m[3][0] * In2.m[0][0] + In1.m[3][1] * In2.m[1][0] + In1.m[3][2] * In2.m[2][0] + In1.m[3][3] * In2.m[3][0] ; m[3][1] = In1.m[3][0] * In2.m[0][1] + In1.m[3][1] * In2.m[1][1] + In1.m[3][2] * In2.m[2][1] + In1.m[3][3] * In2.m[3][1] ; m[3][2] = In1.m[3][0] * In2.m[0][2] + In1.m[3][1] * In2.m[1][2] + In1.m[3][2] * In2.m[2][2] + In1.m[3][3] * In2.m[3][2] ; m[3][3] = In1.m[3][0] * In2.m[0][3] + In1.m[3][1] * In2.m[1][3] + In1.m[3][2] * In2.m[2][3] + In1.m[3][3] * In2.m[3][3] ;
サンプル

  ベクトルをY軸回転90度する行列とY軸回転-90度する2倍に拡大する行列を乗算して
 ベクトルに対してY軸回転行列→2倍拡大行列の順で VTransform を使用した場合と同じ効果がある行列を作成します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix, Matrix1, Matrix2 ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Y軸回転90度する行列とY軸回転-90度する行列を作成 Matrix1 = MGetRotY( DX_PI_F / 2.0f ) ; Matrix2 = MGetRotY( -DX_PI_F / 2.0f ) ; // 二つの行列を0.5倍して加算したものを Matrix に代入 Matrix = MAdd( MScale( Matrix1, 0.5f ), MScale( Matrix2, 0.5f ) ) ; // 適当な値を Vect1 に代入 Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ; // Vect1 を Matrix3 を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix1 の値を画面に表示 DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ; // Matrix2 の値を画面に表示 DrawString( 0, 96, "Y軸-90度回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ; DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ; DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ; // Matrix の値を画面に表示 DrawString( 0, 192, "乗算後の行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MScale( MATRIX InM, float Scale ) ;

概略行列のスケーリングを行う

引数 MATRIX InM : スケーリングする行列
float Scale : スケーリング値
戻り値スケーリングした結果の行列
解説  引数 InM で渡された行列の各要素に Scale を乗算した行列を戻り値として返す関数です。
戻り値行列 m[0][0] = InM.m[0][0] * Scale ; m[0][1] = InM.m[0][1] * Scale ; m[0][2] = InM.m[0][2] * Scale ; m[0][3] = InM.m[0][3] * Scale ; m[1][0] = InM.m[1][0] * Scale ; m[1][1] = InM.m[1][1] * Scale ; m[1][2] = InM.m[1][2] * Scale ; m[1][3] = InM.m[1][3] * Scale ; m[2][0] = InM.m[2][0] * Scale ; m[2][1] = InM.m[2][1] * Scale ; m[2][2] = InM.m[2][2] * Scale ; m[2][3] = InM.m[2][3] * Scale ; m[3][0] = InM.m[3][0] * Scale ; m[3][1] = InM.m[3][1] * Scale ; m[3][2] = InM.m[3][2] * Scale ; m[3][3] = InM.m[3][3] * Scale ;
サンプル

  ベクトルをY軸回転90度する行列とX軸回転90度する行列をそれぞれ0.5倍して
 加算したものを作ります。
  この行列はY軸回転90度する行列を使用して VTransform したベクトルと
 X軸回転90度する行列を使用して VTransform したベクトルをそれぞれ0.5倍して
 加算したものと同じ結果が出力される行列となります。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix, Matrix1, Matrix2 ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Y軸回転90度する行列とX軸回転90度する行列を作成 Matrix1 = MGetRotY( DX_PI_F / 2.0f ) ; Matrix2 = MGetRotX( DX_PI_F / 2.0f ) ; // 二つの行列を0.5倍して加算したものを Matrix に代入 Matrix = MAdd( MScale( Matrix1, 0.5f ), MScale( Matrix2, 0.5f ) ) ; // 適当な値を Vect1 に代入 Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ; // Vect1 を Matrix3 を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix1 の値を画面に表示 DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ; // Matrix2 の値を画面に表示 DrawString( 0, 96, "X軸90度回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ; DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ; DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ; DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ; // Matrix の値を画面に表示 DrawString( 0, 192, "乗算後の行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MTranspose( MATRIX InM ) ;

概略転置行列を取得する

引数 MATRIX InM : 転置する行列
戻り値転置した結果の行列
解説  引数 InM で渡された行列を転置したものを戻り値として返す関数です。
 転置行列とは行列要素の行と列を逆転したものです。
 転置する行列が回転行列の場合は逆回転する行列となります。
戻り値行列 m[0][0] = InM.m[0][0] ; m[0][1] = InM.m[1][0] ; m[0][2] = InM.m[2][0] ; m[0][3] = InM.m[3][0] ; m[1][0] = InM.m[0][1] ; m[1][1] = InM.m[1][1] ; m[1][2] = InM.m[2][1] ; m[1][3] = InM.m[3][1] ; m[2][0] = InM.m[0][2] ; m[2][1] = InM.m[1][2] ; m[2][2] = InM.m[2][2] ; m[2][3] = InM.m[3][2] ; m[3][0] = InM.m[0][3] ; m[3][1] = InM.m[1][3] ; m[3][2] = InM.m[2][3] ; m[3][3] = InM.m[3][3] ;
サンプル

  ベクトルをY軸回転90度する行列を転置した行列を使用してベクトルを回転します。
  回転行列を転置した行列は逆回転( Y軸回転-90度 )する行列となります。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix, Matrix2 ; VECTOR Vect1, Vect2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // Y軸回転90度する行列を Matrix2 に代入 Matrix2 = MGetRotY( DX_PI_F / 2.0f ) ; // Matrix2 を転置した行列を Matrix に代入 Matrix = MTranspose( Matrix2 ) ; // 適当な値を Vect1 に代入 Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ; // Vect1 を Matrix を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix ) ; // Matrix2 の値を画面に表示 DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ; // Matrix の値を画面に表示 DrawString( 0, 192, "転置行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX MInverse( MATRIX InM ) ;

概略逆行列を取得する

引数 MATRIX InM : 逆行列を求める行列
戻り値InM の逆行列
解説  引数 InM で渡された行列の逆行列を戻り値として返す関数です。
 行列は左から乗算する場合と右から乗算する場合で結果が変化するのですが、 逆行列は元の行列で左から乗算する場合と同じ結果が右から乗算した場合に出る行列です。

サンプル

  平行移動する行列とその逆行列を用意して、適当な値を持ったベクトルが
 平行移動行列→その逆行列 の順で VTransform すれば元の値に戻るかを試します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MATRIX Matrix, Matrix2 ; VECTOR Vect1, Vect2, Vect3 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 平行移動する行列を Matrix2 に代入 Matrix2 = MGetTranslate( VGet( 200.0f, 100.0f, 80.0f ) ) ; // Matrix2 の逆行列を Matrix に代入 Matrix = MInverse( Matrix2 ) ; // 適当な値を Vect1 に代入 Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ; // Vect1 を Matrix2 を使用して変換した値を Vect2 に代入 Vect2 = VTransform( Vect1, Matrix2 ) ; // Vect2 を Matrix2 の逆行列である Matrix で変換したものを Vect3 に代入 Vect3 = VTransform( Vect2, Matrix ) ; // Matrix2 の値を画面に表示 DrawString( 0, 0, "平行移動行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ; // Matrix の値を画面に表示 DrawString( 0, 192, "逆行列", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f", Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ; DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f", Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ; DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f", Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ; DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f", Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ; // 変換元のベクトル値 Vect1 を画面に表示 DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ; // 変換後のベクトル値 Vect2 を画面に表示 DrawString( 0, 336, "平行移動後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ; // 変換後のベクトル値 Vect3 を画面に表示 DrawString( 0, 384, "逆行列乗算後のベクトル", GetColor( 255,255,255 ) ) ; DrawFormatString( 0, 400, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect3.x, Vect3.y, Vect3.z ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




衝突検出系関数

宣言float Segment_Segment_MinLength( VECTOR SegmentAPos1, VECTOR SegmentAPos2, VECTOR SegmentBPos1, VECTOR SegmentBPos2 ) ;

概略二つの線分の最近点間の距離を得る

引数 VECTOR SegmentAPos1 : 二線分の片方の始点
VECTOR SegmentAPos2 : 二線分の片方の終点
VECTOR SegmentBPos1 : 二線分のもう片方の始点
VECTOR SegmentBPos2 : 二線分のもう片方の終点
戻り値二線分の最近点間の距離
解説  引数で渡された二つの線分が最も近づく点( 最近点 )同士の距離を得ます。

サンプル

  線分を二つ定義して、片方の線分の終点を左右動かし、二線分の最近点間の距離が 64 以下になった際に
 線分の色を赤色にします。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { float xadd, length ; VECTOR LineA1, LineA2, LineB1, LineB2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 二線分の座標をセット LineA1 = VGet( 0.0f, 0.0f, 0.0f ) ; LineA2 = VGet( 0.0f, 200.0f, 0.0f ) ; LineB1 = VGet( 320.0f, 480.0f, 0.0f ) ; LineB2 = VGet( 320.0f, 240.0f, 0.0f ) ; // 座標と加算数の初期化 xadd = 8.0f ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 線分の片方の終点を移動 LineA2.x += xadd ; if( LineA2.x < 0.0f || LineA2.x > 640.0f ) xadd = -xadd ; // 二線分の最近点どうしの距離を求める length = Segment_Segment_MinLength( LineA1, LineA2, LineB1, LineB2 ) ; // 片方の線分の描画 DrawLine( LineB1.x, LineB1.y, LineB2.x, LineB2.y, GetColor( 255,255,255 ) ) ; // もう一つの線分を距離が 64 以下だったら色を変えて描画 if( length < 64.0f ) { DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 255,0,0 ) ) ; } else { DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 0,255,0 ) ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float Segment_Triangle_MinLength( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) ;

概略線分と三角形の最近点間の距離を得る

引数 VECTOR SegmentPos1 : 線分の始点
VECTOR SegmentPos2 : 線分の終点
VECTOR TrianglePos1 : 三角形を形成する頂点1
VECTOR TrianglePos2 : 三角形を形成する頂点2
VECTOR TrianglePos3 : 三角形を形成する頂点3
戻り値線分と三角形の最近点間の距離
解説  引数で渡された線分と三角形が最も近づく点( 最近点 )同士の距離を得ます。

サンプル

  線分と三角形の座標を定義して、線分の終点を左右動かし、線分と三角形の最近点間の距離が 64 以下になった際に
 三角形の色を赤色にします。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { float xadd, length ; VECTOR Line1, Line2, Tri1, Tri2, Tri3 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 線分の座標と三角形を形成する3頂点の座標をセット Line1 = VGet( 0.0f, 0.0f, 0.0f ) ; Line2 = VGet( 0.0f, 400.0f, 0.0f ) ; Tri1 = VGet( 320.0f, 200.0f, 0.0f ) ; Tri2 = VGet( 280.0f, 260.0f, 0.0f ) ; Tri3 = VGet( 360.0f, 260.0f, 0.0f ) ; // 座標と加算数の初期化 xadd = 8.0f ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 線分の終点を移動 Line2.x += xadd ; if( Line2.x < 0.0f || Line2.x > 640.0f ) xadd = -xadd ; // 線分と三角形の最近点間の距離を求める length = Segment_Triangle_MinLength( Line1, Line2, Tri1, Tri2, Tri3 ) ; // 線分の描画 DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 255,255,255 ) ) ; // 三角形との距離が 64 以下だったら色を変えて描画 if( length < 64.0f ) { DrawTriangle( Tri1.x, Tri1.y, Tri2.x, Tri2.y, Tri3.x, Tri3.y, GetColor( 255,0,0 ), TRUE ) ; } else { DrawTriangle( Tri1.x, Tri1.y, Tri2.x, Tri2.y, Tri3.x, Tri3.y, GetColor( 0,255,0 ), TRUE ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float Segment_Point_MinLength( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR PointPos ) ;

概略線分と点の一番近い距離を得る

引数 VECTOR SegmentPos1 : 線分の始点
VECTOR SegmentPos2 : 線分の終点
VECTOR PointPos : 点の座標
戻り値線分と点が最も近づく座標間の距離
解説  引数で渡された線分と点が最も近づく座標間の距離を得ます。

サンプル

  線分と点の座標を定義して、点の座標を上下に動かし、線分と点の最近点間の距離が 64 以下になった際に
 線分の色を赤色にします。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { float yadd, length ; VECTOR Line1, Line2, Point ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 線分の座標と点の座標をセット Line1 = VGet( 0.0f, 0.0f, 0.0f ) ; Line2 = VGet( 640.0f, 480.0f, 0.0f ) ; Point = VGet( 320.0f, 0.0f, 0.0f ) ; // 座標と加算数の初期化 yadd = 4.0f ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 点の座標を移動 Point.y += yadd ; if( Point.y < 0.0f || Point.y > 480.0f ) yadd = -yadd ; // 線分と点が最も近づく座標間の距離を求める length = Segment_Point_MinLength( Line1, Line2, Point ) ; // 点の描画 DrawPixel( Point.x, Point.y, GetColor( 255,255,255 ) ) ; // 点との距離が 64 以下だったら色を変えて描画 if( length < 64.0f ) { DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 255,0,0 ) ) ; } else { DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 0,255,0 ) ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言HITRESULT_LINE HitCheck_Line_Triangle( VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) ;

概略三角形と線分の当たり判定

引数 VECTOR LinePos1 : 線分の始点
VECTOR LinePos2 : 線分の終点
VECTOR TrianglePos1 : 三角形を形成する頂点1
VECTOR TrianglePos2 : 三角形を形成する頂点2
VECTOR TrianglePos3 : 三角形を形成する頂点3
戻り値衝突情報構造体 HITRESULT_LINE
解説  引数で渡された線分と三角形が接触しているかどうかを判定して、 その結果を衝突情報構造体 HITRESULT_LINE で返してきます。

HITRESULT_LINE 構造体は非常に単純な構造体でメンバ変数は以下の二つだけです。
// 接触しているかどうか( 1:接触している 0:接触していない ) int HitFlag ; // 接触した座標( HitFlag が 1 の場合のみ有効 ) VECTOR Position ;
サンプル

  線分と三角形の座標を定義して、線分の終点を上下に動かしながら線分と三角形の当たり判定を行い
 三角形と接触した場合は線分の始点と接触点とを結ぶ線を描画します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { float yadd ; HITRESULT_LINE Result ; VECTOR Line1, Line2, Tri1, Tri2, Tri3 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 線分の座標と三角形の座標をセット Line1 = VGet( 0.0f, 240.0f, 0.0f ) ; Line2 = VGet( 640.0f, 240.0f, 0.0f ) ; Tri1 = VGet( 320.0f, 128.0f, 0.0f ) ; Tri2 = VGet( 320.0f, 240.0f, 200.0f ) ; Tri3 = VGet( 320.0f, 240.0f, -200.0f ) ; // 座標と加算数の初期化 yadd = 4.0f ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 線の終点座標を移動 Line2.y += yadd ; if( Line2.y < 0.0f || Line2.y > 480.0f ) yadd = -yadd ; // 線分と点が最も近づく座標間の距離を求める Result = HitCheck_Line_Triangle( Line1, Line2, Tri1, Tri2, Tri3 ) ; // 三角形を真横から見たときにできる線を描画 DrawLine( Tri1.x, Tri1.y, Tri2.x, Tri2.y, GetColor( 255,255,255 ) ) ; // 三角形と接触していたら始点と接触点を結ぶ線を // そうでない場合は始点と終点を結ぶ線を描画する if( Result.HitFlag == 1 ) { DrawLine( Line1.x, Line1.y, Result.Position.x, Result.Position.y, GetColor( 255,0,0 ) ) ; } else { DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 0,255,0 ) ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。





戻る