http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/A

题目大意:给出三维空间两个三角形三个顶点,判断二者是否有公共点,三角形顶点、边、内部算三角形的一部分。
解题思路:见模板
  1. //*******************************************************************************
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<stdio.h>
  6. using namespace std;
  7. #define eps 1e-8
  8.  
  9. int dcmp(double x){
  10. if(fabs(x)<eps)return ;
  11. else return x< ? -:;
  12. }
  13.  
  14. struct Point3{
  15. double x,y,z;
  16. Point3(double x=,double y=,double z=):x(x),y(y),z(z){}
  17. };
  18. bool operator==(const Point3& a,const Point3& b){
  19. return dcmp(a.x-b.x)== && dcmp(a.y-b.y)== && dcmp(a.z-b.z)== ;
  20. }
  21. typedef Point3 Vector3;
  22. Vector3 operator+(Vector3 A,Vector3 B){
  23. return Vector3(A.x+B.x,A.y+B.y,A.z+B.z);
  24. }
  25. Vector3 operator-(Vector3 A,Vector3 B){
  26. return Vector3(A.x-B.x,A.y-B.y,A.z-B.z);
  27. }
  28. Vector3 operator*(Vector3 A,double p){
  29. return Vector3(A.x*p,A.y*p,A.z*p);
  30. }
  31. Vector3 operator/(Vector3 A,double p){
  32. return Vector3(A.x/p,A.y/p,A.z/p);
  33. }
  34.  
  35. double Dot(Vector3 A,Vector3 B){return A.x*B.x+A.y*B.y+A.z*B.z;}
  36. double Length(Vector3 A){return sqrt(Dot(A,A));}
  37. double Angle(Vector3 A,Vector3 B){return acos(Dot(A,B)/Length(A)/Length(B));}
  38.  
  39. /*p到平面p0-n的距离
  40. double DistanceToPlane(Point3 p,Point3 p0,Vector3 n){
  41. return fabs(Dot(p-p0,n))/Length(n);
  42. }
  43. //p到平面p0-n的投影
  44. Point3 GetPlaneProjection(Point3 p,Point3 p0,Vector3 n){
  45. double d=Dot(p-p0,n)/Length(n);
  46. return p+n*d;
  47. }
  48. //直线p1-p2到平面p0-n的交点
  49. Point3 LinePlaneIntersection(Point3 p1,Point3 p2,Point3 p0,Vector3 n){
  50. Vector3 v=p2-p1;
  51. double t=(Dot(n,p0-p1)/Dot(n,p2-p1));//判断分母是否为0
  52. return p1+v*t;//如果是线段,判断t是不是在0-1之间
  53. }*/
  54.  
  55. //叉积
  56. Vector3 Cross(Vector3 A,Vector3 B){
  57. return Vector3(A.y*B.z-A.z*B.y,A.z*B.x-A.x*B.z,A.x*B.y-A.y*B.x);
  58. }
  59. double Area2(Point3 A,Point3 B,Point3 C){return Length(Cross(B-A,C-A));}
  60. //点p在三角形p0p1p2中(利用面积法算点是否在三角形内,假定所有的点共面)
  61. bool PointInTri(Point3 p,Point3 p0,Point3 p1,Point3 p2){
  62. double area1=Area2(p,p0,p1);
  63. double area2=Area2(p,p1,p2);
  64. double area3=Area2(p,p2,p0);
  65. return dcmp(area1+area2+area3-Area2(p0,p1,p2))==;
  66. }
  67. //三角形p0p1p2是否和线段AB相交(此函数会把线段在平面上的情况视为不相交)
  68. bool TriSegIntersection(Point3 p0,Point3 p1,Point3 p2,Point3 A,Point3 B,Point3& p){
  69. Vector3 n=Cross(p1-p0,p2-p0);
  70. if(dcmp(Dot(n,B-A))==)return false;//平行或共面
  71. else{ //直线AB和平面P0P1P2有唯一交点
  72. double t=Dot(n,p0-A)/Dot(n,B-A);
  73. if(dcmp(t)< || dcmp(t-)>)return false;//交点不在线段AB上
  74. p=A+(B-A)*t; //计算交点
  75. return PointInTri(p,p0,p1,p2); //判断交点是否在三角形内
  76. }
  77. }
  78. /*到直线的距离
  79. double DistanceToLine(Point3 p,Point3 A,Point3 B){
  80. Vector3 v1=B-A,v2=p-A;
  81. return Length(Cross(v1,v2))/Length(v1);
  82. }
  83. //点p到线段AB的距离
  84. double DistanceToSegment(Point3 p,Point3 A,Point3 B){
  85. if(A==B)return Length(p-A);
  86. Vector3 v1=B-A,v2=p-A,v3=p-B;
  87. if(dcmp(Dot(v1,v2))<0)return Length(v2);
  88. else if(dcmp(Dot(v1,v3))>0)return Length(v3);
  89. else return Length(Cross(v1,v2))/Length(v1);
  90. }
  91. //返回,,的混合积,他等于四面体邮箱面积的6倍
  92. double Volume6(Point3 A,Point3 B,Point3 C,Point3 D){
  93. return Dot(D-A,Cross(B-A,C-A));
  94. }*/
  95. //判断两个三角形是否有公共点
  96. bool TriTriIntersection(Point3* T1,Point3* T2){
  97. Point3 p;
  98. for(int i=;i<;i++){
  99. if(TriSegIntersection(T1[],T1[],T1[],T2[i],T2[(i+)%],p))return true;
  100. if(TriSegIntersection(T2[],T2[],T2[],T1[i],T1[(i+)%],p))return true;
  101. }
  102. return false;
  103. }
  104. //*******************************************************************************
  105. int main(){
  106. int T;cin>>T;
  107. while(T--){
  108. Point3 T1[],T2[];
  109. for(int i=;i<;i++)cin>>T1[i].x>>T1[i].y>>T1[i].z;
  110. for(int i=;i<;i++)cin>>T2[i].x>>T2[i].y>>T2[i].z;
  111. cout<<(TriTriIntersection(T1,T2) ? "1\n":"0\n");
  112. }return ;
  113. }
  114. //*******************************************************************************

