http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html

空间两直线上最近点对。

这个博客上给出了很好的点法式公式了。。。其实没有那么多的tricky。。。不知到别人怎么错的。。。

  1. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<fstream>
  6. #include<sstream>
  7. #include<vector>
  8. #include<string>
  9. #include<cstdio>
  10. #include<bitset>
  11. #include<queue>
  12. #include<stack>
  13. #include<cmath>
  14. #include<map>
  15. #include<set>
  16. #define FF(i, a, b) for(int i=a; i<b; i++)
  17. #define FD(i, a, b) for(int i=a; i>=b; i--)
  18. #define REP(i, n) for(int i=0; i<n; i++)
  19. #define CLR(a, b) memset(a, b, sizeof(a))
  20. #define debug puts("**debug**")
  21. #define LL long long
  22. #define PB push_back
  23. #define MP make_pair
  24. #define eps 1e-10
  25. using namespace std;
  26.  
  27. struct Point
  28. {
  29. double x, y, z;
  30. Point(double x=0, double y=0, double z=0) : x(x), y(y),z(z){}
  31. };
  32. typedef Point Vector;
  33.  
  34. Vector operator + (Vector a, Vector b) { return Vector(a.x+b.x, a.y+b.y, a.z+b.z); };
  35. Vector operator - (Vector a, Vector b) { return Vector(a.x-b.x, a.y-b.y, a.z-b.z); };
  36. Vector operator * (Vector a, double p) { return Vector(a.x*p, a.y*p, a.z*p); }
  37. Vector operator / (Vector a, double p) { return Vector(a.x/p, a.y/p, a.z/p); }
  38.  
  39. double Dot(Vector a, Vector b) { return a.x*b.x + a.y*b.y + a.z*b.z; }
  40. double Length(Vector a) { return sqrt(Dot(a, a)); }
  41. Vector Cross(Point a, Point b)
  42. {
  43. return 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);
  44. }
  45.  
  46. Point a1, b1, a2, b2;
  47. int main()
  48. {
  49. int n;
  50. scanf("%d", &n);
  51. while(n--)
  52. {
  53. scanf("%lf%lf%lf", &a1.x, &a1.y, &a1.z);
  54. scanf("%lf%lf%lf", &b1.x, &b1.y, &b1.z);
  55. scanf("%lf%lf%lf", &a2.x, &a2.y, &a2.z);
  56. scanf("%lf%lf%lf", &b2.x, &b2.y, &b2.z);
  57. Vector v1 = (a1-b1), v2 = (a2-b2);
  58. Vector N = Cross(v1, v2);
  59. Vector ab = (a1-a2);
  60. double ans = Dot(N, ab) / Length(N);
  61. Point p1 = a1, p2 = a2;
  62. Vector d1 = b1-a1, d2 = b2-a2;
  63. Point ans1, ans2;
  64. double t1, t2;
  65. t1 = Dot((Cross(p2-p1, d2)), Cross(d1, d2));
  66. t2 = Dot((Cross(p2-p1, d1)), Cross(d1, d2));
  67. double dd = Length((Cross(d1, d2)));
  68. t1 /= dd*dd;
  69. t2 /= dd*dd;
  70. ans1 = (a1 + (b1-a1)*t1);
  71. ans2 = (a2 + (b2-a2)*t2);
  72. printf("%.6f\n", fabs(ans));
  73. printf("%.6f %.6f %.6f ", ans1.x, ans1.y, ans1.z);
  74. printf("%.6f %.6f %.6f\n", ans2.x, ans2.y, ans2.z);
  75. }
  76. return 0;
  77. }

hdu 4741 Save Labman No.004(2013杭州网络赛)的更多相关文章

  1. HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...

  2. hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]

    // Time 234 ms; Memory 244 K #include<iostream> #include<cstdio> #include<cmath> u ...

  3. 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 ...

  4. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 4741 Save Labman No.004异面直线间的距离既构成最小距离的两个端点

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. HDU 4741 Save Labman No.004(计算几何)

    题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...

  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. linux文件名乱码解决办法

    1.linux解压压缩文件乱码 unzip -O CP936 xxx.zip 2.一般文件用convmv sudo convmv -f gbk -t utf-8 -r --notest /your_d ...

  2. lua学习笔记1

    lua中调用c的函数 #include <stdio.h> #include <string.h> #ifdef __cplusplus extern "C" ...

  3. Red Hat Enterprise Linux Release Dates

    Red Hat Enterprise Linux Release Dates UpdatedMay 10 2016 at 10:57 PM - English The tables below lis ...

  4. gcc编译器对宽字符的识别

    最早是使用VC++工具来学习C++,学的越多就越对VC挡住的我看不见的东西好奇,总想多接触一些开发环境,今日抽空摸索了一下CodeBlocks这个开源的IDE使用方法,配置的编译器是MinGW的gcc ...

  5. [Leetcode][Python]30: Substring with Concatenation of All Words

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...

  6. LA 5966 Blade and Sword (双向bfs + 想法) - from lanshui_Yang

    题目大意:给你一张有n * m个网格的图,每个网格可能是如下符号: “#”:墙 “P”:出发点 “D”:终点 “.”:空地 “*”:传送机 有一个旅行家(假设名叫Mike),他要从点P到达点D,途中必 ...

  7. linux内核源码阅读之facebook硬盘加速flashcache之五

    正常流程到flashcache_map的1623行或1625行,按顺序先看读流程: 1221static void 1222flashcache_read(struct cache_c *dmc, s ...

  8. Crisis of HDU(母函数)

    Crisis of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. Request.ServerVariables完整参考

    Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...

  10. js中的数组和字符串的一些方法

    数组的一些方法: 1.join()和split()方法 <script type="text/javascript">var x;var a=new Array();a ...