このソースコードは"Windows 10 Home 64ビットオペレーションシステム X64ベースプロセッサのPCで、コンパイラはVisual Studio 2015で記述しています。
参考にした、あるいは知識の確認のために参照したページや書籍・コード
『ゲーム開発のための数学・物理学入門 改訂版』第四章:ベクトル演算
『新版・明解C++ 入門編』P392:constメンバ関数
『ロベールのC++教室』第59章 構造体2
http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01059.html
『ロベールのC++教室』第37章 参照
http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01037.html
『C++入門』27.演算子のオーバーロード
http://wisdom.sakura.ne.jp/programming/cpp/cpp27.html
Unity Vector3構造体(C:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll)
UnrealEngine4 FVector構造体
勉強中の身であり、上記ゲームエンジンのコードに類似していたり、そのほか見苦しい点があるとは思いますが、ご了承ください
#pragma once
#include "stdafx.h"
#include <math.h>
#define RadToDeg 57.29577851f
struct Vector3D
{
float x;
float y;
float z;
public:
inline Vector3D::Vector3D(float x, float y)
:x(x), y(y) {}
inline Vector3D::Vector3D(float v)
: x(v), y(v), z(v) {}
inline Vector3D::Vector3D(float x, float y, float z)
: x(x), y(y), z(z) {}
inline static void Normalize(const Vector3D& v);//ベクトルを正規化する
inline Vector3D operator+(const Vector3D& v)
{
return Vector3D(x + v.x, y + v.y, z + v.z);
}
inline Vector3D operator+(const float scolar)
{
return Vector3D(x + scolar, y + scolar, z + scolar);
}
inline Vector3D operator-(const Vector3D& v) {
return(x - v.x, y - v.y, z - v.z);
}
inline Vector3D operator-(const float scolar)
{
return(x - scolar, y - scolar, z - scolar);
}
inline Vector3D Vector3D::operator*(float scolar)const
{
return Vector3D(x*scolar, y*scolar, z*scolar);
}
inline Vector3D Vector3D::operator*(const Vector3D& v)const
{
return Vector3D(x*v.x, y*v.y, z*v.z);
}
inline float Vector3D::operator|(const Vector3D& v)const
{
return x*v.x + y*v.y + z*v.z;
}
inline Vector3D Vector3D::operator^(const Vector3D& v)const
{
return Vector3D(y*v.z - z*v.y,z*v.x - x*v.z,x*v.y - y*v.x);
}
inline Vector3D operator/(const Vector3D& v)const
{
return Vector3D(x / v.x, y / v.y, z / v.z);
}
bool operator==(const Vector3D& v)const
{
return(x == v.z&&y == v.y&&z == v.z);
}
inline static Vector3D CrossProduct(const Vector3D& a, const Vector3D& b)
{
return a^b;
}
/*
inline Vector3D operator+(const Vector3D& v) const;
inline Vector3D operator+(const float scolar) const;
inline Vector3D operator-(const Vector3D& v) const;
inline Vector3D operator-(const float scolar) const;
inline Vector3D operator*(float a)const;
inline Vector3D operator*(const Vector3D& v)const;
inline Vector3D operator/(const Vector3D& v)const;
inline float operator|(const Vector3D& v)const;
inline Vector3D operator^(const Vector3D& v)const;
bool operator==(const Vector3D& v)const;
*/
/*別のベクトルと等しいか比較して、
真ならtrue、偽ならfalseを返す*/
inline Vector3D::Vector3D() {
}
inline float Getsize()
{
return sqrt(x*x + y*y + z*z);
}
inline static float Dot(const Vector3D& a, const Vector3D& b)
{
return a | b;
}
inline static void Normalize(Vector3D& v)
{
float magnitude = (v.x*v.x + v.y*v.y + v.z*v.z);//ベクトルの大きさ
v.x /= magnitude; v.y /= magnitude; v.z /= magnitude;//各成分をベクトルの成分で割る
}
inline static float Angle(const Vector3D& a, const Vector3D& b)
{
float dot = Vector3D::Dot(a, b);//内積を計算する。
float Amag = sqrt(a.x*a.x + a.y*a.y + a.z*a.z);//aの大きさを計算する
float Bmag = sqrt(b.x*a.x + b.y*a.y + b.z*b.z);//bの大きさを計算する
float cos = dot / (Amag*Bmag);//cosθを求める
float radian = acos(cos);//cosθのラジアンを求める
float degree = radian*RadToDeg;//ラジアンを度に変換する
return degree;//度を返す
}
inline static Vector3D normal(const Vector3D&a, const Vector3D& b)
{
Vector3D cross = CrossProduct(a, b);
float size = sqrt(((a.y*b.z - a.z*b.y)*(a.y*b.z - a.z*b.y)) +
((a.z*b.x - a.x*b.z)*(a.z*b.x - a.x*b.z)) +
((a.x*b.y - a.y*b.x)*(a.x*b.y - a.y*b.x)));
cross.x /= size; cross.y /= size; cross.z /= size;
return Vector3D(cross.x, cross.y, cross.z);
}
};