HDU 5733 tetrahedron(计算几何)
题目链接
题目大意
输入一个四面体求其内心,若不存在内心则输出“O O O O”
解题思路
其实这道题思路很简单,只要类推一下三角形内心公式就可以了。
至于如何判断无解,计算一下体积若V<=0则无解
Code
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
struct point{
double x, y, z;
point (double xx = 0, double yy = 0, double zz = 0){
x = xx;
y = yy;
z = zz;
}
friend point operator - (const point &a, const point &b){
return point(a.x - b.x, a.y - b.y, a.z - b.z);
}
} p[4];
double cross(point p1, point p2){
return sqrt(pow(p1.y * p2.z - p1.z * p2.y, 2) + pow(-(p1.x * p2.z - p1.z * p2.x), 2) + pow(p1.x * p2.y - p1.y * p2.x, 2));
}
double vol(point p1, point p2, point p3){
return fabs((p2.y * p3.z - p2.z * p3.y) * p1.x - (p2.x * p3.z - p2.z * p3.x) * p1.y + (p2.x * p3.y - p2.y * p3.x) * p1.z);
}
int main(){
while (~scanf("%lf%lf%lf", &p[0].x, &p[0].y, &p[0].z)){
for (int i = 1; i < 4; i++) scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
double V = vol(p[1] - p[0], p[2] - p[0], p[3] - p[0]);
if (V <= eps){
printf("O O O O\n");
continue;
}
V = V / 6;
double s1 = 0.5 * cross(p[1] - p[0], p[2] - p[0]);
double s2 = 0.5 * cross(p[1] - p[0], p[3] - p[0]);
double s3 = 0.5 * cross(p[2] - p[0], p[3] - p[0]);
double s4 = 0.5 * cross(p[1] - p[2], p[3] - p[2]);
double S = s1 + s2 + s3 + s4;
double r = V * 3 / S;
double x = (p[0].x * s4 + p[1].x * s3 + p[2].x * s2 + p[3].x * s1) / S;
double y = (p[0].y * s4 + p[1].y * s3 + p[2].y * s2 + p[3].y * s1) / S;
double z = (p[0].z * s4 + p[1].z * s3 + p[2].z * s2 + p[3].z * s1) / S;
printf("%.4f %.4f %.4f %.4f\n", x, y, z, r);
}
return 0;
}
HDU 5733 tetrahedron(计算几何)的更多相关文章
- HDU #5733 tetrahedron
tetrahedron 传送门 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
- hdu 5733 tetrahedron 四面体内切球球心公式
tetrahedron Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 4998 Rotate (计算几何)
HDU 4998 Rotate (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4998 Description Noting is more ...
- hdu 4643 GSM 计算几何 - 点线关系
/* hdu 4643 GSM 计算几何 - 点线关系 N个城市,任意两个城市之间都有沿他们之间直线的铁路 M个基站 问从城市A到城市B需要切换几次基站 当从基站a切换到基站b时,切换的地点就是ab的 ...
- HDU 5839 Special Tetrahedron 计算几何
Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- 【HDU 5733】tetrahedron
输入4个点三维坐标,如果是六面体,则输出内切球的球心坐标和半径. 点pi对面的面积为si,点a,b,c组成的面积=|ab叉乘ac|/2. 内心为a,公式: s0=s1+s2+s3+s4 a.x=∑si ...
- hdu 5726 tetrahedron 立体几何
tetrahedron/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Given four p ...
- HDU 1174 爆头(计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1174 解题报告:就是用到了三维向量的点积来求点到直线的距离,向量(x1,y1,z1)与(x2,y2,z ...
- hdu 1086(计算几何入门题——计算线段交点个数)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2 ...
随机推荐
- spartan6不能直接把时钟连到IO上
1.问题的提出:spartan6中不允许时钟信号直接连到IO口上面? 2.解决办法: ODDR2的使用 ODDR2Primitive: Double Data Rate Output D Flip-F ...
- Python使用gevent实现协程
Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...
- Confluence 导出为 PDF 格式 - 导出多个页面或者整个空间
使用 Confluence 的空间导出功能,你可以将多个页面或者整个 Confluence 站点转换为 PDF 文件. 希望使用空间导出功能,你需要 导出空间(Export Space)权限.请查看 ...
- 多本Python极速入门最佳书籍,不可错过的Python学习资料!
Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. ...
- QT添加自定义信号后编译出现undefined reference
QT添加自定义信号后编译出现undefined reference 这是需要重新生成qmake: build --->run qmake
- 数字pid笔记(1)
针对stm32中可以如下实现: p->IncrementVal = (p->Kp * (p->err - p->err_next)) + (p->Ki * p->e ...
- freertos知识点笔记——队列、二值信号量、计数信号量
队列1.队列queue通常用于任务之间的通信,一个任务写缓存,另一个任务读缓存.队列还会有等待时间,2.阻塞超时时间.如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间.如 ...
- poj 2236 网络连接问题 并查集
题意:n台电脑,当两台之间的距离小于d的时候可以连接. 题目会进行操作“修复”还有“查询是否已经连接”.只要在查询的时候输出YES或者ON 思路: 把可以相互连接的 即两者之间的距离小于 d q[i ...
- 奇数结点升序偶数结点降序的单链表排序(Python实现)
题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...
- UOJ 152 汉诺塔 分治
题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...