博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 11275 判断空间三角形是否相交
阅读量:4112 次
发布时间:2019-05-25

本文共 2635 字,大约阅读时间需要 8 分钟。

题意:训练指南292页
#include
#include
using namespace std; struct Point3 {
double x, y, z; Point3(double x=0, double y=0, double z=0):x(x),y(y),z(z) { } void read() {
scanf("%lf%lf%lf", &x, &y, &z); } }; typedef Point3 Vector3; Vector3 operator + (const Vector3& A, const Vector3& B) { return Vector3(A.x+B.x, A.y+B.y, A.z+B.z); } Vector3 operator - (const Point3& A, const Point3& B) { return Vector3(A.x-B.x, A.y-B.y, A.z-B.z); } Vector3 operator * (const Vector3& A, double p) { return Vector3(A.x*p, A.y*p, A.z*p); } Vector3 operator / (const Vector3& A, double p) { return Vector3(A.x/p, A.y/p, A.z/p); } const double eps = 1e-8; int dcmp(double x) {
if(fabs(x) < eps) return 0; else return x < 0 ? -1 : 1; } double Dot(const Vector3& A, const Vector3& B) { return A.x*B.x + A.y*B.y + A.z*B.z; } double Length(const Vector3& A) { return sqrt(Dot(A, A)); } double Angle(const Vector3& A, const Vector3& B) { return acos(Dot(A, B) / Length(A) / Length(B)); } Vector3 Cross(const Vector3& A, const 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(const Point3& A, const Point3& B, const Point3& C) { return Length(Cross(B-A, C-A)); } // p1和p2是否在线段a-b的同侧 bool SameSide(const Point3& p1, const Point3& p2, const Point3& a, const Point3& b) {
return dcmp(Dot(Cross(b-a, p1-a), Cross(b-a, p2-a))) >= 0; } // 点在三角形P0, P1, P2中 bool PointInTri(const Point3& P, const Point3& P0, const Point3& P1, const Point3& P2) {
return SameSide(P, P0, P1, P2) && SameSide(P, P1, P0, P2) && SameSide(P, P2, P0, P1); } // 三角形P0P1P2是否和线段AB相交 bool TriSegIntersection(const Point3& P0, const Point3& P1, const Point3& P2, const Point3& A, const Point3& B, Point3& P) {
Vector3 n = Cross(P1-P0, P2-P0); if(dcmp(Dot(n, B-A)) == 0) return false; // 线段A-B和平面P0P1P2平行或共面 else { // 平面A和直线P1-P2有惟一交点 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); } } 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; } Point3 p[4],q[4]; int main() {
int cas; scanf("%d",&cas); while(cas--) {
int flag=0; for(int i=0;i<3;i++) p[i].read(); for(int i=0;i<3;i++) q[i].read(); printf("%d\n",TriTriIntersection(p,q)?1:0); } return 0; }

转载地址:http://htgsi.baihongyu.com/

你可能感兴趣的文章
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>