题目链接

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

转载于:https://www.cnblogs.com/naix-x/p/3323265.html

HDU 4741 Save Labman No.004(计算几何)相关推荐

  1. HDU 4741 Save Labman No.004 计算几何 数学

    题目链接 这道题会暴露很多孩纸的高数学的好不好.如何计算三维直线的最短距离和垂足的坐标,学习链接 之后的就是代入公式计算了. 1 #include <stdio.h> 2 #include ...

  2. [HDU 4741]Save Labman No.004[计算几何][精度]

    题意: 求两条空间直线的距离,以及对应那条距离线段的两端点坐标. 思路: 有一个参数方程算最短距离的公式, 代入求即可. 但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算 ...

  3. hdu 4741 Save Labman No.004

    题目大意:求空间两条直线的最短距离及最近的点坐标 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4741 拙计的代码,公垂线~~~~~~~~~ #inc ...

  4. POJ 4741 Save Labman No.004

    题目链接:Save Labman No.004 解题思路:给你两条直线,异面的空间直线,求直线间最短距离,并且求出最短距离的这两个点.下面是模板,先求出公垂线的法向量,在构造两个平面分别是两条直线各自 ...

  5. hdu 4793(嗷嗷水的计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793: 大意:在原点有一个平台,原点还有一个圆形木块,视为挡板,有一个圆形滑块在光滑坐标轴上摩擦,有初 ...

  6. HDU 3968 Angry Birds Again(计算几何)

    Description 给出小鸟的位置以及猪的位置,小鸟做斜抛运动经过ts后砸到猪,问小鸟经过的路程 Input 第一行为一整数T表示你用例组数,每组用例包括四个浮点数x0,y0,x1,y1,t分别表 ...

  7. HDU - 4082 Hou Yi‘s secret (计算几何)

    点击打开题目链接 Hou Yi's secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  8. hdu 4562 守护雅典娜(计算几何+dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  9. 2013_hangzhou_online

    4738 Caocao's Bridges 求无向图的桥中最小的那个,tarjan 4739 Zhuge Liang's Mines 状态压缩+暴力 4740 The Donkey of Gui Zh ...

最新文章

  1. java获取注解的属性值_反射+自定义注解,实现获取注解标记的属性
  2. 澎思科技与新加坡国立大学等高校共研AI产品加快技术应用落地
  3. win10 vs2015 编译caffe2
  4. VS Code 0.5添加ES6支持和Git工具改进
  5. 如何查看华为服务器配置信息,华为服务器查看配置
  6. Kubernetes学习笔记(一):Kubernetes-1.7.x 创建TLS证书和秘钥
  7. 诺基亚E63常见设置指南
  8. elasticsearch 集群
  9. React之网易云音乐(实现唱片滚动以及lrc歌词滚动效果)
  10. 从零开始学java第二章 第一个java程序
  11. chm文件无法打开,chm电子书显示“此程序无法显示网页”的解决办法
  12. 1156针最强cpu,1156的CPU什么最好?
  13. 计算机电源供电方式,电脑主板开关电源供电方式图文介绍
  14. jQuery Mobile 列表视图
  15. gulp入门详解之基本操作
  16. ORA-01186、ORA-01157、ORA-01111、ORA-01110 错误处理方法
  17. 水下机器人项目!大创!包含solidworks模型,程序,PCB,上位机,实物视频演示,项目报告。
  18. 用友NCC的期初数量如何在数据库里面查询?
  19. 梨花众创PDF文本转换器
  20. 从后台获取的图片渲染到前端页面

热门文章

  1. clearfix清除浮动进化史
  2. MapReduce实战案例:发现共同好友
  3. [自注意力神经网络]Segment Anything(SAM)论文阅读
  4. 收集的颜文字,呵呵哒
  5. gama函数与gama分布
  6. 朋友圈购物遭遇维权“三难” 法官提醒潜在风险
  7. python np.unravel_index(indices, dims, order)
  8. java 逻辑运算_Java逻辑运算
  9. 统计基础(四)假设检验
  10. CATIA CAA 二次开发资料(PDF).rar