Skip to content
This repository has been archived by the owner on Jan 16, 2023. It is now read-only.

Commit

Permalink
Vector2D.hppにコメントを追加、少し変更
Browse files Browse the repository at this point in the history
  • Loading branch information
H1rono committed Aug 17, 2022
1 parent ecf1717 commit ada0119
Showing 1 changed file with 138 additions and 39 deletions.
177 changes: 138 additions & 39 deletions include/ssr/Vector2D.hpp
Original file line number Diff line number Diff line change
@@ -1,71 +1,170 @@
/**
* @file Vector2D.hpp
* @author H1rono ([email protected])
* @brief 2次元ベクトル型Vector2D
* @version 0.1
* @copyright Copyright (c) 2022 ssr2022-saka-maza
*/

#pragma once

#ifndef SSR_VECTOR_2D_HPP

/**
* @brief ssr/Vector2D.hppがインクルードされていることを示すdefine
*/
#define SSR_VECTOR_2D_HPP

#include <math.h>

// このライブラリが使う名前空間
/**
* @brief このライブラリが使う名前空間
*/
namespace ssr {

template<typename Value> class Vector2D {
public:
Value x, y;

Vector2D(Value x = 0, Value y = 0)
: x(x), y(y) {}

auto dot(const Vector2D<Value> v) -> decltype(x * v.x + y * v.y) {
return x * v.x + y * v.y;
}

auto angle() -> decltype(atan2(y, x)) {
return atan2(y, x);
}

auto magSq() -> decltype(x * x + y * y) {
return x * x + y * y;
}

auto mag() -> decltype(sqrt(magSq())) {
return sqrt(magSq());
}
};
/**
* @brief 2次元ベクトルを表現する型
* @tparam T 成分の型
*/
template<typename T> class Vector2D {
public:
/**
* @brief 成分の型
*/
using Value = decltype(T(0));

/**
* @brief x成分
*/
T x;

/**
* @brief y成分
*/
T y;

/**
* @brief Construct a new Vector 2 D object
* @param x x成分
* @param y y成分
*/
Vector2D(T x = 0, T y = 0)
: x(x), y(y) {}

/**
* @brief ベクトルとの内積
* @param v 内積をとるベクトル
* @return decltype(x * v.x + y * v.y) 内積の値
*/
auto dot(const Vector2D<T> v) -> decltype(x * v.x + y * v.y) {
return x * v.x + y * v.y;
}

/**
* @brief ベクトルの偏角
* @return decltype(atan2(y, x)) x軸から何ラジアン回転したか
*/
auto angle() -> decltype(atan2(y, x)) {
return atan2(y, x);
}

/**
* @brief ベクトルの大きさの2乗
* @return decltype(x * x + y * y) 大きさの2乗
*/
auto magSq() -> decltype(x * x + y * y) {
return x * x + y * y;
}

/**
* @brief ベクトルの大きさ
* @return decltype(sqrt(magSq())) ベクトルの大きさ
*/
auto mag() -> decltype(sqrt(magSq())) {
return sqrt(magSq());
}
}; // class Vector2D

} // namespace ssr

template<typename Value>
bool operator == (const ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
/**
* @brief ベクトルが等しいかどうか
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return true 2ベクトルの成分が全て等しい
* @return false 2ベクトルの成分のいずれかが異なる
*/
template<typename T1, typename T2>
bool operator==(const ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh) {
return lh.x == rh.x && lh.y == rh.y;
}

template<typename Value>
bool operator != (const ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
return lh.x != rh.x && lh.y != rh.y;
/**
* @brief ベクトルが異なるかどうか
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return true 2ベクトルの成分のいずれかが異なる
* @return false 2ベクトルの成分が全て等しい
*/
template<typename T1, typename T2>
bool operator!=(const ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh) {
return lh.x != rh.x || lh.y != rh.y;
}

template<typename Value>
ssr::Vector2D<Value> & operator += (ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
/**
* @brief ベクトルにincremental addする
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return ssr::Vector2D<T>& incremental addしたベクトルの参照
*/
template<typename T1, typename T2>
ssr::Vector2D<T1> & operator+=(ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh) {
lh.x += rh.x;
lh.y += rh.y;
return lh;
}

template<typename Value>
ssr::Vector2D<Value> & operator -= (ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
/**
* @brief ベクトルにincremental subtractする
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return ssr::Vector2D<T>& incremental subtractしたベクトルの参照
*/
template<typename T1, typename T2>
ssr::Vector2D<T1> & operator-=(ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh) {
lh.x -= rh.x;
lh.y -= rh.y;
return lh;
}

template<typename Value>
ssr::Vector2D<Value> operator + (const ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
return ssr::Vector2D<Value>{lh.x + rh.x, lh.y + rh.y};
/**
* @brief ベクトルの足し算
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return ssr::Vector2D<T>& 足し算したベクトル
*/
template<typename T1, typename T2>
auto operator+(const ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh)
-> ssr::Vector2D<decltype(lh.x + rh.x)> {
return ssr::Vector2D<decltype(lh.x + rh.x)>{lh.x + rh.x, lh.y + rh.y};
}

template<typename Value>
ssr::Vector2D<Value> operator - (const ssr::Vector2D<Value> & lh, const ssr::Vector2D<Value> & rh) {
return ssr::Vector2D<Value>{lh.x - rh.x, lh.y - rh.y};
/**
* @brief ベクトルの引き算
* @tparam T 成分の型
* @param lh 左辺
* @param rh 右辺
* @return ssr::Vector2D<T>& 引き算したベクトル
*/
template<typename T1, typename T2>
auto operator-(const ssr::Vector2D<T1> & lh, const ssr::Vector2D<T2> & rh)
-> ssr::Vector2D<decltype(T1(0) - T2(0))> {
return ssr::Vector2D<decltype(T1(0) - T2(0))>{lh.x - rh.x, lh.y - rh.y};
}

#endif /* SSR_VECTOR_2D_HPP */

0 comments on commit ada0119

Please sign in to comment.