オイラー角で忘れがちな計算。随時追加していきます。
0~180°の角度を0~360°に正規化する
XZ平面にてベクトル同士の成す角度を内積とアークコサインで計算すると、0~180°に収まるが、これを0~360°にしたい場合、外積の符号を使う。ポイントを時計回りの順でソートしたい場合などに便利。
X軸方向のベクトル(1,0,0)に対する各ポイントの角度。
//
// Run Over: Detail
//
float crossY(vector v0; vector v1;)
{
return(v0.z * v1.x - v1.z * v0.x);
}
for(int i = 0; i < npoints(0); i++)
{
vector pos = point(0, "P", i);
float angle = acos(dot(normalize(pos), set(1,0,0)));
// 外積のY成分で比較
float y = crossY(normalize(pos), set(1,0,0));
// 負の場合は補角を取る
if(y < 0)
angle = 2*PI - angle;
setpointattrib(0, "__angle", i, degrees(angle));
}
マイナス領域の値をプラスで求める
オイラー角のマイナス領域での余りを一周回ったプラスの値にしたい場合の計算方法。
たとえば、-3°を357°にしたかったり、-10°を350°にしたい場合は
(-3° +360°) % 360° = 357°
と事前に360°を足して計算する。
float angle = -3;
if(angle < 0)
angle = 360 – Math.Abs(angle % 360)