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 ...
随机推荐
- 【PHP小项目使用MVC架构】
小项目名称是雇员管理系统. mvc是一种项目的开发模式,中文名称为模式视图控制器,是强制程序员将数据的输入.处理.输出分开的一种开发模式. 在这个小项目中,控制器使用service作为后缀名. 项目u ...
- tornado使用(Mac)
安装需求 Tornado 在 Python 2.5, 2.6, 2.7 中都经过了测试.要使用 Tornado 的所有功能,你需要安装 PycURL (7.18.2 或更高版本) 以及 simplej ...
- android 入门-android Studio git 克隆
最后是完成 以上是如何从android studio Git 克隆Github的项目
- Linux系统启动流程及安装命令行版本
Debian安装 之前也安装过很多次linux不同版本的系统,但安装后都是直接带有桌面开发环境的版本,直接可以使用,正好最近项目不是很忙,想一直了解下Linux的整个启动流程,以及如何从命令行模式系统 ...
- sublime总结
自定义快捷键: preferences->key binding->user ctrl+d 删除行 ctrl+k 选中下一同名变量,alt+F3 选中全部同名变量 [ {"key ...
- UED
User Experience Design(用户体验设计),简称UED.UED是进行产品策划的主力之一,他们用自己的知识.经验.设计能力拿出设计方案. UED不只是互联网专家,还是行业专家.能够用自 ...
- Win7下用IIS发布网站
安装IIS控制面板->程序->程序和功能, 点击左侧的“打开或关闭Windows功能”把这几项都勾上吧,虽然有些不是必须的,多勾无碍. 进入IIS管理器控制面板-> 系统和安全-&g ...
- Android开发的教程和资源
Android 设计指南非官方简体中文版 http://www.apkbus.com/design/index.html NDK下载 http://developer.android.com/tool ...
- 关于移动端1px边框问题
<div class="z_nei_list"> <div class="z_name_left font-size3">身份证号:&l ...
- loadrunner取出关联数组中的所有元素
方法一: int num; char nameVar[100]; char nameValue[100]; lr_save_string("AAA","name_1&qu ...