LoginSignup
1
0

More than 5 years have passed since last update.

自分用メモ:ベクトル演算のソースコード(作成中)

Last updated at Posted at 2018-03-27

このソースコードは"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);

    }

};

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0