コード:
-------------------------------------------------------------- [加算]
宣言 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 に代入します。
#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 ;
}
-------------------------------------------------------------- [減算]
宣言 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 に代入します。
#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 ;
}
-------------------------------------------------------------- [乗算]
宣言 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 を使用した場合と同じ効果がある行列を作成します。
#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 ;
}
------------------------------------------------------------------ [おまけ逆行列]
宣言 MATRIX MInverse( MATRIX InM ) ;
概略 逆行列を取得する
引数 MATRIX InM : 逆行列を求める行列
戻り値 InM の逆行列
解説 引数 InM で渡された行列の逆行列を戻り値として返す関数です。
行列は左から乗算する場合と右から乗算する場合で結果が変化するのですが、 逆行列は元の行列で左から乗算する場合と同じ結果が右から乗算した場合に出る行列です。
サンプル
平行移動する行列とその逆行列を用意して、適当な値を持ったベクトルが
平行移動行列→その逆行列 の順で VTransform すれば元の値に戻るかを試します。
#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 ;
}
-------------------------------------------------------------- [おまけ算法:内積]
宣言 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 の内積を画面に表示します。
#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 ;
}
-------------------------------------------------------------- [おまけ算法:外積]
宣言 float VDot( VECTOR In1, VECTOR In2 ) ;
宣言 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 の外積を画面に表示します。
#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 ;
}
-------------------------------------------------