結果

問題 No.622 点と三角柱の内外判定
ユーザー akiraueno
提出日時 2020-08-24 01:10:42
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 1,500 ms
コード長 2,099 bytes
コンパイル時間 715 ms
コンパイル使用メモリ 72,392 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-15 19:32:37
合計ジャッジ時間 1,928 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 32
権限があれば一括ダウンロードができます

ソースコード

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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0