uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2250

  判断两个空间中的三角形是否有公共点。

代码如下:

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm> using namespace std; struct Point3 {
double x[];
Point3() {}
Point3(double *_x) { for (int i = ; i < ; i++) x[i] = _x[i];}
} ;
typedef Point3 Vec3; Vec3 operator + (Vec3 a, Vec3 b) {
Vec3 ret;
for (int i = ; i < ; i++) ret.x[i] = a.x[i] + b.x[i];
return ret;
}
Vec3 operator - (Vec3 a, Vec3 b) {
Vec3 ret;
for (int i = ; i < ; i++) ret.x[i] = a.x[i] - b.x[i];
return ret;
}
Vec3 operator * (Vec3 a, double p) {
Vec3 ret;
for (int i = ; i < ; i++) ret.x[i] = a.x[i] * p;
return ret;
}
Vec3 operator / (Vec3 a, double p) {
Vec3 ret;
for (int i = ; i < ; i++) ret.x[i] = a.x[i] / p;
return ret;
} const double EPS = 1e-;
inline int sgn(double x) { return (x > EPS) - (x < -EPS);} bool operator < (Point3 a, Point3 b) {
for (int i = ; i < ; i++) {
if (sgn(a.x[i] - b.x[i])) return a.x[i] < b.x[i];
}
return true;
}
bool operator == (Point3 a, Point3 b) {
for (int i = ; i < ; i++) {
if (sgn(a.x[i] - b.x[i])) return false;
}
return true;
} double dotDet(Vec3 a, Vec3 b) {
double ret = 0.0;
for (int i = ; i < ; i++) ret += a.x[i] * b.x[i];
return ret;
}
inline double dotDet(Point3 o, Point3 a, Point3 b) { return dotDet(a - o, b - o);}
inline Vec3 crossDet(Vec3 a, Vec3 b) {
Vec3 ret;
for (int i = ; i < ; i++) ret.x[i] = a.x[(i + ) % ] * b.x[(i + ) % ] - b.x[(i + ) % ] * a.x[(i + ) % ];
return ret;
}
inline Vec3 crossDet(Point3 o, Point3 a, Point3 b) { return crossDet(a - o, b - o);}
inline double vecLen(Vec3 x) { return sqrt(dotDet(x, x));}
inline double angle(Vec3 a, Vec3 b) { return acos(dotDet(a, b) / vecLen(a) / vecLen(b));}
inline double ptDis(Point3 a, Point3 b) { return vecLen(a - b);}
inline double triArea(Point3 a, Point3 b, Point3 c) { return vecLen(crossDet(a, b, c));}
inline Vec3 vecUnit(Vec3 x) { return x / vecLen(x);} struct Plane {
Point3 p;
Vec3 n;
Plane() {}
Plane(Point3 p, Vec3 n) : p(p), n(n) {}
Plane(Point3 a, Point3 b, Point3 c) { p = a; n = crossDet(b - a, c - a);}
} ;
inline double pt2Plane(Point3 p, Point3 p0, Vec3 n) { return dotDet(p - p0, n) / vecLen(n);}
inline double pt2Plane(Point3 p, Plane P) { return pt2Plane(p, P.p, P.n);}
inline Point3 ptOnPlane(Point3 p, Point3 p0, Vec3 n) { return p + n * pt2Plane(p, p0, n);}
inline Point3 ptOnPlane(Point3 p, Plane P) { return ptOnPlane(p, P.p, P.n);}
inline bool ptInPlane(Point3 p, Point3 p0, Vec3 n) { return sgn(dotDet(p - p0, n)) == ;}
inline bool ptInPlane(Point3 p, Plane P) { return ptInPlane(p, P.p, P.n);} int linePlaneIntersect(Point3 s, Point3 t, Point3 p0, Vec3 n, Point3 &x) {
double res1 = dotDet(n, p0 - s);
double res2 = dotDet(n, t - s);
if (sgn(res2) == ) {
if (ptInPlane(s, p0, n)) return ;
return ;
}
x = s + (t - s) * (res1 / res2);
return ;
} bool ptInTri(Point3 p, Point3 *tri) {
double area = triArea(tri[], tri[], tri[]);
double sum = 0.0;
for (int i = ; i < ; i++) sum += triArea(p, tri[i], tri[(i + ) % ]);
return sgn(sum - area) == ;
} bool triSegIntersect(Point3 *tri, Point3 s, Point3 t) {
Vec3 n = crossDet(tri[], tri[], tri[]);
if (sgn(dotDet(n, t - s)) == ) return false;
else {
double k = dotDet(n, tri[] - s) / dotDet(n, t - s);
if (sgn(k) < || sgn(k - ) > ) return false;
Point3 x = s + (t - s) * k;
return ptInTri(x, tri);
}
} Point3 tri[][]; bool check() {
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
if (triSegIntersect(tri[i], tri[i ^ ][j], tri[i ^ ][(j + ) % ])) return true;
}
}
return false;
} int main() {
// freopen("in", "r", stdin);
int n;
cin >> n;
while (n--) {
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
for (int k = ; k < ; k++) {
cin >> tri[i][j].x[k];
}
}
}
cout << check() << endl;
}
return ;
}

