题目链接

抄的模版。。。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. PHP中array_merge和array相加的区别分析

    今天处理一个这样的问题:如何获取字符键名相同值不同的两个数组值集合,用array_merge和数组相加都不可行,让我认真比较了下PHP中array_merge和array相加的区别 首先来看看键名是s ...

  2. OCJP(1Z0-851) 模拟题分析(三)over

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  3. 游戏主循环(Game Loop)

    游戏主循环是游戏的心跳,一般使用while循环进行主动刷新. 一次循环由获取用户输入.更新游戏状态.处理AI.播放音乐和绘制画面组成. 这些行为可以分成两类: update_game(); // 更新 ...

  4. Java Hour 66 Spring 相关

    这章简单的来了解下Spring 和 Hibernate 是如何勾搭在一起的. <bean id="sessionFactory" class="org.spring ...

  5. C++ 简单的学生信息管理系统

    // // main.cpp // 2013-7-17作业1 // // Created by 丁小未 on 13-7-17. // Copyright (c) 2013年 dingxiaowei. ...

  6. mybatis 中#和$的区别

    #{…}是一个参数标记,将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是1,那么解析成sql时的值为order by " ...

  7. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  8. 近实时运算的利器---presto在公司实践

    1.起因 公司hadoop集群里的datanonde和tasktracker节点负载主要集中于晚上到凌晨,平日工作时间负载不是很高.但在工作时间内,公司业务人员有实时查询需求,现在主要 借助于hive ...

  9. windows加入path路径

    右键我的电脑,属性:高级系统设置,高级,环境变量:在系统变量中选path,编辑:将python安装路径加入即可(注意分号):

  10. css3易混淆属性详解

    1.background,  background-color,   color (1)background:在一个声明中设置所有属性: 如:background: #00FF00 url(bgima ...