HDU #5733 tetrahedron
tetrahedron
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
Given four points ABCD, if ABCD is a tetrahedron, calculate the inscribed sphere of ABCD.
Input
Multiple test cases .
Each test cases contains a line of 12 integers indicating the coordinates of four vertices of ABCD.
Input ends by EOF.
Output
Print the coordinate of the center of the sphere and the radius, rounded to 4 decimal places.
If there is no such sphere, output "O O O O".
Sample Input
0 0 0 2 0 0 0 0 2 0 2 0
0 0 0 2 0 0 3 0 0 4 0 0
Sample Output
0.4226 0.4226 0.4226 0.4226
O O O O
Author
HIT
Source
2016 Multi-University Training Contest 1
Solution:
求四面体的内切球的半径和球心坐标。
半径可以通过将体积算两次来求:第一次用向量算,第二次用四个面的面积和乘内切球半径算。
内心的直角坐标可用体积坐标来算。
四面体的体积坐标
$设四面体的四个顶点分别为A_1, A_2, A_3, A_4, 对于空间内任一点P, 我们用\vec{P}表示\vec{OP}$
$对\textbf{四面体内}任意一点P, 有$
\[\vec P =\sum_{i=1}^{4}\lambda_i\vec A_i,\]
\[\sum_{i=1}^{4}\lambda_i=1\]
$四面体体积坐标的几何意义:$
$其各坐标分量是以P为顶点, 以各底面为底的四面体的体积与原四面体的体积之比. 即:$
\[ \lambda_1=\frac{V_{PA_2 A_3A_4}}{V_{A_1A_2A_3A_4}} \]
\[\lambda_2=\frac{V_{PA_1A_3A_4}}{V_{A_1A_2A_3A_4}}\]
\[\lambda_3=\frac{V_{PA_1A_2A_4}}{V_{A_1A_2A_3A_4}}\]
\[\lambda_4=\frac{V_{PA_1A_2A_3}}{V_{A_1A_2A_3A_4}}\]
$记四面体A_1A_2A_3A_4的四个底面的面积分别为S_1, S_2, S_3, S_4, 若P是四面体A_1A_2A_3A_4的内心I, 则有$
\[\lambda_i = \frac{S_i}{S_1+S_2+S_3+S_4}, \quad i=1, 2, 3, 4\]
$故$
\[\vec{OI}=\sum_{i=1}^{4}\lambda_i\vec{A_i}=\frac{\sum\limits_{i=1}^{4}S_i\vec{A_i}}{\sum\limits_{i=1}^{4}S_i}\]
$从而I的直角坐标(x, y, z)为:$
\[x=\frac{\sum_\limits{i=1}^{4}S_ix_i}{\sum_\limits{i=1}^{4}S_i}\]
\[y=\frac{\sum_\limits{i=1}^{4}S_iy_i}{\sum_\limits{i=1}^{4}S_i}\]
\[z=\frac{\sum_\limits{i=1}^{4}S_iz_i}{\sum_\limits{i=1}^{4}S_i}\]
无解的情况对应着四面体四点共面, 即体积为零.
Implementation:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; struct point{
LL x,y,z;
int read(){
return scanf("%lld%lld%lld", &x, &y, &z);
} point operator-(const point &p){
return {x-p.x, y-p.y, z-p.z};
} point operator^(const point &p){ //cross product
return {y*p.z-z*p.y, z*p.x-x*p.z, x*p.y-y*p.x};
}
double operator*(const point &p){ //dot product
return x*p.x+y*p.y+z*p.z;
}
double len(){
return sqrt(x*x+y*y+z*z);
} }p[]; int main(){
for(; ~p[].read(); ){
for(int i=; i<; i++) p[i].read(); LL vol=abs(((p[]-p[])^(p[]-p[]))*(p[]-p[])); if(!vol){
puts("O O O O"); //error-prone: O, not 0
continue;
} double s[], sum=;
point vec[]; for(int i=; i<; i++){
for(int j=; j<; j++)
if(j!=i){
for(int k=, l=; k<; k++)
if(k!=j && k!=i)
vec[l++]=p[k]-p[j];
break;
}
s[i]=abs((vec[]^vec[]).len()), sum+=s[i];
} double tot=, x, y, z;
for(int i=; i<; i++) tot+=s[i]*p[i].x;
x=tot/sum;
tot=;
for(int i=; i<; i++) tot+=s[i]*p[i].y;
y=tot/sum;
tot=;
for(int i=; i<; i++) tot+=s[i]*p[i].z;
z=tot/sum;
printf("%.4f %.4f %.4f %.4f\n", x, y, z, vol/sum);
}
}
HDU #5733 tetrahedron的更多相关文章
- HDU 5733 tetrahedron(计算几何)
题目链接 tetrahedron 题目大意 输入一个四面体求其内心,若不存在内心则输出"O O O O" 解题思路 其实这道题思路很简单,只要类推一下三角形内心公式就可以了. 至于 ...
- hdu 5733 tetrahedron 四面体内切球球心公式
tetrahedron Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 【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 6814 Tetrahedron 规律+排列组合逆元
题意: 给你一个n,你需要从1到n(闭区间)中选出来三个数a,b,c(可以a=b=c),用它们构成一个直角四面体的三条棱(可看图),问你从D点到下面的三角形做一条垂线h,问你1/h2的期望 题解: 那 ...
- HDU 5839 Special Tetrahedron (计算几何)
Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- HDU 5839 Special Tetrahedron
HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...
- HDU 5839 Special Tetrahedron 计算几何
Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...
随机推荐
- 2015-2016-2 《Java程序设计》项目小组博客
2015-2016-2 <Java程序设计>项目小组博客 1451 完+美 java项目 守望先疯 JavaGroup 07_10_20_22 FromBottomToTop L.G.Su ...
- 移动端调试利器 JSConsole 介绍
先看这篇文章 Web应用调试:现在是Weinre和JSConsole,最终会是WebKit的远程调试协议. 我们先不看未来,从此文可见,当下的移动端调试还是 Weinre 和 JSConsole 的天 ...
- Laravel如何优雅的使用Swoole
背景 正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互.由于下位机数据是发送到服务器的XXX端口,所以必须对 ...
- ADO.NET 学习笔记 入门教程
本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63 这是本人在 ...
- PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))
PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a) robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...
- XML的解析和保存
1.XML(extensible markup language;XML ) 定义:,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. XML语法规范: 标 ...
- 【JQuery】jQuery.inArray 确定第一个参数在数组中的位置
函数:jQuery.inArray(value,array,[fromIndex]) 解释: value:用于在数组中查找是否存在 array:待处理数组. ...
- 【Alpha版本】冲刺阶段——Day 5
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- extJs学习基础5 理解mvvm的一个小案例
今天很是幸运,看到了一位大神的博客,学习了不少的东西.太感谢了.(满满的都是爱啊) 建议去学习这个大神的博客,真心不错. 博客地址:http://blog.csdn.net/column/detail ...
- 美发屋App-业余爱好
出于个人爱好, 自行设计了一款APP,由于时间有限,APP目前只做了3天,现大四,急求一份实习工作,月薪3K左右即可! 软件UI设计到编码,全部又我一人完成,所以工作量比较大 底部采用·Fragmen ...