結果
問題 | No.132 点と平面との距離 |
ユーザー | __NCAstar |
提出日時 | 2015-01-20 23:40:06 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 58 ms / 5,000 ms |
コード長 | 2,745 bytes |
コンパイル時間 | 1,298 ms |
コンパイル使用メモリ | 161,140 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-22 23:21:01 |
合計ジャッジ時間 | 1,787 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 |
ソースコード
#include<bits/stdc++.h> #define REP(i,s,n) for(int i=s;i<n;i++) #define rep(i,n) REP(i,0,n) #define EPS (1e-10) #define equals(a,b) (fabs((a)-(b))<EPS) using namespace std; //Verify AOJ 0115 class Point3d{ public: double x,y,z; Point3d(double x=0,double y=0,double z=0):x(x),y(y),z(z){} Point3d operator + (const Point3d& a){ return Point3d(x+a.x,y+a.y,z+a.z); } Point3d operator - (const Point3d& a){ return Point3d(x-a.x,y-a.y,z-a.z); } Point3d operator * (const double& d){ return Point3d(x*d,y*d,z*d); } Point3d operator / (const double& d){ return Point3d(x/d,y/d,z/d); } bool operator < (const Point3d& p)const { return !equals(x,p.x)?x<p.x:((!equals(y,p.y))?y<p.y:(!equals(z,p.z)&&z<p.z)); } bool operator == (const Point3d& p)const{ return equals(x,p.x) && equals(y,p.y) && equals(z,p.z); } }; //Verify AOJ 0115 struct Segment3d{ Point3d p[2]; Segment3d(Point3d p1=Point3d(),Point3d p2=Point3d()){ p[0] = p1, p[1] = p2; } bool operator == (const Segment3d& seg)const{ return ( p[0] == seg.p[0] && p[1] == seg.p[1] ) || ( p[0] == seg.p[1] && p[1] == seg.p[0] ); } }; typedef Point3d Vector3d; //Verify AOJ 0115 double dot(const Point3d& a,const Point3d& b){ return a.x*b.x + a.y*b.y + a.z*b.z; } //Verify AOJ 0115 Vector3d cross(const Point3d& a,const Point3d& b){ return Vector3d(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x); } //Verify AOJ 0115 inline double norm(const Point3d &p){ return p.x*p.x + p.y*p.y + p.z*p.z; } //Verify AOJ 0115 inline double abs(const Point3d &p){ return sqrt(norm(p)); } class Plane3d{ public: Point3d normal_vector; //法線ベクトル double d; // 平面方程式 normal_vector.x * x + normal_vector.y * y + normal_vector.z * z + d = 0 Plane3d(Point3d normal_vector=Point3d(),double d=0):normal_vector(normal_vector),d(d){} Plane3d(Vector3d a,Vector3d b,Vector3d c){ Vector3d v1 = b - a; Vector3d v2 = c - a; Vector3d tmp = cross(v1,v2); normal_vector = tmp / abs(tmp); set_d(a); } //Verify AOJ 0115 //法線ベクトルnormal_vectorと平面上の1点からdを計算する void set_d(Point3d p){ d = dot(normal_vector,p); } //平面と点pの距離を求める double distanceP(Point3d p){ Point3d a = normal_vector * d;//平面上の適当な点をつくる return abs( dot(p-a,normal_vector) ); } }; int main(){ int N; cin >> N; Point3d p; cin >> p.x >> p.y >> p.z; vector<Point3d> arr(N); rep(i,N) cin >> arr[i].x >> arr[i].y >> arr[i].z; double answer = 0; rep(i,N) REP(j,i+1,N) REP(k,j+1,N) { Plane3d plane(arr[i],arr[j],arr[k]); answer += plane.distanceP(p); } printf("%.10f\n",answer); return 0; }