题意:给你一些无限长的圆柱,知道圆柱轴心直线(根据他给的三个点确定的平面求法向量即可)与半径,判断是否有圆柱相交。如果没有,输出柱面最小距离。

一共只有30个圆柱,直接暴力一下就行。

判相交/相切:空间直线距离是否小于等于两圆柱半径和
若无相交,求最小:空间直线距离-两圆柱半径和

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. const double EPS = 1e-;
  10. const int MAXN = ;
  11.  
  12. struct Point3 //空间点
  13. {
  14. double x, y, z;
  15. };
  16.  
  17. struct Line3 //空间直线
  18. {
  19. Point3 a, b;
  20. };
  21.  
  22. struct plane3 //空间平面
  23. {
  24. Point3 a, b, c;
  25. plane3(){}
  26. plane3( Point3 a, Point3 b, Point3 c ):
  27. a(a), b(b), c(c) { }
  28. };
  29.  
  30. struct Cylinder
  31. {
  32. Point3 center; //圆柱轴线经过的一点
  33. Point3 a, b; //与中心点在同一平面的两点
  34. Line3 FaXian; //轴线
  35. double R; //圆柱半径
  36. };
  37.  
  38. Cylinder CC[MAXN];
  39.  
  40. Point3 Read_Point()
  41. {
  42. Point3 p;
  43. scanf("%lf%lf%lf", &p.x, &p.y, &p.z );
  44. return p;
  45. }
  46.  
  47. double dcmp( double a )
  48. {
  49. if ( fabs( a ) < EPS ) return ;
  50. return a < ? - : ;
  51. }
  52.  
  53. //三维叉积
  54. Point3 Cross3( Point3 u, Point3 v )
  55. {
  56. Point3 ret;
  57. ret.x = u.y * v.z - v.y * u.z;
  58. ret.y = u.z * v.x - u.x * v.z;
  59. ret.z = u.x * v.y - u.y * v.x;
  60. return ret;
  61. }
  62.  
  63. //三维点积
  64. double Dot3( Point3 u, Point3 v )
  65. {
  66. return u.x * v.x + u.y * v.y + u.z * v.z;
  67. }
  68.  
  69. //矢量差
  70. Point3 Subt( Point3 u, Point3 v )
  71. {
  72. Point3 ret;
  73. ret.x = u.x - v.x;
  74. ret.y = u.y - v.y;
  75. ret.z = u.z - v.z;
  76. return ret;
  77. }
  78.  
  79. //取平面法向量
  80. Point3 NormalVector( plane3 s )
  81. {
  82. return Cross3( Subt( s.a, s.b ), Subt( s.b, s.c ) );
  83. }
  84. Point3 NormalVector( Point3 a, Point3 b, Point3 c )
  85. {
  86. return Cross3( Subt( a, b ), Subt( b, c ) );
  87. }
  88.  
  89. //两点距离
  90. double TwoPointDistance( Point3 p1, Point3 p2 )
  91. {
  92. return sqrt( (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) + (p1.z - p2.z)*(p1.z - p2.z) );
  93. }
  94.  
  95. //向量的模
  96. double VectorLenth( Point3 p )
  97. {
  98. return sqrt( p.x*p.x + p.y*p.y + p.z*p.z );
  99. }
  100.  
  101. //空间直线距离
  102. double LineToLine( Line3 u, Line3 v )
  103. {
  104. Point3 tmp = Cross3( Subt( u.a, u.b ), Subt( v.a, v.b ) );
  105. return fabs( Dot3( Subt(u.a, v.a), tmp ) ) / VectorLenth(tmp);
  106. }
  107.  
  108. int N;
  109.  
  110. int main()
  111. {
  112. int T;
  113. scanf( "%d", &T );
  114. while ( T-- )
  115. {
  116. scanf( "%d", &N );
  117. for ( int i = ; i < N; ++i )
  118. {
  119. CC[i].center = Read_Point();
  120. CC[i].a = Read_Point();
  121. CC[i].b = Read_Point();
  122. CC[i].R = VectorLenth( Subt( CC[i].a, CC[i].center ) );
  123. CC[i].FaXian.a = CC[i].center;
  124. CC[i].FaXian.b = Subt( CC[i].center, NormalVector( CC[i].center, CC[i].a, CC[i].b ) );
  125. }
  126.  
  127. bool ok = true;
  128. double MinAns = 1e200;
  129. for ( int i = ; ok && i < N; ++i )
  130. for ( int j = i + ; ok && j < N; ++j )
  131. {
  132. double tmp = LineToLine( CC[i].FaXian, CC[j].FaXian );
  133. if ( dcmp( tmp - ( CC[i].R + CC[j].R ) ) <= )
  134. {
  135. ok = false;
  136. break;
  137. }
  138. MinAns = min( MinAns, tmp - ( CC[i].R + CC[j].R ) );
  139. }
  140.  
  141. if ( ok ) printf( "%.2f\n", MinAns );
  142. else puts("Lucky");
  143. }
  144. return ;
  145. }

