[HDU 4741]Save Labman No.004[计算几何][精度]
题意:
求两条空间直线的距离,以及对应那条距离线段的两端点坐标.
思路:
有一个参数方程算最短距离的公式, 代入求即可.
但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算出b直线上到a最近的点q的坐标, 再求这两点距离)用double可以过, 直接参数方程的公式用long double才可以><而且下来交的时候..C++->WA,G++->AC...
long double
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define eps 1e-9
struct point
{
long double x,y,z;
double q,w,e;
void read()
{
scanf("%lf%lf%lf",&q,&w,&e);
x = q, y = w, z = e;
}
};
point s1,s2,s3,s4;
point ansp,ansq;
long double ans;
inline long double srt(long double x)
{
return x*x;
}
long double dis(point a,point b)
{
return sqrt(srt(a.x-b.x)+srt(a.y-b.y)+srt(a.z-b.z));
};
int main()
{
int nc;
scanf("%d",&nc);
while(nc--)
{
s1.read();
s2.read();
s3.read();
s4.read();
long double a1=srt(s1.x-s2.x)+srt(s1.y-s2.y)+srt(s1.z-s2.z);
long double b1=-((s2.x-s1.x)*(s4.x-s3.x)+(s2.y-s1.y)*(s4.y-s3.y)+(s2.z-s1.z)*(s4.z-s3.z));
long double a2=b1;
long double b2=srt(s4.x-s3.x)+srt(s4.y-s3.y)+srt(s4.z-s3.z);
long double c1=(s1.x-s2.x)*(s1.x-s3.x)+(s1.y-s2.y)*(s1.y-s3.y)+(s1.z-s2.z)*(s1.z-s3.z);
long double c2=(s1.x-s3.x)*(s4.x-s3.x)+(s1.y-s3.y)*(s4.y-s3.y)+(s1.z-s3.z)*(s4.z-s3.z);
long double s=-(c2*b1-b2*c1)/(a1*b2-a2*b1);
long double t=(a1*c2-a2*c1)/(a1*b2-a2*b1);
// printf("s = %.6lf, t = %.6lf\n",s,t);
ansp.x=s1.x+s*(s2.x-s1.x);
ansp.y=s1.y+s*(s2.y-s1.y);
ansp.z=s1.z+s*(s2.z-s1.z);
ansq.x=s3.x+t*(s4.x-s3.x);
ansq.y=s3.y+t*(s4.y-s3.y);
ansq.z=s3.z+t*(s4.z-s3.z);
ans = sqrt(srt(ansp.x-ansq.x)+srt(ansp.y-ansq.y)+srt(ansp.z-ansq.z));
/* double e = (s2.y - s1.y)*(s4.z - s3.z) - (s4.y - s3.y)*(s2.z - s1.z);
double f = (s2.z - s1.z)*(s4.x - s3.x) - (s4.z - s3.z)*(s2.x - s1.x);
double g = (s2.x - s1.x)*(s4.y - s3.y) - (s4.x - s3.x)*(s2.y - s1.y);
ans =(e*(s3.x-s1.x)+f*(s3.y-s1.y)+g*(s3.z-s1.z))/sqrt(fabs(e*e+f*f+g*g));
*/
printf("%.6lf\n",(double)ans);
printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",(double )ansp.x,(double)ansp.y,(double)ansp.z,(double)ansq.x,(double)ansq.y,(double)ansq.z);
}
}
double ><
#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
#include <cmath>
#define inf 1000000000
using namespace std;
double x[5], y[5], z[5];
double xx, yy, zz, xxx, yyy, zzz;
double cal(double a, double b, double c, double d, double e, double f)
{
return (sqrt((d-a)*(d-a)+(e-b)*(e-b)+(f-c)*(f-c)));
}
int main()
{
int cas;
double A, B, C, D, E, F, o, aa, bb, cc, k;
scanf("%d", &cas);
while (cas--) {
for (int i=1; i<=4; i++)
scanf("%lf%lf%lf", &x[i], &y[i], &z[i]);
A=x[2]-x[1]; B=y[2]-y[1]; C=z[2]-z[1];
D=x[4]-x[3]; E=y[4]-y[3]; F=z[4]-z[3];
aa=A*B*E-B*B*D-C*C*D+A*C*F;
bb=A*A*E-A*B*D-B*C*F+C*C*E;
cc=A*C*D-A*A*F-B*B*F+B*C*E;
o=-x[1]*aa+y[1]*bb-z[1]*cc;
k=(bb*y[3]-aa*x[3]-cc*z[3]-o)/(aa*D-bb*E+cc*F);
xxx=D*k+x[3]; yyy=E*k+y[3]; zzz=F*k+z[3]; A=x[4]-x[3]; B=y[4]-y[3]; C=z[4]-z[3];
D=x[2]-x[1]; E=y[2]-y[1]; F=z[2]-z[1];
aa=A*B*E-B*B*D-C*C*D+A*C*F;
bb=A*A*E-A*B*D-B*C*F+C*C*E;
cc=A*C*D-A*A*F-B*B*F+B*C*E;
o=-x[3]*aa+y[3]*bb-z[3]*cc;
k=(bb*y[1]-aa*x[1]-cc*z[1]-o)/(aa*D-bb*E+cc*F);
xx=D*k+x[1]; yy=E*k+y[1]; zz=F*k+z[1];
printf("%.6lf\n", cal(xx, yy, zz, xxx, yyy, zzz));
printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", xx, yy, zz, xxx, yyy, zzz);
}
return 0;
}
<代码非原创orz>
[HDU 4741]Save Labman No.004[计算几何][精度]的更多相关文章
- HDU 4741 Save Labman No.004(计算几何)
题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...
- 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 (异面直线的距离)
转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...
- 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. ...
随机推荐
- ueditor插件 -- 插入填空题
插入填空题,一个看似小小的需求,但是却是折腾了很9.主要产品那边的要求,空格上面要标有序号,并且再页面当中能够同步空格答案列表. 1.ueditor插件 插件入门,官方的例子还是很简单直接的,对于我们 ...
- css3 transform 变形
在css3中,用transform可以实现文字或图像的旋转.缩放.倾斜和移动,并且该元素下的所有子元素,随着父元素一样转.缩放.倾斜和移动. transform属性 transform的属性包括:ro ...
- stormzhang的推荐!
欢迎转载,但请务必在明确位置注明出处!http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/ QQ交流群:入群理由请正确 ...
- IE兼容性bug汇总
1.IE6的双边距BUG. 发生条件:如果有元素是浮动元素,则该元素与它的父元素(一般是一个容器)直接相接触(中间不能隔着其他元素)的左或右的边距就会产生双倍边距,也意味着相邻的兄弟元素不可能会产生双 ...
- uvalive5818 uva12376 As Long as I Learn, I Live
题意:给出一个又向图每个图有权值和编号(正方形里的是编号),从第0号节点开始每次向当前节点所连的点中权值最大的节点移动(不会存在权值相同的节点),问最后所在的节点编号和经过的节点的权值之和. 解:模拟 ...
- 桂林电子科技大学出校流量控制器Android版1.0.0
每次玩游戏的时候,总是要开着电脑挂着出校控制器,真是浪费国家资源啊,,, 突然想起学校有个开放流量的网页,无奈UC等浏览器真是尝试优化js脚本啊,挂在后台,不到几分钟就掉线了,悲剧啊~~~ 还好And ...
- 面向对象程序设计-C++_课时14对象组合_课时15继承
对象组合,就是一个类的对象作为另外一个类的成员,涉及类的对象,对象是实体,玩实 继承,涉及类,类是概念,玩虚 public: 所有人都可以接触 private: 数据放private protecte ...
- GridView边线Border设置
1.黑色实线:(行列都有) <asp:GridViewID="GridView1"runat="server"CellPadding="3&qu ...
- English - in the light of(按照,根据)与according to的区别是什么
according to 表示as stated by 像陈述的那样 如According to Sarah they're not getting on very well at the momen ...
- pl sql项目演练--B2C商城项目
项目学习视频下载地址:点击下载 1.注册会员及找回密码模块 }该模块主要功能有注册会员和找回密码 }注册会员:所需信息主要有:登录号.密码.真实姓名.性别.密码问题.密码答案.Email.地址.电 ...