[ACM_几何] F. 3D Triangles (三维三角行相交)的更多相关文章

  1. 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破

    你见过能动起来的文档吗? 这可不是动图,也不是视频,而是可以直接自由交互3D模型的3D OFD文档! OFD可能有人不熟悉,它其实是国产"PDF",3D OFD则突破了以往文字.图 ...

  2. [ACM_几何] Pipe

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/B     本题大意: 给定一个管道上边界的拐点,管道宽为1,求 ...

  3. [ACM_几何] Fishnet

      http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/C 本题大意:有一个1X1的矩形,每边按照从小到大的顺序给n ...

  4. [ACM_几何] Metal Cutting(POJ1514)半平面割与全排暴力切割方案

    Description In order to build a ship to travel to Eindhoven, The Netherlands, various sheet metal pa ...

  5. [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]

    Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to ...

  6. uva 11275 3D Triangles

    题意:三维空间中,给出两个三角形的左边,问是否相交. 面积法判断点在三角形内: #include<cstdio> #include<cmath> #include<cst ...

  7. ACM_求f(n)

    求f(n) Time Limit: 2000/1000ms (Java/Others) Problem Description: 设函数f(n)=1*1*1+2*2*2+3*3*3+...+n*n*n ...

  8. Leetcode883.Projection Area of 3D Shapes三维形体投影面积

    在 N * N 的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1 立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上. 现在,我们查 ...

  9. [ACM_几何] The Deadly Olympic Returns!!! (空间相对运动之最短距离)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B 题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以 ...

随机推荐

  1. 关于“float”的一次探索--遇到了一个span元素可以设置宽高引发的思考

    起初,这个问题和float还有设置宽高之间是没有任何关联的,一开始这是一个关于height和line-height的问题,目的是为了探究一下这两者之间的关系,但是在学习的过程中,我翻之前写的代码,发现 ...

  2. BLE资料应用笔记 -- 持续更新

    BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...

  3. Spring 容器

    Spring提供了两个核心接口:BeanFactory和ApplicationContext,其中applicationContext是BeanFactory的子接口. 他们都可代表Spring容器, ...

  4. php 学习日志- 变量作用域

    1.global 函数内访问全局变量 <?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); ech ...

  5. spring aop一些名词的理解

    最近想深入了解spring,已经使用spring一段时间,但是对spring的理解一直很肤浅,先把几个常见的名词理解一下. 比如一个ssh架构的电商系统上面有用户模块,商品模块,订单模块,支付模块等, ...

  6. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

  7. 利用FPGA加速实现高性能计算

    原文链接 原因:处理器本身无法满足高性能计算(HPC)应用软件的性能需求,导致需求和性能 之间出现了缺口. 最初解决办法:使用协处理器来提升处理器的性能. 协处理器(基于硬件的设计)具有三种能力: 1 ...

  8. IE11浏览器:请不要再叫我IE,谢谢

    这篇对自已挺有用的,特mark一下,纯转载. 转载自:nczonline 微软在上周刚刚发布了用于Windows 8.1上 的首个Internet Explorer 11的预览版.我们已经确认Inte ...

  9. 【收藏】Firebird知识

    本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过.使用了Data Access面板的组件用SQL进行操作作者:LAH ...

  10. vim指令常用

    慢慢尝试使用vim,不断学习使用新的快捷键,将常用快捷键但经常容易忘的写下来, 1. 复制黏贴 命令行模式下按住v选中,y表示复制,d表示剪切,p为复制.