博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[数]昨天欠下的一道立体几何题HDU-4741
阅读量:6876 次
发布时间:2019-06-26

本文共 2336 字,大约阅读时间需要 7 分钟。

并没有做到这道题,后来听学长说了题意,总之就是立体几何嗯

 

  看了好几份题解,是的我知道是异面线段的距离了,可是看码完全不明orz。

  这时候出现了一份清晰易懂甚至给出了公式来源的blog╰(*°▽°*)╯

  仔细一看是kuangbin的blogΣ(⊙▽⊙"让我先%一%orz

  公式Time Tunnel在此

  <!----------这部分是解释给以后看不懂的自己的---------->

       (一张简约线条的示意图)

    首先获得两线段的向量(e1,e2),然后叉乘得到垂直于两线段的直线p,p与其中一条线段形成的平面截另一线段于一点,同理得两线段(的延长线)上各一点,则该两点间的距离为两线段最短距离。

    那么一线段指向另一线段的向量AB在p上的投影即为最短距离。

    需要记住的公式  d=|p·AB/p|  交点R1=A+t1·e1  

             t1=((B-A)Xe2)·(e1Xe2)/|e1Xe2|2    t2=((B-A)Xe1)·(e1Xe2)/|e1Xe2| 

  <!-------OVER------->

  那么就放一下最后按照蒟蒻习惯敲的乱码,似乎并不需要求两点距离,所以kuangbin的题解里有dis而蒟蒻偷懒没写

#include
#include
#include
#include
using namespace std;struct node { double x, y, z; node(double a=0, double b=0, double c=0) { x = a; y = b; z = c; } node operator + (const node &p) const { return node(x + p.x, y + p.y, z + p.z); } node operator - (const node &p) const { return node(x - p.x, y - p.y, z - p.z); } double operator * (const node &p) const { return x * p.x + y * p.y + z * p.z; } node operator ^ (const node &p) const { return node(y*p.z - z * p.y, z*p.x - x * p.z, x*p.y - y * p.x); } node operator * (double p) { return node(x*p, y*p, z*p); } node operator / (double p) { return node(x / p, y / p, z / p); }}A1,B1,A2,B2,poa,pob;double f(const node &a) { return sqrt(a.x*a.x + a.y*a.y + a.z*a.z); }int main(){ int t; cin >> t; while (t--) { cin >> A1.x >> A1.y >> A1.z >> B1.x >> B1.y >> B1.z >> A2.x >> A2.y >> A2.z >> B2.x >> B2.y >> B2.z; node e1 = A1 - B1; node e2 = A2 - B2; node e3 = A1 - A2; node p = e1 ^ e2; double d = fabs((A1 - A2)*p / f(p)); double t1 = ((A2 - A1) ^ e2)*(e1^e2); double t2 = ((A2 - A1) ^ e1)*(e1^e2); double q = f(e1^e2)*f(e1^e2); t1 /= q; t2 /= q; poa = A1 + (e1*t1); pob = A2 + (e2*t2); printf("%.6lf\n", d); printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", poa.x, poa.y, poa.z, pob.x, pob.y, pob.z); } return 0;}
HDU-4741

 

  注意事项:不太明白重载operator的优先级判断,我选择打括号,并且由于严格按照定义的运算对象,所以数乘的时候数和结构体的位置不能互换。

           //4.16.接收到神仙的补充,优先级和普通的优先级一样,所以最后的poa和pob里的括号是可以去掉的。

       算t1和t2的时候A2,A1的位置会影响结果的正负,反正有样例,试一下好了(实际上是这个懒惰的没有手算样例的人并没有搞清楚为什么)

 

比预计的结束时间晚了二十分钟嘤。

转载于:https://www.cnblogs.com/non-/p/10712171.html

你可能感兴趣的文章
人工智能10年将有颠覆性改变
查看>>
探秘AOP实现原理
查看>>
单点登录(SSO)简介
查看>>
2018最新大数据学习路线分享
查看>>
利用SVG制作不规矩背景的链接导航
查看>>
Linux - 一次运行多个命令
查看>>
10.C# -- 函数参数,参数数组,值传递函数,引用传递函数,输出函数,无参函数...
查看>>
BT5设置ip地址
查看>>
转载/验证码
查看>>
Surface、SurfaceView、SurfaceHolder和SurfaceHolder.Callback之间的联系
查看>>
什么是Data Store and Data Collector?
查看>>
我的友情链接
查看>>
php培训11.30
查看>>
Effective Java读后感
查看>>
windows下两个无线网卡 一个内网 一个外网
查看>>
tcp nat 负载均衡
查看>>
起点,游戏开发的梦想与技能点
查看>>
MPLS 流量工程的配置与各大属性调整详解
查看>>
107个常用Javascript语句
查看>>
我的友情链接
查看>>