読者です 読者をやめる 読者になる 読者になる

好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

三角形の面積を求めるプログラムをサクッと組もうと思ったら google 先生のお世話になってしまった

外積の公式を暗記してなかった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;
}

追記

最初に作ったときの外積を求める関数が、pOutと a,b に同じ変数を与えるとバグることに気づいて直した。