——written by Lyon

uva 11275 3D Triangles (3D-Geometry)的更多相关文章

  1. Multi-View 3D Reconstruction with Geometry and Shading——Part-2

    From PhDTheses Multi-View 3D Reconstruction with Geometry and Shading 我们的主要目标是只利用图像中的信息而没有额外的限制或假设来得 ...

  2. Multi-View 3D Reconstruction with Geometry and Shading——Part-1

    From PhDTheses Multi-View 3D Reconstruction with Geometry and Shading 计算机视觉的主要任务就是利用图像信息能智能理解周围的世界. ...

  3. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课

    闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...

  4. webgl(three.js)实现室内三维定位,3D定位,3D楼宇bim、实时定位三维可视化解决方案——第十四课(定位升级版)

    序: 还是要抽出时间看书的,迷上了豆豆的作品,最近在看<天幕红尘>,书中主人公的人生价值观以及修为都是让我惊为叹止.很想成为那样的人,但是再看看自己每天干的事,与时间的支配情况,真是十分的 ...

  5. 教你调节Boom 3D的3D音效强度,让音乐更带感

    Boom 3D的专业3D环绕技术,让用户能全身心地沉浸在立体音效中.无论是聆听音乐,还是观赏电影,立体音效都能为人们带来更加真实的听觉感触. 那么,Boom 3D的3D环绕功能到底能给用户带来怎样的体 ...

  6. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室(升级版)

    很长一段时间没有写3D库房,3D密集架相关的效果文章了,刚好最近有相关项目落地,索性总结一下 与之前我写的3D库房密集架文章<如何用webgl(three.js)搭建一个3D库房,3D密集架,3 ...

  7. 如何用webgl(three.js)搭建一个3D库房,3D仓库,3D码头,3D集装箱可视化孪生系统——第十五课

    序 又是快两个月没写随笔了,长时间不总结项目,不锻炼文笔,一开篇,多少都会有些生疏,不知道如何开篇,如何写下去.有点江郎才尽,黔驴技穷的感觉. 写随笔,通常三步走,第一步,搭建框架,先把你要写的内容框 ...

  8. 如何用webgl(three.js)搭建一个3D库房,3D仓库3D码头,3D集装箱,车辆定位,叉车定位可视化孪生系统——第十五课

    序 又是快两个月没写随笔了,长时间不总结项目,不锻炼文笔,一开篇,多少都会有些生疏,不知道如何开篇,如何写下去.有点江郎才尽,黔驴技穷的感觉. 写随笔,通常三步走,第一步,搭建框架,先把你要写的内容框 ...

  9. webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课

    序: 能源是文明和发展的重要保障,人类命运不可避开的话题,无论是战争还是发展,都有它存在的身影.从石器时代到现代文明,人类的能源应用在进步,也在面临能源枯竭的危机与恐惧,而开发与应用可再生能源才是解决 ...

  10. 如何使用webgl(three.js)实现3D储能,3D储能站,3D智慧储能、储能柜的三维可视化解决方案——第十七课

    前言 上节课我们讲了<3D光伏发电>,与之配套的就是能量存储 这节课我们主要讲讲储能,储能站,在分布式能源系统中起到调节用对电的尖峰平谷进行削峰填谷的作用.特别是小型储能站,更加灵活,因地 ...

随机推荐

  1. 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]

    P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...

  2. JavaScript 中的多线程通信的方法

    在Html 5诞生之后,我们可以使用javascript来实现多线程处理.H5 新增了一个web workers api,使用这个API,用户可以很容易地创建在后台运行的线程,H5 中被称为workd ...

  3. 抽象类 abstract class 接口

    一.抽象类 1.没有具体的实例. 不可实例化,不能创建对象. 2.抽象类有构造器. 二.abstract 方法. 1.没有方法体. 子类必须重写抽象类的所有抽象方法,才能实例化,否则子类也为抽象类. ...

  4. Leetcode872.Leaf-Similar Trees叶子相似的树

    请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 . 举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树. 如果有两颗二叉树的叶值序列是相同 ...

  5. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  6. 利用IE浏览器查看元素绑定的JS代码

  7. C++不支持默认的int

    VS: 工程属性->C/C++->命令行->输入 /wd4430

  8. sas信用评分之第二步变量筛选

    sas信用评分之第二步变量筛选 今天介绍变量初步选择.这部分的内容我就只介绍information –value,我这次做的模型用的逻辑回归,后面会更新以基尼系数或者信息熵基础的筛选变量,期待我把. ...

  9. 【JZOJ3873】【NOIP2014八校联考第4场第2试10.20】乐曲创作(music)

    ujfuiaty 小可可是音乐学院的一名学生,他需要经常创作乐曲完成老师布置的作业. 可是,小可可是一个懒惰的学生.所以,每次完成作业时,他不会重新创作一首新的乐曲,而是去修改上一次创作过的乐曲作为作 ...

  10. Java版阿里云通信短信发送API接口实例(新)

    阿里云通信(原名阿里大于)的短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力,支持快速发送短信验证码.短信通知等. 完美支撑双11期间2亿用户,发送6亿短信 ...