外積の公式を暗記してなかったorz
あんまりちゃんと確認してないけど、たぶんあってる……と思う。割る2じゃなくて、かける0.5をしてしまうのは、割り算の遅さを気にしてしまうゲームプログラマの体質である。とかいう割には float じゃなくて double 使って書いてしまったけどー。C++ で double とか久しぶりに使った!(ぇ)
#include <cstdio> #include <cmath> struct Vec3 { double x,y,z; Vec3 operator-(const Vec3& o) const { Vec3 r = *this; return r -= o; } Vec3& operator-=(const Vec3& o) { this->x -= o.x; this->y -= o.y; this->z -= o.z; return *this; } double len() const { return sqrt( this->x*this->x + this->y*this->y + this->z*this->z); } }; Vec3* OuterProduct(Vec3* pOut, const Vec3& a, const Vec3& b) { Vec3 out; out.x = a.y * b.z - a.z * b.y; out.y = a.z * b.x - a.x * b.z; out.z = a.x * b.y - a.y * b.x; *pOut = out; return pOut; } int main() { // 三角形の点 Vec3 A = {0,0,0}; Vec3 B = {20,0,0}; Vec3 C = {10,10,0}; // 三角形の辺 Vec3 b = C-A; Vec3 c = B-A; Vec3 outer; double ans = OuterProduct(&outer, b,c)->len() * 0.5; printf("%lf\n", ans); return 0; }