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

题解:

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

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

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

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

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

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

  1. #include<cstdio>
  2. #include<cmath>
  3. inline double fun(double a, double b, double c, double d){
  4. return a*d - b*c;
  5. }
  6.  
  7. #define squ(x) ((x)*(x))
  8.  
  9. struct Poi
  10. {
  11. double x,y,z;
  12. Poi(double X = , double Y = , double Z = ){
  13. x = X; y = Y; z = Z;
  14. }
  15. void input(){
  16. scanf("%lf%lf%lf",&x,&y,&z);
  17. }
  18. Poi operator + (const Poi & rhs){
  19. return Poi(x+rhs.x,y+rhs.y,z+rhs.z);
  20. }
  21. Poi operator - (Poi & rhs){
  22. return Poi(x-rhs.x,y-rhs.y,z-rhs.z);
  23. }
  24. Poi operator ^(Poi & rhs){
  25. return Poi(fun(y,z,rhs.y,rhs.z),-fun(x,z,rhs.x,rhs.z),fun(x,y,rhs.x,rhs.y));
  26. }
  27. Poi operator *(double t){
  28. return Poi(x*t,y*t,z*t);
  29. }
  30. double operator *(const Poi & rhs){
  31. return x*rhs.x+y*rhs.y+z*rhs.z;
  32. }
  33. };
  34. typedef Poi Vector;
  35.  
  36. double Dot(const Vector & a,const Poi& b) {
  37. return a.x*b.x+a.y*b.y+a.z*b.z;
  38. }
  39.  
  40. Poi LinePlaneIns(Poi &p1,Poi &p2,Poi &p0,Vector &n){
  41. Vector v = p2 - p1;
  42. double Ratio = (Dot(n,p0-p1))/(Dot(n,v));//保证相交
  43. return p1+v*Ratio;
  44. }
  45. double Length(const Vector &x){
  46. return sqrt(squ(x.x)+squ(x.y)+squ(x.z));
  47. }
  48.  
  49. int main()
  50. {
  51. // freopen("in.txt","r",stdin);
  52. int T;
  53. scanf("%d",&T);
  54. while(T--){
  55. Poi p1,p2,p3,p4;
  56. p1.input();
  57. p2.input();
  58. p3.input();
  59. p4.input();
  60. Vector alpha = p2 - p1;
  61. Vector beta = p4 - p3;
  62. Vector gamma = alpha^beta;
  63. double distance = fabs(Dot(gamma,(p1-p3))/Length(gamma));
  64. Vector n1 = alpha^gamma;
  65. Vector n2 = beta^gamma;
  66. Poi ins1 = LinePlaneIns(p1,p2,p3,n2);
  67. Poi ins2 = LinePlaneIns(p3,p4,p1,n1);
  68. printf("%.6lf\n%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",distance,ins1.x,ins1.y,ins1.z,ins2.x,ins2.y,ins2.z);
  69. }
  70. return ;
  71. }

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. EntityFramework 中的链接研究初探

    很多人用EF的默认链接工厂:System.Data.Entity.Infrastructure.LocalDbConnectionFactory 然后我一开始就不习惯,然后研究了一下,截图如下 然后就 ...

  2. C# 测试代码#if DEBUG使用

    代码示例: #if DEBUG      Console.WriteLine("DEBUG:11111111111"); #else       Console.WriteLine ...

  3. JS Guid生成

    function numToGuid(uid) { var str = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; var l = uid.to ...

  4. 由一次动态改变font-size的大小引申的一系列困惑补录

    以下结论如有错误,欢迎指正 在切入正题之前,先了解下window 和document这两个大对象 我们熟知 JavaScript的组成如下图所示: window对象和document对象分别属于哪个分 ...

  5. uoj#352. 新年的五维几何(概率期望+爆搜)

    传送门 我还以为这是个五维半平面交呢--结果没看数据范围-- 题解 //minamoto #include<bits/stdc++.h> #define R register #defin ...

  6. Java基础--面向对象以及相关知识

    一. 面向对象特征与原则 1.三大特征:封装.继承.多态. (1)封装:将客观的事物封装成抽象的类,封装代码逻辑,并通过访问控制符来控制访问的方式,从而保护程序(使用反射时,可以获取对象的私有方法和成 ...

  7. Glassfish 4 修改server.log 等配置

    如果所示:

  8. Java - 一道关于Arrays.asList的题目

    题目 有这样一道有趣的题目: final int[] test = new int[]{1,2,3,4}; final Integer[] test2 = new Integer[]{1,2,3,4} ...

  9. 5.用通配符进行过滤 ---SQL

    一.LIKE操作符 通配符(wildcard) 用来匹配值的一部分的特殊字符.搜索模式(search pattern)由字面值.通配符或两者组合构成的搜索条件.通配符本身实际上是SQL的WHERE子句 ...

  10. P1829 [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演

    又一道...分数和取模次数成正比$qwq$ 求:$\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)$ 原式 $=\sum_{i=1}^N\sum_{j=1}^M\frac{i*j}{g ...