HDU 4741 Save Labman No.004(计算几何)
抄的模版。。。mark一下。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cstdlib>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- #define eps 1e-10
- #define zero(x) (((x) > 0?(x):(-x)) < eps)
- struct point3
- {
- double x,y,z;
- };
- struct line3
- {
- point3 a,b;
- };
- struct plane3
- {
- point3 a,b,c;
- };
- point3 xmult(point3 u,point3 v)
- {
- point3 ret;
- ret.x = u.y*v.z - v.y*u.z;
- ret.y = u.z*v.x - u.x*v.z;
- ret.z = u.x*v.y - u.y*v.x;
- return ret;
- }
- point3 subt(point3 u,point3 v)
- {
- point3 ret;
- ret.x = u.x - v.x;
- ret.y = u.y - v.y;
- ret.z = u.z - v.z;
- return ret;
- }
- double dmult(point3 u,point3 v)
- {
- return u.x*v.x + u.y*v.y + u.z*v.z;
- }
- double vlen(point3 p)
- {
- return sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
- }
- double linetoline(line3 u,line3 v)
- {
- point3 n = xmult(subt(u.a,u.b),subt(v.a,v.b));
- return fabs(dmult(subt(u.a,v.a),n))/vlen(n);
- }
- point3 intersection(line3 u,line3 v)
- {
- point3 ret = u.a;
- 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))
- /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
- ret.x += (u.b.x-u.a.x)*t;
- ret.y += (u.b.y-u.a.y)*t;
- ret.z += (u.b.z-u.a.z)*t;
- return ret;
- }
- //求面线交点
- point3 pvec(plane3 s)
- {
- return xmult(subt(s.a,s.b),subt(s.b,s.c));
- }
- point3 intersection(line3 l,plane3 s)
- {
- point3 ret = pvec(s);
- 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))/
- (ret.x*(l.b.x-l.a.x)+ret.y*(l.b.y-l.a.y)+ret.z*(l.b.z-l.a.z));
- ret.x = l.a.x + (l.b.x-l.a.x)*t;
- ret.y = l.a.y + (l.b.y-l.a.y)*t;
- ret.z = l.a.z + (l.b.z-l.a.z)*t;
- return ret;
- }
- int dots_oneplane(point3 a,point3 b,point3 c,point3 d)
- {
- plane3 temp;
- temp.a = a;
- temp.b = b;
- temp.c = c;
- return zero(dmult(pvec(temp),subt(d,a)));
- }
- int main()
- {
- int t;
- double ans;
- scanf("%d",&t);
- line3 u,v,te,ni;
- point3 st,u1,v1,ans1,ans2;
- plane3 ds;
- while(t--)
- {
- scanf("%lf%lf%lf",&u.a.x,&u.a.y,&u.a.z);
- scanf("%lf%lf%lf",&u.b.x,&u.b.y,&u.b.z);
- scanf("%lf%lf%lf",&v.a.x,&v.a.y,&v.a.z);
- scanf("%lf%lf%lf",&v.b.x,&v.b.y,&v.b.z);
- if(dots_oneplane(u.a,u.b,v.a,v.b))
- {
- printf("0.000000\n");
- ans1 = ans2 = intersection(u,v);
- printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
- continue;
- }
- ans = linetoline(u,v);
- printf("%.6lf\n",ans);
- st = xmult(subt(u.a,u.b),subt(v.a,v.b));
- ds.a = v.a;
- ds.b = v.b;
- ds.c.x = v.a.x + (u.a.x-u.b.x);
- ds.c.y = v.a.y + (u.a.y-u.b.y);
- ds.c.z = v.a.z + (u.a.z-u.b.z);
- te.a = u.a;
- te.b.x = u.a.x + st.x;
- te.b.y = u.a.y + st.y;
- te.b.z = u.a.z + st.z;
- u1 = intersection(te,ds);
- v1.x = u1.x + (u.a.x-u.b.x);
- v1.y = u1.y + (u.a.y-u.b.y);
- v1.z = u1.z + (u.a.z-u.b.z);
- ni.a = u1;
- ni.b = v1;
- ans1 = intersection(ni,v);
- ans2.x = ans1.x + (u.a.x - u1.x);
- ans2.y = ans1.y + (u.a.y - u1.y);
- ans2.z = ans1.z + (u.a.z - u1.z);
- printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
- }
- return ;
- }
HDU 4741 Save Labman No.004(计算几何)的更多相关文章
- [HDU 4741]Save Labman No.004[计算几何][精度]
题意: 求两条空间直线的距离,以及对应那条距离线段的两端点坐标. 思路: 有一个参数方程算最短距离的公式, 代入求即可. 但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算 ...
- HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 4741 Save Labman No.004异面直线间的距离既构成最小距离的两个端点
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...
- HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...
- HDU 4741 Save Labman No.004 (几何)
题意:求空间两线的最短距离和最短线的交点 题解: 线性代数和空间几何,主要是用叉积,点积,几何. 知道两个方向向量s1,s2,求叉积可以得出他们的公共垂直向量,然后公共垂直向量gamma和两线上的点形 ...
- hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]
// Time 234 ms; Memory 244 K #include<iostream> #include<cstdio> #include<cmath> u ...
- hdu 4741 Save Labman No.004(2013杭州网络赛)
http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html 空间两直线上最近点对. 这个博客上给出了很好的点法式公式了...其实没有那么多的tricky. ...
- hdu 4741 Save Labman No.004 (异面直线的距离)
转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...
随机推荐
- select count(*)和select count(1)哪个性能高
select count(*).count(数字).count(字段名)在相同的条件下是没有性能差别的,一般我们在统计行数的时候都会把NULL值统计在内的,所以这样的话,最好就是使用COUNT(*) ...
- 最稳定 性能最好 的 Linux 版本?
Ubuntu太他妈不稳定了,简直是一坨屎 CentOS.Ubuntu.Debian三个linux比较异同http://blog.csdn.net/educast/article/details/383 ...
- scala的tcp通信
client: object ActorClient extends App { import actors.Actor, actors.remote.Node, actors.remote.Remo ...
- js 随机星星 document.createElement(); setAttribute()
js 随机星星 document.createElement(); setAttribute() <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- Spring之ResourceLoader加载资源
Resource与ResourceLoader对比 1.Resource接口定义了应用访问底层资源的能力. 通过FileSystemResource以文件系统绝对路径的方式进行访问: 通过ClassP ...
- WPF标准控件模板查看程序(文件里面)
xaml <Window x:Class="ControlTemplateBrowser.MainWindow" xmlns="http://schemas.mic ...
- I/O复用模型之epoll学习
简介: epoll是linux下多路复用I/O接口select/poll的增强版,它能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率,原因是它会复用文件描述符集合来传递结果而不用 ...
- loj1011 状态压缩
题目链接:http://lightoj.com/volume_showproblem.php?problem=1011 思路:最近的开始做dp了...很明显的一道状态压缩题,dp[n][state]表 ...
- zookeeper源码分析三LEADER与FOLLOWER同步数据流程
根据二)中的分析,如果一台zookeeper服务器成为集群中的leader,那么一定是当前所有服务器中保存数据最多的服务器,所以在这台服务器成为leader之后,首先要做的事情就是与集群中的其它服务器 ...
- Android常用控件之GridView与ExpandableListView的用法
概述 1.GridView:与ListView相比,可以显示多列,xml布局时其属性numColumns可以设置显示的列数. 2.ExpandableListView:与ListView相比,可以让每 ...