HDU 4741

news/2024/12/23 2:46:16/

题目

求异面直线的间的最短距离,并且求出最短距离的线段在两直线上的点。比赛时,在网上找了个资料,需要解个二元一次的方程,估计自己写龊了,奇葩数据,总会出现误差。

后来重新找了个,在这


先求出两个点,直线1上的点应该是直线1和(直线2与1.2公垂线确定的平面的交点)

公垂线,以及平面,以及平面与直线的交点的做法参照那篇博客,或者回去看高数书,应该都行


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;struct point
{double x,y,z;point(double _x,double _y,double _z){x=_x;y=_y;z=_z;}
};struct Vector  
{double x,y,z;Vector(double _x,double _y,double _z){x=_x,y=_y,z=_z;}
};struct plane    // ax+by+cz+d=0;
{double a,b,c,d;plane(double _a,double _b,double _c,double _d){a=_a,b=_b,c=_c,d=_d;}
};Vector getvector(point a,point b)//直线的方向向量
{Vector ans=Vector(a.x-b.x,a.y-b.y,a.z-b.z);return ans;
}Vector Common_Vertical_Line(Vector a,Vector b)//公垂线的方向向量 a*b 
{Vector ans=Vector(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);return ans;
}double pointDis(Vector a)//点距离
{return sqrt((a.x*a.x+a.y*a.y+a.z*a.z));
}plane getPlane(Vector a,Vector b,point c) //求由一直线的方向向量a,与一直线的方向向量b,与a上的一点c确定的平面;
{Vector line=Common_Vertical_Line(a,b);plane ans=plane(line.x,line.y,line.z,line.x*(-1)*c.x+line.y*(-1)*c.y+line.z*(-1)*c.z);return ans;
}
point getPoint(plane P,Vector B,point C)//C是B所在直线上的一点,求B所在直线和平面P的交点
{double k=((-1)*P.b*C.y-P.a*C.x-P.c*C.z-P.d)/(P.a*B.x+P.b*B.y+P.c*B.z);point ans=point(B.x*k+C.x,B.y*k+C.y,B.z*k+C.z);return ans;
}int main()
{int t;scanf("%d",&t);while(t--){double a,b,c;scanf("%lf%lf%lf",&a,&b,&c);point x1=point(a,b,c);scanf("%lf%lf%lf",&a,&b,&c);point y1=point(a,b,c);scanf("%lf%lf%lf",&a,&b,&c);point x2=point(a,b,c);scanf("%lf%lf%lf",&a,&b,&c);point y2=point(a,b,c);Vector  l1=getvector(x1,y1);Vector  l2=getvector(x2,y2);Vector line=Common_Vertical_Line(l1,l2);plane p1=getPlane(l1,line,x1);plane p2=getPlane(l2,line,x2);point ans2=getPoint(p1,l2,x2);point ans1=getPoint(p2,l1,x1);Vector ans=getvector(ans1,ans2);printf("%.6lf\n",pointDis(ans));printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",ans1.x,ans1.y,ans1.z,ans2.x,ans2.y,ans2.z);}return 0;
}



a(x1,y1,z1),b(x2,y2,z2);

            |  i    j   k   |

a*b=    |x1  y1  z1|  ={(y1*z2-z1*y2)i, (x2*z1-z2*x1)j, (x1*y2-y1*x2)k}

           |x2  y2  z2|


http://www.ppmy.cn/news/124696.html

相关文章

Hdu 4715

打素数表&#xff0c;分类讨论 给出一个偶数n&#xff0c;有这样两个素数a和b&#xff0c;使得na-b&#xff0c;要求ab最小。分三类&#xff1a;1. n0&#xff1b; 2. n<0&#xff1b; 3. n>0. AC代码&#xff1a; #include <cstdio> #include <cstdlib> #in…

HDU4715

思路&#xff1a; 1.不存在输出FAIL的情况 2.素数打表 实现判断素数 和 查找第i个素数 3.二分查找素数表&#xff0c;从比x大的下一个素数now开始&#xff0c;判断这now-n是否素数 /*Code By Aquariuslt*/ /*HDU 4715 Difference Between Primes*/ #include<iostream>…

14443-4

14443-4 传输协议激活 RATS-Request for answer to select 第3节14443-3中&#xff0c;当PCD发出选择命令之后&#xff0c;卡片返回SAK&#xff0c;指示PICC是否支持14443-4。 如果PICC支持14443-4&#xff0c;并且PCD需要进入14443-4层&#xff0c;进行协议层的数据传输&…

HDU 4745 Two Rabbits(非连续最长回文子序列,区间DP)

HDU 4745 Two Rabbits(非连续最长回文子序列&#xff0c;区间DP) HDU 4745 Two Rabbits 题目地址 题意&#xff1a; 两只兔子&#xff0c;在n块围成一个环形的石头上跳跃&#xff0c;每块石头有一个权值ai&#xff0c;一只从左往右跳&#xff0c;一只从右往左跳&#xff0c;每跳…

华三交换机DHCP配置

拓扑图 配置步骤 1、创建vlan&#xff0c;配置端口所属VLAN和对应VLAN接口的IP地址&#xff0c;IP地址即是对应VLAN的网关地址 vlan 2 to 4 # interface GigabitEthernet1/0/1 port link-mode bridge port access vlan 2 combo enable fiber # interface GigabitEthernet…

HDU - 4734 -- F(x)

题目如下&#xff1a; For a decimal number x with n digits ( A n A n − 1 A n − 2 . . . A 2 A 1 ) (A_nA_{n-1}A_{n-2} ... A_2A_1) (An​An−1​An−2​...A2​A1​), we define its weight as F ( x ) A n ∗ 2 n − 1 A n − 1 ∗ 2 n − 2 . . . A 2 ∗ 2 A …

4545

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Docker环境打包部署

Docker 最初只是为了解决一个环境打包问题