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 - ?1:1 ; 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 }