1#ifndef COORDINATE_UNIT_H_
2#define COORDINATE_UNIT_H_
10#include "bits/float_cmp.h"
42 this->x_milli +=
obj.x_milli;
43 this->y_milli +=
obj.y_milli;
44 this->ang_rad +=
obj.ang_rad;
48 this->x_milli -=
obj.x_milli;
49 this->y_milli -=
obj.y_milli;
50 this->ang_rad -=
obj.ang_rad;
87 return std::hypot(
p1.x_milli -
p2.x_milli,
p1.y_milli -
p2.y_milli);
98constexpr T lerp(
const T&
a,
const T&
b,
float t)
noexcept {
99 return a +
t * (
b -
a);
106CoordinateUnit<N> operator+(
const CoordinateUnit<N>& lhs,
const CoordinateUnit<N>& rhs) {
107 CoordinateUnit<N> nrv{lhs};
112CoordinateUnit<N> operator-(
const CoordinateUnit<N>& lhs,
const CoordinateUnit<N>& rhs) {
113 CoordinateUnit<N> nrv{lhs};
118CoordinateUnit<N> operator*(
const CoordinateUnit<N>& lhs,
const float rhs) {
124CoordinateUnit<N> operator*(
const float lhs,
const CoordinateUnit<N>& rhs) {
128CoordinateUnit<N> operator/(
const CoordinateUnit<N>& lhs,
const float rhs) {
134CoordinateUnit<N + 1> operator*(
const CoordinateUnit<N>& obj,
const std::chrono::microseconds& sec) {
135 return unit_cast<N + 1>(obj * sec.count() * 1e-6);
138CoordinateUnit<N + 1> operator*(
const std::chrono::microseconds& sec,
const CoordinateUnit<N>& obj) {
142CoordinateUnit<N - 1> operator/(
const CoordinateUnit<N>& obj,
const std::chrono::microseconds& sec) {
143 return unit_cast<N - 1>(obj / sec.count() * 1e6);
146bool operator==(
const CoordinateUnit<N>& lhs,
const CoordinateUnit<N>& rhs) {
147 return impl::float_cmp(lhs.x_milli, rhs.x_milli) == 0 && impl::float_cmp(lhs.y_milli, rhs.y_milli) == 0 &&
148 impl::float_cmp(lhs.ang_rad, rhs.ang_rad) == 0;
151bool operator!=(
const CoordinateUnit<N>& lhs,
const CoordinateUnit<N>& rhs) {
152 return !(lhs == rhs);
constexpr T lerp(const T &a, const T &b, float t) noexcept
二点aとbの間を、時間tで線形補間 (linear interpolate) する。
constexpr float distance(const Coordinate &p1, const Coordinate &p2)
2つの座標間の距離を計算する。
CoordinateUnit< M > unit_cast(const CoordinateUnit< N > &obj)
CoordinateUnitをCoordinateUnitにキャストする。
座標、速度を示す構造体。 rct::Coordinate, rct::Velocity
CoordinateUnit & operator+=(const CoordinateUnit &obj) noexcept
各種演算子を定義する。
CoordinateUnit & operator/=(const float obj) noexcept
各種演算子を定義する。
CoordinateUnit & operator*=(const float obj) noexcept
各種演算子を定義する。
CoordinateUnit & operator-=(const CoordinateUnit &obj) noexcept
各種演算子を定義する。
static constexpr auto dimension() noexcept
時間の次元を取得する。