HDU 4741 Save Labman No.004(计算几何)

题目链接

抄的模版。。。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 }

 

你可能感兴趣的:(HDU)