HDU 4741 Save Labman No.004 (几何)
题意:求空间两线的最短距离和最短线的交点
题解:
线性代数和空间几何,主要是用叉积,点积,几何。
知道两个方向向量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 (几何)的更多相关文章
- 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 2013 ACM/ICPC 杭州网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...
- HDU 4741 Save Labman No.004(计算几何)
题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...
- 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[计算几何][精度]
题意: 求两条空间直线的距离,以及对应那条距离线段的两端点坐标. 思路: 有一个参数方程算最短距离的公式, 代入求即可. 但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算 ...
- hdu 4741 Save Labman No.004 (异面直线的距离)
转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...
随机推荐
- VMWare安装Ubuntu 16.04
1.Ubuntu安装文件下载 到Ubuntu官网下载安装包,有Bit Torrent.Network installer多种方式下载. 推荐使用中国地区的镜像下载,我是用华科的校园网下载速度是非常感人 ...
- app.config 配置的一种用法
app.config文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> ...
- MVC用户验证
MVC提供了四种Filter(钩子),用于在Action执行之前或者之后,我们能够做一些事情,比如说判断有没有登录,比如说判断有没有权限. IAuthorizationFilter:在所有Filter ...
- 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)
传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...
- angular实现表格的全选、单选、部分删除以及全部删除
昨天自己写了一小段js,在全选的时候有点儿小坑,然后,整理了一下.今天把它贴出来,希望以后还记得. 大家也可以去github上查看或下载:https://github.com/dreamITGirl/ ...
- react-native-contact 安卓已测试,
1. 下载模块 npm install react-native-contacts --save 2.安卓配置: a.在android/settings.gradle include ':rea ...
- Java获取上周,本周,本月,本年,开始结束时间 。日期工具类
由于获取日期经常会使用到,所有我自己写了一个工具类 1.基本上能用上的都写出来了,包括:1)获取当天的开始时间 2)获取当天的结束时间 3)获取昨天的开始时间 4)获取昨天的结束时间 5)获取明天的开 ...
- jsonpath 求和
{ "price": [ 1.0, 2.0 ] } $..price.sum() 以下表达式
- hdu1166-敌兵布阵-分块
把区间分成√n份降低复杂度. #include<bits/stdc++.h> #define inf 0x3f3f3f3f ; ; using namespace std; int t,n ...
- Identity Service
Identity Service - 解析微软微服务架构eShopOnContainers(二) 接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点.微软在 ...