自分用メモ：ベクトル演算のソースコード（作成中）

このソースコードは"Windows 10 Home 64ビットオペレーションシステム X64ベースプロセッサのPCで、コンパイラはVisual Studio 2015で記述しています。


参考にした、あるいは知識の確認のために参照したページや書籍・コード
『ゲーム開発のための数学・物理学入門　改訂版』第四章：ベクトル演算
『新版・明解C++　入門編』P392：constメンバ関数
>『ロベールのC++教室』第５９章　構造体２
http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01059.html

>『ロベールのC++教室』第３７章　参照
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構造体

勉強中の身であり、上記ゲームエンジンのコードに類似していたり、そのほか見苦しい点があるとは思いますが、ご了承ください


```c++

#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);

	}

};

```