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 productreturn {y*p.z-z*p.y, z*p.x-x*p.z, x*p.y-y*p.x};}double operator*(const point &p){    //dot productreturn x*p.x+y*p.y+z*p.z;}double len(){return sqrt(x*x+y*y+z*z);}}p[4];int main(){for(; ~p[0].read(); ){for(int i=1; i<4; i++) p[i].read();LL vol=abs(((p[1]-p[0])^(p[2]-p[0]))*(p[3]-p[0]));if(!vol){puts("O O O O");    //error-prone: O, not 0continue;}double s[4], sum=0;point vec[2];for(int i=0; i<4; i++){for(int j=0; j<4; j++)if(j!=i){for(int k=0, l=0; k<4; k++)if(k!=j && k!=i)vec[l++]=p[k]-p[j];break;}s[i]=abs((vec[0]^vec[1]).len()), sum+=s[i];}double tot=0, x, y, z;for(int i=0; i<4; i++) tot+=s[i]*p[i].x;x=tot/sum;tot=0;for(int i=0; i<4; i++) tot+=s[i]*p[i].y;y=tot/sum;tot=0;for(int i=0; i<4; i++) tot+=s[i]*p[i].z;z=tot/sum;printf("%.4f %.4f %.4f %.4f\n", x, y, z, vol/sum);}
}

转载于:https://www.cnblogs.com/Patt/p/5688331.html

HDU #5733 tetrahedron相关推荐

  1. hdu 6814 Tetrahedron

    题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6814 思路 在四面体 中 由 可推出 那么E(x)=p*(1/a^2 + 1/b^2 + 1/c ...

  2. 阿里云资深技术专家易立:我对云原生软件架构的观察与思考

    来源 | 阿里巴巴中间件 作者 | 易立,阿里云资深技术专家,容器技术负责人 头图 | CSDN付费下载于视觉中国 前言 云原生计算包含三个维度的内容,云原生基础设施,软件架构和交付与运维体系,本文将 ...

  3. HDU 4389 - X mod f(x)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4389 2012多校,第9场,1010 . 问题是,询问区间内 存在多少个 哈沙德数(Harshad ...

  4. hdu 4389 囧,打表

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 :一个数能被他各个位数之和整除则符合要求,给L,R,问区间里有多少个数符合要求. 囧,居然打表就能过 ...

  5. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  6. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  7. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  8. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  9. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

最新文章

  1. 芯片巨人也要搞医疗?
  2. 《Windows驱动开发技术详解》读书笔记(一)
  3. 安装完Visual Team System 2008 Team Explorer出错解决办法
  4. CSS引入CSS文件不生效 搞得很恼火
  5. 设计模式------观察者模式
  6. Java面试常考的面试题整理
  7. Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)
  8. 基于弹性计算的AI推理
  9. php调用apache,apache调用php执行系统命令
  10. C++ Builder 实现动态生成窗口、控件,以及处理控件事件(转载)
  11. mysqld已删除但仍占用空间的_活见鬼,明明删除了数据,空间却没减少
  12. 网站竞价推广抗恶意点击及屏蔽特定地区IP实例
  13. dnastar拼接反向互补序列_DNAstar 教程
  14. u盘文件名乱码linux,U盘文件名乱码的原因和解决办法
  15. 中望cad文字显示问号怎么办_中望CAD钢筋符号显示为问号怎么办?
  16. css画心形原理,如何用 css 画一个心形
  17. 疑问代词which/what/who的用法
  18. 2023最新计算机毕业设计题目汇总大全
  19. 实验四 微程序控制器实验
  20. 火星玩家Mars全球合伙人招募计划启动:为电核户外可持续发展贡献实质力量

热门文章

  1. 小姐姐给我讲,一听就懂的财务报表
  2. 多条件and查询遇到的问题
  3. Pandas时间索引的骚操作
  4. c51转汇编语言窗口,在C51语言中如何嵌入汇编语言
  5. java 交互式 shell_Java9 Shell工具(JShell)
  6. vite.js项目创建流程图
  7. python functools模块方法
  8. python时间模块 dir(time)_python sys,os,time模块的使用(包括时间格式的各种转换)...
  9. pytorch学习笔记(九):softmax回归的简洁实现
  10. sklearn学习笔记(一):数据预处理