题意:

求解一个四面体的内切球。

解法:

首先假设内切球球心为$(x0,x1,x2)$,可以用$r = \frac{3V}{S_1+S_2+S_3+S_4}$得出半径,

这样对于四个平面列出三个方程,解得

$x_n = \sum_{i=0}^3{Ai_{x_n} \cdot S_i } / (S_1 + S_2 + S_3 + S_4)$

这样,即可得出内切球。

时间复杂度$O(1)$。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath> #define LD double
#define sqr(x) ((x)*(x))
#define eps 1e-13 using namespace std; struct node
{
LD x,y,z;
void scan()
{
scanf("%lf%lf%lf",&x,&y,&z);
}
void print()
{
printf("%.4lf %.4lf %.4lf\n",x,y,z);
}
LD length()
{
return sqrt(sqr(x)+sqr(y)+sqr(z));
}
node operator+(const node &tmp)
{
return (node){x+tmp.x,y+tmp.y,z+tmp.z};
}
node operator-(const node &tmp)
{
return (node){x-tmp.x,y-tmp.y,z-tmp.z};
}
node operator/(LD tmp)
{
return (node){x/tmp,y/tmp,z/tmp};
}
node operator*(LD tmp)
{
return (node){x*tmp,y*tmp,z*tmp};
}
}; node cross(node a,node b)
{
node ans;
ans.x = a.y*b.z - b.y*a.z;
ans.y = b.x*a.z - a.x*b.z;
ans.z = a.x*b.y - b.x*a.y;
return ans;
} LD dist(node a,node b)
{
return (b-a).length();
} LD dot(node a,node b)
{
return a.x*b.x + a.y*b.y + a.z*b.z;
} LD get_angle(node a,node b)
{
LD tmp = dot(a,b)/a.length()/b.length();
return acos(tmp);
} node get_node(node A,node B,node C)
{
LD Lth = (B-A).length() + (C-A).length() + (C-B).length();
cout << sqr(Lth-) << endl;
LD r = fabs(cross(B-A,C-A).length()) / Lth;
cout << r*r << endl;
node v1 = C-A;
node v2 = B-A;
node v = (v1+v2)/(v1+v2).length();
LD d = (C-A).length()/;
LD L = sqrt(sqr(d)+sqr(r));
v = v*L;
return A+v;
} int main()
{
node A,B,C,D;
while(~scanf("%lf%lf%lf",&A.x,&A.y,&A.z))
{
B.scan();
C.scan();
D.scan();
if(fabs(dot(cross(B-A,C-A),D-A)) < eps)
{
puts("O O O O");
continue;
}
LD S1 = fabs(cross(B-D,C-D).length())/;
LD S2 = fabs(cross(D-A,C-A).length())/;
LD S3 = fabs(cross(B-A,D-A).length())/;
LD S4 = fabs(cross(B-A,C-A).length())/;
LD Ve = fabs(dot(cross(B-A,C-A),D-A))/;
LD R = *Ve / ((S1+S2+S3+S4));
node ans;
ans.x = (S1*A.x + S2*B.x + S3*C.x + S4*D.x)/(S1+S2+S3+S4);
ans.y = (S1*A.y + S2*B.y + S3*C.y + S4*D.y)/(S1+S2+S3+S4);
ans.z = (S1*A.z + S2*B.z + S3*C.z + S4*D.z)/(S1+S2+S3+S4);
printf("%.4lf %.4lf %.4lf %.4lf\n",ans.x,ans.y,ans.z,R);
}
return ;
}
/*
0 0 0 2 0 0 0 0 2 0 2 0
0 0 0 2 0 0 3 0 0 4 0 0
*/

最新文章

  1. objective-c系列-@Property&amp;点语法
  2. 前端之js的常用用法
  3. HTML输出 一 控制列背景颜色
  4. 后台gird表单按钮操作
  5. SVG的Transform使用
  6. LeetCode第[16]题(Java):3Sum Closest 标签:Array
  7. ViewPager 几个状态详解
  8. Java笔试
  9. SpringCloud学习5-如何创建一个服务提供者provider
  10. Qt5 入门
  11. LoadRunner服务水平协议SLA
  12. Android手机上浏览器不支持带端口号wss解决方案
  13. 【转帖】互联网加密及OpenSSL介绍和简单使用
  14. Mysql 模糊匹配(字符串str中是否包含子字符串substr)
  15. cef研究
  16. WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
  17. iOS archiveRootObject 归档失败问题
  18. Socket.IO for Unity 简要介绍
  19. iOS 性能优化套路
  20. 【JavaScript】Json

热门文章

  1. Jememeter和Loadrunner测试MySQL性能
  2. mysql + php 中文乱码 全是? 解决方法
  3. 修改mysql数据库 密码
  4. 错误 1 error C1083: 无法打开包括文件: “numpy/arrayobject.h”: No such file
  5. 对canvas arc()中counterclockwise参数的一些误解
  6. 02 svn 文件提交与目录结构
  7. Lua_第17 章 数学库
  8. 【BZOJ4953】lydsy七月月赛 F DP
  9. mysql-test-run.pl
  10. MongoDB 学习四 : 查询(续)