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的更多相关文章

  1. HDU 5733 tetrahedron(计算几何)

    题目链接 tetrahedron 题目大意 输入一个四面体求其内心,若不存在内心则输出"O O O O" 解题思路 其实这道题思路很简单,只要类推一下三角形内心公式就可以了. 至于 ...

  2. hdu 5733 tetrahedron 四面体内切球球心公式

    tetrahedron Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. 【HDU 5733】tetrahedron

    输入4个点三维坐标,如果是六面体,则输出内切球的球心坐标和半径. 点pi对面的面积为si,点a,b,c组成的面积=|ab叉乘ac|/2. 内心为a,公式: s0=s1+s2+s3+s4 a.x=∑si ...

  4. hdu 5726 tetrahedron 立体几何

    tetrahedron/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Given four p ...

  5. hdu 6814 Tetrahedron 规律+排列组合逆元

    题意: 给你一个n,你需要从1到n(闭区间)中选出来三个数a,b,c(可以a=b=c),用它们构成一个直角四面体的三条棱(可看图),问你从D点到下面的三角形做一条垂线h,问你1/h2的期望 题解: 那 ...

  6. HDU 5839 Special Tetrahedron (计算几何)

    Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  7. HDU 5839 Special Tetrahedron

    HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...

  8. HDU 5839 Special Tetrahedron 计算几何

    Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  9. HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...

随机推荐

  1. CentOS 7下的 Mysql 主从配置

    最近在玩mysql主从配置,在此记录一下 一.前言 1.安装两个虚拟机(CentOS 7).iP分别是192.168.47.131 和192.168.47.133.其中192.168.47.133作为 ...

  2. [MCSM] Slice Sampler

    1. 引言 之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法.在介绍这一类算法(指Gibbs samp ...

  3. 一起写一个JSON解析器

    [本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...

  4. grootjs 简明教程

    grootJs简明教程 mvvm框架也是解决的一类问题,在某些时候会提高生产效率: 经过接近一个月的努力,grootJs测试版终于发布了 grootJs是一个mvvm的框架,名字取 grass 和ro ...

  5. web性能优化——浏览器相关

    简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...

  6. VR的UI、UX设计原则

    国外其实有不少关于VR用户体验的研究 总结一下我所了解的: Cardboard Design Lab 1. 使用十字线(比较适用于移动VR.一体机) 2.有深度的UI与眼睛疲劳: 离眼睛近的UI,物体 ...

  7. JavaScript学习笔记-简单的欢迎cookie

    0<!DOCT0000YPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml&quo ...

  8. Windows10易升下载

    为了更好的帮助用户快速跨版本升级windows,退出Windows易升!在线下载,更新安装!网速快的话需要半个小时搞定! 升级完毕,如股票感觉OK.记得清理C盘Windows.old文件 01.磁盘- ...

  9. iOS -- MJrefresh

    - (void)refresh { MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self r ...

  10. Sublime Text 3 常用插件以及安装方法(vue 插件)

    使用Package Control组件安装 也可以安装package control组件,然后直接在线安装: 按Ctrl+` 调出console 粘贴以下代码到底部命令行并回车: { import u ...