题意:求空间两线的最短距离和最短线的交点

题解:

线性代数和空间几何,主要是用叉积,点积,几何。

知道两个方向向量s1,s2,求叉积可以得出他们的公共垂直向量,然后公共垂直向量gamma和两线上的点形成的向量做内积,

在除掉gamma的长度就得到投影,即是最短距离。

然后求两个点可以用gamma和s2的叉积和l2上的一个点描述一个平面,再求平面和线的交点,

把(p2-p1)*n 和(p0-p1)*n相除算出比例乘上p2-p1得到交点和p1的差,再加上p1就求出交点了

学习点:计算几何的一些东西

#include<cstdio>
#include<cmath>
inline double fun(double a, double b, double c, double d){
return a*d - b*c;
} #define squ(x) ((x)*(x)) struct Poi
{
double x,y,z;
Poi(double X = , double Y = , double Z = ){
x = X; y = Y; z = Z;
}
void input(){
scanf("%lf%lf%lf",&x,&y,&z);
}
Poi operator + (const Poi & rhs){
return Poi(x+rhs.x,y+rhs.y,z+rhs.z);
}
Poi operator - (Poi & rhs){
return Poi(x-rhs.x,y-rhs.y,z-rhs.z);
}
Poi operator ^(Poi & rhs){
return Poi(fun(y,z,rhs.y,rhs.z),-fun(x,z,rhs.x,rhs.z),fun(x,y,rhs.x,rhs.y));
}
Poi operator *(double t){
return Poi(x*t,y*t,z*t);
}
double operator *(const Poi & rhs){
return x*rhs.x+y*rhs.y+z*rhs.z;
}
};
typedef Poi Vector; double Dot(const Vector & a,const Poi& b) {
return a.x*b.x+a.y*b.y+a.z*b.z;
} Poi LinePlaneIns(Poi &p1,Poi &p2,Poi &p0,Vector &n){
Vector v = p2 - p1;
double Ratio = (Dot(n,p0-p1))/(Dot(n,v));//保证相交
return p1+v*Ratio;
}
double Length(const Vector &x){
return sqrt(squ(x.x)+squ(x.y)+squ(x.z));
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
Poi p1,p2,p3,p4;
p1.input();
p2.input();
p3.input();
p4.input();
Vector alpha = p2 - p1;
Vector beta = p4 - p3;
Vector gamma = alpha^beta;
double distance = fabs(Dot(gamma,(p1-p3))/Length(gamma));
Vector n1 = alpha^gamma;
Vector n2 = beta^gamma;
Poi ins1 = LinePlaneIns(p1,p2,p3,n2);
Poi ins2 = LinePlaneIns(p3,p4,p1,n1);
printf("%.6lf\n%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",distance,ins1.x,ins1.y,ins1.z,ins2.x,ins2.y,ins2.z);
}
return ;
}

HDU 4741 Save Labman No.004 (几何)的更多相关文章

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

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

    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 2013 ACM/ICPC 杭州网络赛

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

  4. HDU 4741 Save Labman No.004(计算几何)

    题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 下拉选择select和复选框checkbox的状态的各种方式

    复选框的状态 <input name="ck" value=" " type="checkbox"  checked> 或者&l ...

  2. Linux下的eclipse的安装

    其实在linux里配好java环境后,就已经好了. 从官网下一个eclipse,解压后,就可以直接执行eclipse了,实在是不知道什么是安装. 其实在配置java时,也是一样. 可见在linux下, ...

  3. display:block inline-block inlined的区别

    一.首先要了解什么是块级元素与行级元素 块级元素 会占领页面的一行,其后多个block元素自动换行. 可以设置width,height,设置了width后同样也占领一行.同样也可以设置   margi ...

  4. 3dmax视频

    http://wenku.baidu.com/course/list/514?tagID=177

  5. vue+element级联选择器对接后台数据

    1.后台接口返回的数据肯定要和级联选择器的数据一致,所以我专门弄个model存放返回的值,如下:/** * @Auther: GGDong * @Date: 2019/4/3 10:30 */@Get ...

  6. [转]监控常用TCODE

    1  系统监视 1.1 进程监视 SM66/SM50 进程查看 管理员需全天监看系统的进程.长时间运行的后台工作,有缺陷的报表程序,若不进行控制都将消耗掉大量的系统资源.管理员用这个事务码检查他们的环 ...

  7. js原型和构造函数

    前言 从应用层面深入理解原型模式和js中的构造函数. 构造函数(constructor) js中的任何对象都有自己的构造函数.js中使用字面量声明的普通对象({})或数组([])等子对象本质上都是使用 ...

  8. java基础第六篇之常用思想、封装、继承和多态

    a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...

  9. qBittorrent+Flex搭建在线视频播放网站

    BT下载工具qbittorrent(当然这里也有其他类似的工具可选如transmission等) 首先安装EPEL源: yum -y install epel-release 安装开发工具包: yum ...

  10. DOM的学习网站 DOM是HTML和XML的编程接口