题目链接

抄的模版。。。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(计算几何)的更多相关文章

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

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

  2. 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 ...

  3. hdu 4741 Save Labman No.004异面直线间的距离既构成最小距离的两个端点

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )

    空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...

  5. HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...

  6. HDU 4741 Save Labman No.004 (几何)

    题意:求空间两线的最短距离和最短线的交点 题解: 线性代数和空间几何,主要是用叉积,点积,几何. 知道两个方向向量s1,s2,求叉积可以得出他们的公共垂直向量,然后公共垂直向量gamma和两线上的点形 ...

  7. hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]

    // Time 234 ms; Memory 244 K #include<iostream> #include<cstdio> #include<cmath> u ...

  8. hdu 4741 Save Labman No.004(2013杭州网络赛)

    http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html 空间两直线上最近点对. 这个博客上给出了很好的点法式公式了...其实没有那么多的tricky. ...

  9. hdu 4741 Save Labman No.004 (异面直线的距离)

    转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...

随机推荐

  1. MongoDB的介绍和使用场景(1)

    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发.M ...

  2. python中的monkey-patching

    这个技巧我很少用过. 但知道无防. 在运行时改变函数或类的行为, 一般用猴子补丁,原类,装饰器都可以实现. #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  3. POJ1285 Combinations, Once Again(背包 排列组合)

    背包解组合数学问题,n种物品,每种num[i]个,求取r个的方法数. 背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为 f[j] += f[k](max(j - num[i], 0) &l ...

  4. HDU1502 Regular Words

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:当只有两个数时,可以用卡特兰数做,当三个数时,没想到卡特兰数的做法.可以使用动态规划. 状态转 ...

  5. 攻城狮在路上(叁)Linux(二十九)--- 完整备份工具:dump以及restore

    一.dump命令: 该命令既可以针对整个文件系统进行备份,也可以仅针对目录来备份.还可以指定不同的备份等级(-0~-9共10个等级). dump -W:列出在/etc/fstab中具有dump设置的分 ...

  6. maven File encoding has not been set

    原pom.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  7. Oracle Segments可以跨多个data files吗?

    首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储.每一 ...

  8. dwz中权限的控制

    很多人不明白用dwz要如何在没有登录的时候跳转到登录页面,没有权限的时候弹出提示. 其实,作者在设计的时候,已经完全考虑到了这些需求. 不管是navTab还是dialog,dwz的页面加载最终都是通过 ...

  9. sql篇,动态合并数据

    背景: 为何说是一雪前耻呢,想当年,我还小,我出去面试远洋,远远地看着浩哥在那里坐着,然后下班去吃饭,我和东辉却在那里静静地等待着第二轮的技术面试(结果是没有面上,一个是学历问题),终于一个小个子姐姐 ...

  10. 【Web前端】---js调用本地应用程序

    最近进入了一个项目组,向大牛们一起学习如何搞开发,可谓是边开发边学习.就在前两天,我们的项目被领导们验收了一次,顺便给我们提了点新的需求,要求我们能够使用外在设备拍照上传.君要臣死,臣不能不死.更何况 ...