UVA11275 3D三角形(三次元形状)

https://www.luogu.com.cn/problem/UVA11275

3次元はじめ、ボードを掲示。

  1  の#define IOのstd :: IOS :: sync_with_stdio(0)
   2の#include <ビット/ STDC ++ H>
   3  使用して 名前空間  STDを、
  4つの CONST  ダブル EPS = 1E- 6   5  
  6  int型 DCMP(ダブルX){
   7      場合(ファブ(X)<EPS)戻り 0 ;
  8      リターンのx < 0 - ?11 ;
  9  }
 10  構造体Point3と{
 11      ダブルX、Y、Z。
12      Point3と(二重 X = 0二重 Y = 0二重 Z = 0 )、X(x)、Y(y)を、Z(Z){}
 13  }。
14  
15  Point3とのVector3のtypedef。
16  
17するVector3 演算子 + (のVector3 A、BのVector3){
 18      リターンするVector3(A.x + BX、A.y +により、A.z + B.z)。
19  }
 20のVector3の演算子 - (Point3とA、Point3とB){
 21      リターンするVector3(AX-BX、AY-により、Az- BZ)。
22  }
 23のVector3 オペレータ*(のVector3 A、ダブルP){
 24      リターンするVector3(AX * P、Ayの* Pアリゾナ州* P)。
25  }
 26のVector3 オペレータ /(のVector3 A、ダブルP){
 27      リターンするVector3(AX / P、Ayの/ P、アリゾナ州/ P)。
28  }
 29  ブール 演算子(== CONST Point3と&、CONST Point3と&B){
 30      リターン DCMP(AX-BX)== 0 && DCMP(AY-によって)== 0 && DCMP(AZ-BZ)== 0 31  }
 32  ダブルドット(のVector3 A、BのVector3){
 33      リターンアックス* B.x + Ayの* B.y + Azの* のBz。
34  }
 35  ダブル長さ(のVector3 A){
 36      リターンSQRT(ドット(A、A))。
37  }
 38  ダブルアングル(のVector3 A、BのVector3){
 39      リターン ACOS(ドット(A、B)/長さ(A)/ 長さ(B))。
40  }
 41  ダブルpopldis(Point3とpを、Point3とのP0、のVector3 N){
 42の     リターンファブ(ドット(P- P0、N))。
43  }
 44  Point3とのPTY(Point3とP、Point3とP0、のVector3 N){
 45      リターン PN *ドット(P-P0、N)。
46  }
 47  Point3とのlineplane(Point3とP1、Point3とP2、P0 Point3と、のVector3 N){
 48      するVector3 V = P2- P1。
49      ダブル T =(ドット(N、P0-P1)/ドット(N、P2- P1))。
50      リターン P1 + V * トン。
51  }
 52  のVector3クロス(のVector3 A、BのVector3){
 53      リターンするVector3(Ayの*のBz-AZ *で、アリゾナ州* Bxを-AX *のBz、斧*で-Ayの* Bxの);
54  }
 55  ダブルエリア2(Point3とA、B Point3と、Point3とC){
 56      リターン長さ(クロス(BA、C- A))。
57  }
 58  BOOLPointTri(Point3とP、Point3とP0、P1 Point3と、Point3とP2){
 59      ダブル A1 = エリア2(P、P0、P1)。
60      二重 A2 = エリア2(P、P1、P2)。
61      ダブル A3 = エリア2(P、P2、P0)。
62      リターン DCMP(A1 + A2 + A3・エリア2(P0、P1、P2))== 0 63  }
 64  ブール segtri(Point3とP0、P1 Point3と、Point3とP2、Point3とA、B Point3と、Point3と&P){
 65      のVector3 N =クロス(P1-P0、P2- P0)。
66      であれば(DCMP(ドット(N、BA))== 0リターン 67      他に{
 68         ダブル T =ドット(N、P0-A)/ドット(N、B- A);
69          であれば(DCMP(T)< 0 || DCMP(T- 1)> 0の戻り 70          P = A +(BA)* T。
71          リターンPointTri(P、P0、P1、P2)。
72      }
 73  }
 74  ダブルptoline(Point3とP、Point3とA、Point3とB){
 75      のVector3のV1 = BA、V2 = P- A。
76      戻り長さ(クロス(V1、V2))/ 長さ(V1)。
77  }
 78  ダブルptoseg(Point3とP、Point3とA、Point3とB){
 79     もし(A == B)戻り長さ(P- A)。
80      のVector3 V1 = BA、V2 = PA、V3 = P- B。
81      であれば(DCMP(ドット(V1、V2))< 0戻り長さ(V2)。
82      他に あれば(DCMP(ドット(V1、V3))> 0の戻り長(V3)。
83      他に 戻り長(クロス(V1、V2))/ 長さ(V1)。
84  }
 85  ダブルVolume6(Point3とA、B Point3と、Point3とC、Point3とD){
 86      リターンドット(DA、クロス(BA、C- A))。
87  }
 88  のボイドREADP(Point3と&P){
 89      のscanf(" %LF%LF%LF "、p.x、&p.y、&& p.z)。
90  }
 91  
92 Point3とP [ 10 ]。
93  int型T;
94  INT メイン(){
 95      のscanf(" %dの"、&T)。
96      一方(T-- {)
 97          のためのINTは iは= 0 ; I < 6 ; I ++ ){
 98              READP(P [I])。
99          }
 100         int型 F = 0 ;
101          であれば(segtri(P [ 0 ]、P [ 1 ]、P [ 2 ]、P [ 3 ]、P [ 4 ]、P [ 6 ]))は、f = 1 102          であれば(segtri(P [ 0 ]、P [ 1 ]、P [ 2 ]、P [ 3 ]、P [ 5 ]、P [ 6 ]))は、f = 1 103          であれば(segtri(P [ 0 ]、P [ 1 ]、P [ 2 ]、P [ 4 ]、P [ 5 ]、P [ 6 ]))は、f = 1;
104          であれば(segtri(P [ 3 ]、P [ 4 ]、P [ 5 ]、P [ 0 ]、P [ 1 ]、P [ 6 ]))は、f = 1 105          であれば(segtri(P [ 3 ]、P [ 4 ]、P [ 5 ]、P [ 0 ]、P [ 2 ]、P [ 6 ]))は、f = 1 106          であれば(segtri(P [ 3 ]、P [ 4 ]、P [ 5 ]、P [ 1 ]、P [ 2 ]、P [ 6 ]))は、f = 1 107         printf(" %dの\ n " 、F)。
108      }
 109 }

 

おすすめ

転載: www.cnblogs.com/ccsu-kid/p/12003993.html