抄的模版。。。mark一下。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <cmath> 7 using namespace std; 8 #define eps 1e-10 9 #define zero(x) (((x) > 0?(x):(-x)) < eps) 10 struct point3 11 { 12 double x,y,z; 13 }; 14 struct line3 15 { 16 point3 a,b; 17 }; 18 struct plane3 19 { 20 point3 a,b,c; 21 }; 22 point3 xmult(point3 u,point3 v) 23 { 24 point3 ret; 25 ret.x = u.y*v.z - v.y*u.z; 26 ret.y = u.z*v.x - u.x*v.z; 27 ret.z = u.x*v.y - u.y*v.x; 28 return ret; 29 } 30 point3 subt(point3 u,point3 v) 31 { 32 point3 ret; 33 ret.x = u.x - v.x; 34 ret.y = u.y - v.y; 35 ret.z = u.z - v.z; 36 return ret; 37 } 38 double dmult(point3 u,point3 v) 39 { 40 return u.x*v.x + u.y*v.y + u.z*v.z; 41 } 42 double vlen(point3 p) 43 { 44 return sqrt(p.x*p.x + p.y*p.y + p.z*p.z); 45 } 46 double linetoline(line3 u,line3 v) 47 { 48 point3 n = xmult(subt(u.a,u.b),subt(v.a,v.b)); 49 return fabs(dmult(subt(u.a,v.a),n))/vlen(n); 50 } 51 point3 intersection(line3 u,line3 v) 52 { 53 point3 ret = u.a; 54 double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x)) 55 /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); 56 ret.x += (u.b.x-u.a.x)*t; 57 ret.y += (u.b.y-u.a.y)*t; 58 ret.z += (u.b.z-u.a.z)*t; 59 return ret; 60 } 61 62 //求面线交点 63 point3 pvec(plane3 s) 64 { 65 return xmult(subt(s.a,s.b),subt(s.b,s.c)); 66 } 67 point3 intersection(line3 l,plane3 s) 68 { 69 point3 ret = pvec(s); 70 double t = (ret.x*(s.a.x-l.a.x)+ret.y*(s.a.y-l.a.y)+ret.z*(s.a.z-l.a.z))/ 71 (ret.x*(l.b.x-l.a.x)+ret.y*(l.b.y-l.a.y)+ret.z*(l.b.z-l.a.z)); 72 ret.x = l.a.x + (l.b.x-l.a.x)*t; 73 ret.y = l.a.y + (l.b.y-l.a.y)*t; 74 ret.z = l.a.z + (l.b.z-l.a.z)*t; 75 return ret; 76 } 77 int dots_oneplane(point3 a,point3 b,point3 c,point3 d) 78 { 79 plane3 temp; 80 temp.a = a; 81 temp.b = b; 82 temp.c = c; 83 return zero(dmult(pvec(temp),subt(d,a))); 84 } 85 int main() 86 { 87 int t; 88 double ans; 89 scanf("%d",&t); 90 line3 u,v,te,ni; 91 point3 st,u1,v1,ans1,ans2; 92 plane3 ds; 93 while(t--) 94 { 95 scanf("%lf%lf%lf",&u.a.x,&u.a.y,&u.a.z); 96 scanf("%lf%lf%lf",&u.b.x,&u.b.y,&u.b.z); 97 scanf("%lf%lf%lf",&v.a.x,&v.a.y,&v.a.z); 98 scanf("%lf%lf%lf",&v.b.x,&v.b.y,&v.b.z); 99 if(dots_oneplane(u.a,u.b,v.a,v.b)) 100 { 101 printf("0.000000\n"); 102 ans1 = ans2 = intersection(u,v); 103 printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z); 104 continue; 105 } 106 ans = linetoline(u,v); 107 printf("%.6lf\n",ans); 108 st = xmult(subt(u.a,u.b),subt(v.a,v.b)); 109 ds.a = v.a; 110 ds.b = v.b; 111 ds.c.x = v.a.x + (u.a.x-u.b.x); 112 ds.c.y = v.a.y + (u.a.y-u.b.y); 113 ds.c.z = v.a.z + (u.a.z-u.b.z); 114 115 te.a = u.a; 116 te.b.x = u.a.x + st.x; 117 te.b.y = u.a.y + st.y; 118 te.b.z = u.a.z + st.z; 119 u1 = intersection(te,ds); 120 v1.x = u1.x + (u.a.x-u.b.x); 121 v1.y = u1.y + (u.a.y-u.b.y); 122 v1.z = u1.z + (u.a.z-u.b.z); 123 ni.a = u1; 124 ni.b = v1; 125 ans1 = intersection(ni,v); 126 ans2.x = ans1.x + (u.a.x - u1.x); 127 ans2.y = ans1.y + (u.a.y - u1.y); 128 ans2.z = ans1.z + (u.a.z - u1.z); 129 printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z); 130 } 131 return 0; 132 }