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 ...
随机推荐
- CentOS 系统下Gitlab搭建与基本配置 以及代码备份迁移过程
GitLab 是一个开源的版本管理系统,提供了类似于 GitHub 的源代码浏览,管理缺陷和注释等功能,你可以将代码免费托管到 GitLab.com,而且不限项目数量和成员数.最吸引人的一点是,可以在 ...
- 《linux设备驱动开发详解》笔记——12linux设备驱动的软件架构思想
本章重点讲解思想.思想.思想. 12.1 linux驱动的软件架构 下述三种思想,在linux的spi.iic.usb等复杂驱动里广泛使用.后面几节分别对这些思想进行详细说明. 思想1:驱动与设备分离 ...
- python并发编程之进程2(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- Restful API 概念解析
什么是restful? REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”. ...
- python寻找模块的路径顺序
>>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3. ...
- 循环字典进行操作时出现:RuntimeError: dictionary changed size during iteration的解决方案
在做对员工信息增删改查这个作业时,有一个需求是通过用户输入的id删除用户信息.我把用户信息从文件提取出来储存在了字典里,其中key是用户id,value是用户的其他信息.在循环字典的时候,当用户id和 ...
- ASP.NET Web网站中App_Code文件夹的作用及使用场景
原文地址:Web Site项目和ASP.NET Web Application中App_Code文件夹的作用作者:宾的宾 我现在要建一个ASP.NET的网站了,不难吧,开始动手.如下图: 这种方法建立 ...
- HTTPS的请求与响应
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- HDU 3315 KM My Brute
参考题解 二分图的最优匹配.图很容易建立.再处理相似度的时候.把每个权值扩大100倍.然后再对i==j时 特殊标记.使他们的权值再++1.后面选择的时候就很容易挑出.按原匹配 匹配的个数. 100*( ...
- action属性和data属性组合事例