zoukankan      html  css  js  c++  java
  • 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
    ");
    102             ans1 = ans2 = intersection(u,v);
    103             printf("%.6f %.6f %.6f %.6f %.6f %.6f
    ",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
    104             continue;
    105         }
    106         ans = linetoline(u,v);
    107         printf("%.6lf
    ",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
    ",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
    130     }
    131     return 0;
    132 }
  • 相关阅读:
    python技巧31[移植python2.x到3.x]
    python转载[正则表达式指南]
    Linux守护进程(init.d和xinetd)
    系统host文件的使用
    python技巧31[python文件的encoding和str的decode]
    python类库26[读写mysql]
    Windows批处理中文件的属性
    python类库31[读取环境变量]
    python基础31[python内置函数列表]
    文件共享和存储服务器
  • 原文地址:https://www.cnblogs.com/naix-x/p/3323265.html
Copyright © 2011-2022 走看看