[ACM_几何] F. 3D Triangles (三维三角行相交)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/A
题目大意:给出三维空间两个三角形三个顶点,判断二者是否有公共点,三角形顶点、边、内部算三角形的一部分。 |
解题思路:见模板 |
//******************************************************************************* #include<iostream> #include<algorithm> #include<cmath> #include<stdio.h> using namespace std; #define eps 1e-8int dcmp(double x){if(fabs(x)<eps)return 0;else return x<0 ? -1:1; }struct Point3{double x,y,z;Point3(double x=0,double y=0,double z=0):x(x),y(y),z(z){} }; bool operator==(const Point3& a,const Point3& b){return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0 && dcmp(a.z-b.z)==0 ; } typedef Point3 Vector3; Vector3 operator+(Vector3 A,Vector3 B){return Vector3(A.x+B.x,A.y+B.y,A.z+B.z); } Vector3 operator-(Vector3 A,Vector3 B){return Vector3(A.x-B.x,A.y-B.y,A.z-B.z); } Vector3 operator*(Vector3 A,double p){return Vector3(A.x*p,A.y*p,A.z*p); } Vector3 operator/(Vector3 A,double p){return Vector3(A.x/p,A.y/p,A.z/p); }double Dot(Vector3 A,Vector3 B){return A.x*B.x+A.y*B.y+A.z*B.z;} double Length(Vector3 A){return sqrt(Dot(A,A));} double Angle(Vector3 A,Vector3 B){return acos(Dot(A,B)/Length(A)/Length(B));}/*p到平面p0-n的距离 double DistanceToPlane(Point3 p,Point3 p0,Vector3 n){return fabs(Dot(p-p0,n))/Length(n); } //p到平面p0-n的投影 Point3 GetPlaneProjection(Point3 p,Point3 p0,Vector3 n){double d=Dot(p-p0,n)/Length(n);return p+n*d; } //直线p1-p2到平面p0-n的交点 Point3 LinePlaneIntersection(Point3 p1,Point3 p2,Point3 p0,Vector3 n){Vector3 v=p2-p1;double t=(Dot(n,p0-p1)/Dot(n,p2-p1));//判断分母是否为0return p1+v*t;//如果是线段,判断t是不是在0-1之间 }*///叉积 Vector3 Cross(Vector3 A,Vector3 B){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); } double Area2(Point3 A,Point3 B,Point3 C){return Length(Cross(B-A,C-A));} //点p在三角形p0p1p2中(利用面积法算点是否在三角形内,假定所有的点共面) bool PointInTri(Point3 p,Point3 p0,Point3 p1,Point3 p2){double area1=Area2(p,p0,p1);double area2=Area2(p,p1,p2);double area3=Area2(p,p2,p0);return dcmp(area1+area2+area3-Area2(p0,p1,p2))==0; } //三角形p0p1p2是否和线段AB相交(此函数会把线段在平面上的情况视为不相交) bool TriSegIntersection(Point3 p0,Point3 p1,Point3 p2,Point3 A,Point3 B,Point3& p){Vector3 n=Cross(p1-p0,p2-p0);if(dcmp(Dot(n,B-A))==0)return false;//平行或共面else{ //直线AB和平面P0P1P2有唯一交点double t=Dot(n,p0-A)/Dot(n,B-A);if(dcmp(t)<0 || dcmp(t-1)>0)return false;//交点不在线段AB上p=A+(B-A)*t; //计算交点return PointInTri(p,p0,p1,p2); //判断交点是否在三角形内 } } /*到直线的距离 double DistanceToLine(Point3 p,Point3 A,Point3 B){Vector3 v1=B-A,v2=p-A;return Length(Cross(v1,v2))/Length(v1); } //点p到线段AB的距离 double DistanceToSegment(Point3 p,Point3 A,Point3 B){if(A==B)return Length(p-A);Vector3 v1=B-A,v2=p-A,v3=p-B;if(dcmp(Dot(v1,v2))<0)return Length(v2);else if(dcmp(Dot(v1,v3))>0)return Length(v3);else return Length(Cross(v1,v2))/Length(v1); } //返回,,的混合积,他等于四面体邮箱面积的6倍 double Volume6(Point3 A,Point3 B,Point3 C,Point3 D){return Dot(D-A,Cross(B-A,C-A)); }*/ //判断两个三角形是否有公共点 bool TriTriIntersection(Point3* T1,Point3* T2){Point3 p;for(int i=0;i<3;i++){if(TriSegIntersection(T1[0],T1[1],T1[2],T2[i],T2[(i+1)%3],p))return true;if(TriSegIntersection(T2[0],T2[1],T2[2],T1[i],T1[(i+1)%3],p))return true;}return false; } //******************************************************************************* int main(){int T;cin>>T;while(T--){Point3 T1[3],T2[3];for(int i=0;i<3;i++)cin>>T1[i].x>>T1[i].y>>T1[i].z;for(int i=0;i<3;i++)cin>>T2[i].x>>T2[i].y>>T2[i].z;cout<<(TriTriIntersection(T1,T2) ? "1\n":"0\n");}return 0; } //******************************************************************************* View Code |
转载于:https://www.cnblogs.com/zjutlitao/p/3246491.html
[ACM_几何] F. 3D Triangles (三维三角行相交)相关推荐
- 用几何画板怎么画三维坐标轴
通过课本上的介绍,想必大家都知道了,三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的.那么要怎么画出三维坐标轴呢? 几何画板作为专业的绘图软件,可以用来画各种数 ...
- java 三角依次递增在递减_java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形...
java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形 关注:168 答案:2 mip版 解决时间 2021-01-28 19:40 提问者耍硪ミ倪配么 ...
- 园区3D可视化三维展示系统解决方案
5G浪潮的到来加速了数字化发展,3d园区可视化数字孪生综合管理平台可将数字园区的人口.经济.应急等服务进行3D数字化.网络化,实现优化管理决策支持和可视化管理.商迪3D通过3D地理信息系统.数字孪生和 ...
- 三维触控测试软件,解读苹果3D touch三维触控技术
苹果在iphone6s上发布了3d touch三维触控的新功能.3d touch能够让iphone6s识别超过寻常平面的二维触控操作,用户可以通过手机按压的力度以触发不同的操作.下面我们来详细了解一下 ...
- 智能机器人STP电机定子装配STP可调节大行程移载机构STP5T单梁起重机三维图 SolidWorks机械式自动跟踪水位计全套 3D模型三维图纸川崎BX200L机器人钣金两边攻牙机3D
智能机器人STP 电机定子装配STP 可调节大行程移载机构STP 5T单梁起重机三维图 SolidWorks 机械式自动跟踪水位计全套 3D模型三维图纸 川崎BX200L机器人 钣金两边攻牙机3D ...
- Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交。第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4)
Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交.第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4) 题目 破题 ...
- Abaqus纤维混凝土3D 泡沫混凝土 三维随机几何 三维混凝土细观 多面体骨料建模
模型实例 以下是Abaqus内纤维混凝土的模型,纤维是采用三维圆柱体模拟的,混凝土内的骨料采用的是实体的球体.纤维及骨料均可设置不同的尺寸,并且各类型的数目不受限制,即可设置多种纤维及球体骨料大小. ...
- Modern GMT Series:Slice in 3D View (三维切片图)
Fancy的版本见九天学者的个人博客,关注文集博士干点啥或者微信公众号九天学者及时获取连载更新. 相信理工科方面的科研人员经常会遇到做三维切片图的时候,以地球物理为例,比如重力.磁异常三维反演,地震速 ...
- 实战:基于深度学习和几何的3D边界框估计
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 3D 对象检测问题在需要决策或与现实世界中的对象交互的机器人应用中 ...
最新文章
- JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果...
- 14c语言课程设计题目,2011级数据库课程设计任务书
- php框架laravel百科,PHP 的Laravel 框架
- 信息学奥赛C++语言:小青蛙回来了
- 例子---年倒计时/JS日期对象类型
- 树状数组(搬运自维基百科)
- Real-time 节点
- Explorer.exe报错故障解决一例
- 【缅怀妈妈系列诗歌】之十三:妈妈,我接您回家
- 【物流选址】基于matlab麻雀搜索算法求解物流选址问题【含Matlab源码 H003期】
- RabbitMQ五种工作模式学习总结
- 非线性回归 python_回归算法之非线性回归
- python你好代码-再见,Python。你好,Go语言。
- Oracle 考试概要
- 【转载】Android蓝牙自动配对Demo
- Third1: Basic Web applications BASIC NFS services triggering mount | Cloud computing
- 将文字定位到浮动图片上|CSS
- Python压缩解压--lzma
- 人物渲染篇(一) —— 基础卡通渲染 上
- R语言学习笔记【简单语法总结-上】
热门文章
- idea中启动tomcat,控制台中文乱码问题解决方案
- Confluence介绍与使用
- ArcGIS水文分析实战教程(13)流域提取流程
- 典型的同步客户端、服务器端套接字的创建
- druid mysql 配置优化_数据库连接池优化配置(druid,dbcp,c3p0)
- 接口 java性能_MyPerf4J 一个极快的Java接口性能监控和统计工具
- java split 坑_Java坑锦集一 - split函数
- python画棒棒糖程序_python之turtle简单绘制学习
- git 更换密码后,pull代码 fatal: Authentication failed for '
- 剑指offer面试题07. 重建二叉树(递归)(切片)