二次元ベクトルを扱うには Udon::Vec2
クラスを使用します。
#include <Udon/Types/Vector2D.hpp>
二次元ベクトルを表現するためのクラスです。x 軸と y 軸の 2 つの要素からなる二次元ベクトルを格納し、ベクトル演算や座標変換などの操作を提供します。
struct Vec2
{
double x;
double y;
};
x 軸の右方向を正、y 軸の上方向を正とする直交座標系を使用します。
Udon::Vec2 vector; // { 0, 0 }
Udon::Vec2 vector ( 1234.5, 6.789 );
Udon::Vec2 vector { 1234.5, 6.789 };
Udon::Vec2 vector = { 1234.5, 6.789 };
auto vector = Udon::Vec2 { 1234.5, 6.789 };
Vec2
型のインスタンスには、x
と y
という 2 つの要素があります。これらの要素にアクセスするには、メンバ変数へのドット演算子(.
)を使用します。
書き込み
Udon::Vec2 vector { 2, 3 };
vector.x = 1234.5;
vector.y = 5678;
読み取り
Udon::Vec2 vector { 1234.5, 6.789 };
double x = vector.x;
double y = vector.y;
Vector2D
クラスにはベクトル演算を行うための各種演算子があります。以下はその一部です。
加算
Udon::Vec2 vector1 { 2.0, 3.0 };
Udon::Vec2 vector2 { 1.0, -1.5 };
Udon::Vec2 result = vector1 + vector2;
// result = { 3.0, 1.5 }
減算
Udon::Vec2 vector1 { 2.0, 3.0 };
Udon::Vec2 vector2 { 1.0, -1.5 };
Udon::Vec2 result = vector1 - vector2;
// result = { 1.0, 4.5 }
スカラ倍
Udon::Vec2 vector { 2.0, 3.0 };
double scalar = 1.5;
Udon::Vec2 result = vector * scalar;
// result = { 3.0, 4.5 }
setup
関数内で Serial.begin()
を呼び出しシリアル通信が開始されている必要があります。
void setup()
{
Serial.begin(115200);
Udon::Vec2 vector { 3.0, 4.0 };
vector.show();
//> x: 3.0 y: 4.0
}
三平方の定理を用いてベクトルの長さを求めます。
const Udon::Vec2 vector { 3.0, 4.0 };
const double length = vector.length();
// length = 5.0
他のベクトルとの距離を求めます。
const Udon::Vec2 vector1 { 1.0, 2.0 };
const Udon::Vec2 vector2 { 4.0, 6.0 };
const double distance = vector1.distanceFrom(vector2); // ベクトル間の距離
// distance = 5.0
指定された点からの角度を求めます。
原点からの時計回りの角度を求めます
ベクトルの長さ(大きさ)を指定した値に設定したベクトルを返します。ベクトルの向きは変わらず、大きさのみが変更されます。
基になるベクトルは変更されません。
const Udon::Vec2 vector(3.0, 4.0);
const auto newVector = vector.scaledLength(2.0); // ベクトルの長さを設定
// newVector = { 1.2, 1.6 } (大きさが2.0のベクトル)
ベクトルの長さ(大きさ)を指定した値に変更します。
基になるベクトルを変更します。
長さに 0 を渡すとゼロベクトルとなり方向成分を失うため、次回呼び出し以降の長さ変更ができなくなる点に注意してください。
Udon::Vec2 vector(3.0, 4.0);
vector.scaleLength(2.0); // ベクトルの長さを変更
// vector = { 1.2, 1.6 } (大きさが2.0に変更されたベクトル)
回転行列を用いて、ベクトルを指定した角度回転させた新しいベクトルを返します。
回転の中心は原点、回転方向は時計回りです。
基になるベクトルは変更されません。
const Udon::Vec2 vector { 1.0, 0.0 };
const Udon::Vec2 rotated = vector.rotated(Udon::ToRadians(45.0));
// rotated = { 0.707, 0.707 } (45度回転したベクトル)
回転行列を用いて、ベクトルを指定した角度回転させます。
回転の中心は原点、回転方向は時計回りです。
基になるベクトルを変更します。
Udon::Vec2 vector { 1.0, 0.0 };
vector.rotate(Udon::ToRadians(45));
// vector = { 0.707, 0.707 } (45度回転したベクトル)
回転行列を用いて、指定した回転中心(中心点)を基準にベクトルを指定した角度(ラジアン)だけ回転させた新しいベクトルを返します。
回転方向は時計回りです。
基になるベクトルは変更されません。
const Udon::Vec2 vector { 2.0, 1.0 };
const Udon::Vec2 center { 1.0, 1.0 };
const Udon::Vec2 rotated = vector.rotatedAt(center, Udon::ToRadians(90)); // ベクトルの回転
// rotated = { 1.0, 0.0 } (中心を軸にして90度回転したベクトル)
回転行列を用いて、指定した回転中心(中心点)を基準にベクトルを指定した角度(ラジアン)だけ回転させます。
回転方向は時計回りです。
基になるベクトルを変更します。
Udon::Vec2 vector { 2.0, 1.0 };
const Udon::Vec2 center { 1.0, 1.0 };
vector.rotateAt(center, Udon::ToRadians(90)); // ベクトルの回転
// vector = { 1.0, 0.0 } (中心を軸にして90度回転したベクトル)
ベクトル(x, y)を極座標系(r, θ)に変換し返します。
const Udon::Vec2 vector{ 100.0, 200.0 }
const Udon::Polar polar = vector.toPolar();
各要素に constrain(Arduino)、 std::clamp(STL) を適用させたベクトルを返します。
基になるベクトルは変更されません。
const Udon::Vec2 vector{ 100.0, 200.0 };
const Udon::Vec2 clamped = vector.clamped(130, 180);
// clamped = { 130, 180 }
各要素に constrain(Arduino)、 std::clamp(STL) を適用させ代入します。
基になるベクトルを変更します。
Udon::Vec2 vector{ 100.0, 200.0 };
vector.clamp(130, 180);
// vector = { 130, 180 }
各要素をある範囲から別の範囲に再マップしたベクトルを返します。
各要素に map(Arduino) を適用させたベクトルを返します。
基になるベクトルは変更されません。
const Udon::Vec2 vector{ 100.0, 200.0 };
const Udon::Vec2 mapped = vector.mapped(0, 200, 0, 400);
// mapped = { 200.0, 400.0 }
各要素をある範囲から別の範囲に再マップします。
各要素に map(Arduino) を適用させます。
基になるベクトルを変更します。
Udon::Vec2 vector{ 100.0, 200.0 };
vector.map(0, 200, 0, 400);
// vector = { 200.0, 400.0 }
OpenSiv3D
が持つ s3d::Vector2D<T>
との相互変換を行えます。
s3d::Vec2 sivVector;
Udon::Vec2 udonVector = sivVector; // 変換コンストラクタによる変換
Udon::Vec2 udonVector;
s3d::Vec2 sivVector = udonVector; // キャスト演算子 (operator s3d::Vector2D) による変換
このクラスはシリアライズ(バイト列化)に対応しています。したがって各通信用クラスに渡すことでマイコン同士でベクトルデータのやり取りができます。詳細は各通信用クラスのドキュメントを参照してください。
Udon::Vec2 vector { 3.0, 4.0 };
writer.setMessage(vector);