結果

問題 No.622 点と三角柱の内外判定
ユーザー akirauenoakiraueno
提出日時 2020-08-24 01:10:42
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 1,500 ms
コード長 2,099 bytes
コンパイル時間 785 ms
コンパイル使用メモリ 73,924 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-04-23 18:45:44
合計ジャッジ時間 2,030 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 1 ms
6,944 KB
testcase_08 AC 2 ms
6,940 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 2 ms
6,940 KB
testcase_11 AC 2 ms
6,940 KB
testcase_12 AC 2 ms
6,940 KB
testcase_13 AC 2 ms
6,944 KB
testcase_14 AC 2 ms
6,944 KB
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 2 ms
6,944 KB
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 AC 2 ms
6,944 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 AC 2 ms
6,940 KB
testcase_22 AC 2 ms
6,944 KB
testcase_23 AC 2 ms
6,940 KB
testcase_24 AC 2 ms
6,944 KB
testcase_25 AC 2 ms
6,944 KB
testcase_26 AC 2 ms
6,940 KB
testcase_27 AC 2 ms
6,940 KB
testcase_28 AC 2 ms
6,940 KB
testcase_29 AC 2 ms
6,948 KB
testcase_30 AC 2 ms
6,940 KB
testcase_31 AC 2 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;

struct vec {
  // 3次元ベクトル
  double x;
  double y;
  double z;

  vec (double x = 0.0, double y = 0.0, double z = 0.0) {
    vec::x = x;
    vec::y = y;
    vec::z = z;
  }

  vec operator +(vec const & r ) {
    return vec{ x + r.x,
                y + r.y,
                z + r.z };
  }
  
  vec operator -(vec const & r ) {
    return vec{ x - r.x,
                y - r.y,
                z - r.z };
  }
  
  double dot (vec const &r) {
    // (l, r)
    return x * r.x + y * r.y + z * r.z;
  }
  
  vec cross (vec const &r) {
    // l x r
    return vec{ y * r.z - z * r.y,
                z * r.x - x * r.z,
                x * r.y - y * r.x };
  }
  
  double pow2_magnitude() {
    return pow(x, 2) + pow(y, 2) + pow(z, 2);
  }
};

vec operator*(double k, vec r) {
  // k * r;
  return vec{ k * r.x, k * r.y, k * r.z };
}

vec normal_vec(vec triangle[]) {
  vec ab = triangle[1] - triangle[0];
  vec ac = triangle[2] - triangle[0];
  return ab.cross(ac);
}

bool is_inside_triangle(vec p, vec triangle[]) {
  vec ab = triangle[1] - triangle[0]; vec bp = p - triangle[1];
  vec bc = triangle[2] - triangle[1]; vec cp = p - triangle[2];
  vec ca = triangle[0] - triangle[2]; vec ap = p - triangle[0];
  vec ab_x_bp = ab.cross(bp);
  vec bc_x_cp = bc.cross(cp);
  vec ca_x_ap = ca.cross(ap);
  if (ab_x_bp.dot(bc_x_cp) > 0 && bc_x_cp.dot(ca_x_ap) > 0) {
    return true;
  } else {
    return false;
  }
}

bool is_inside_prism(vec p, vec triangle[]) {
  vec n = normal_vec(triangle);
  double d = -n.dot(triangle[0]);
  vec h = p - (n.dot(p) + d) / n.dot(n) * n; // pから三角形に下ろした垂線の足
  // cout << h.x << " " <<  h.y << " " << h.z << endl;
  return is_inside_triangle(h, triangle);
}

int main(int argc, char *argv[]) {
  vec a, b, c, d;
  cin >> a.x >> a.y >> a.z;
  cin >> b.x >> b.y >> b.z;
  cin >> c.x >> c.y >> c.z;
  cin >> d.x >> d.y >> d.z;
  vec triangle [3] = {a, b, c};
  cout << (is_inside_prism(d, triangle) ? "YES" : "NO") << endl;
  return 0;
}
0