HDU 4617 Weapon 三维计算几何的更多相关文章

  1. hdu 4617 Weapon【异面直线距离——基础三维几何】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4617 Weapon Time Limit: 3000/1000 MS (Java/Others)     ...

  2. HDU 4617 Weapon (简单三维计算几何,异面直线距离)

    Weapon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  3. HDU 4617 Weapon(三维几何)

    Problem Description Doctor D. are researching for a horrific weapon. The muzzle of the weapon is a c ...

  4. hdu 4617 Weapon

    http://acm.hdu.edu.cn/showproblem.php?pid=4617 三维几何简单题 多谢高尚博学长留下的模板 代码: #include <iostream> #i ...

  5. hdu 4617 Weapon(叉积)

    大一学弟表示刚学过高数,轻松无压力. 我等学长情何以堪= = 求空间无限延伸的两个圆柱体是否相交,其实就是叉积搞一搞 详细点就是求两圆心的向量在两直线(圆心所在的直线)叉积上的投影 代码略挫,看他的吧 ...

  6. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  7. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  8. HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )

    空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...

  9. HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...

随机推荐

  1. 利用glassfish4任意文件读取拿权限的一些思路

    只要讨论的是linux环境测试发现只针对GlassFish4,且基本上是已root运行的http://www.wooyun.org/bugs/wooyun-2010-0144595 zoomeye d ...

  2. 好书推荐——《Soft Skill》

    这本书不是一本简单的叙述程序员职业规划和如何提高能力的书. 他论述了如何做一个高产,快乐,幸福的程序员,包括职业生涯,理财,学习,健身,信仰等各个方面的内容. 推荐给每一位伟大的拯救宇宙的程序员! 书 ...

  3. 【BZOJ】【2424】【HAOI2010】订货

    网络流/费用流 比较简单的题……我一开始想成像软件开发那题一样的做法了……就是每天拆点,S->i (INF,0) .i+n->T (u[i],0) 然后处理购入 S->i+n (IN ...

  4. Leetcode#49 Anagrams

    原题地址 Anagram:变位词.两个单词是变位词关系的条件是:组成单词的字符相同,只是顺序不同 第一次看这道题看了半天没明白要干嘛,丫就不能给个样例输入输出么..后来还是看网上其他人的总结知道是怎么 ...

  5. web项目首页提示404

    我也是服了,估计是项目有问题,只能找jsp,找不到html和htm.把list中多余的都删掉,只保留index.jsp <welcome-file-list> <welcome-fi ...

  6. PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)

    模型文档编辑器 PowerDesigner的模型文档(Model  Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...

  7. ASP.Net 上传进度条的实现方法

    对于加载时间比较长的ASP.NET页面,我们可以在客户端浏览器中显示进度条来显示页面正在装载.下面就是具体的实现过程: 新建项目,名字为WebPortal,在项目类型中选择Visual C#项目或者V ...

  8. 用 VIPER 构建 iOS 应用架构(1)

    [编者按]本篇文章由 Jeff Gilbert 和 Conrad Stoll 共同编写,通过构建一个基础示例应用,深入了解 VIPER,并从视图.交互器等多个部件理清 VIPER 的整体布局及思路.通 ...

  9. MFC单文档程序结构

    MFC单文档程序结构三方面: Doc MainFrame View

  10. HDU 4937 Lucky Number (数学,进制转换)

    题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator fi ...