随笔 - 373  文章 - 1  评论 - 771  阅读 - 137万

三角形内切圆与外接圆的面积比

CSDN编程挑战里的题目

一个三角形必然存在它的内切圆与外接圆,求他们的面积比。
考虑到精度问题,我们输出面积比*1000的整数部分(直接下取整)。
输入数据是一个三角形的三个顶点,但这三个顶点在三维空间中,
所以输入是9个整数,分别表示三个顶点(x1,y1,z1) (x2,y2,z2) (x3,y3,z3),
保证三点不共线,每个整数在-1000,+1000范围内。
输出内接圆与外切圆的面积比*1000的整数部分。

这题好搞,图形学我是专业的.

复制代码
 1 #include <cmath>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cfloat>
 5 
 6 // 内切圆半径
 7 // 内切圆半径r=2S/(a+b+c),其中S是三角形面积,a、b、c是三角形三边。
 8 // 另外S=根号下p(p-a)(p-b)(p-c),其中p=(a+b+c)/2 
 9 float TrinagleInCircle(float xA, float yA, float zA,
10                        float xB, float yB, float zB,
11                        float xC, float yC, float zC)
12 {
13     float ab = (xA - xB)*(xA - xB) + (yA - yB)*(yA - yB) + (zA - zB)*(zA - zB);
14     float bc = (xC - xB)*(xC - xB) + (yC - yB)*(yC - yB) + (zC - zB)*(zC - zB);
15     float ca = (xA - xC)*(xA - xC) + (yA - yC)*(yA - yC) + (zA - zC)*(zA - zC);
16 
17     ab = sqrtf(ab);
18     bc = sqrtf(bc);
19     ca = sqrtf(ca);
20 
21     float p = (ab+bc+ca)/2;
22 
23     float s = p*(p-ab)*(p-bc)*(p-ca);
24     if (s < FLT_EPSILON)
25     {
26         return 0.0f;
27     }
28     s = sqrtf(s);
29 
30     if (ab+bc+ca < FLT_EPSILON)
31     {
32         return 0.0f;
33     }
34 
35     float r = 2*s/(ab+bc+ca);
36 
37     return r;
38 }
39 
40 // 外接圆半径
41 // 已知三角形三边长a,b,c ,及其外接圆的半径R
42 // s=a*b*c/(4*R)      (多半用于求外接圆半径 R=a*b*c/(4*s)
43 float TrinagleOutCircle(float xA, float yA, float zA,
44                         float xB, float yB, float zB,
45                         float xC, float yC, float zC)
46 {
47     float ab = (xA - xB)*(xA - xB) + (yA - yB)*(yA - yB) + (zA - zB)*(zA - zB);
48     float bc = (xC - xB)*(xC - xB) + (yC - yB)*(yC - yB) + (zC - zB)*(zC - zB);
49     float ca = (xA - xC)*(xA - xC) + (yA - yC)*(yA - yC) + (zA - zC)*(zA - zC);
50 
51     ab = sqrtf(ab);
52     bc = sqrtf(bc);
53     ca = sqrtf(ca);
54 
55     float p = (ab+bc+ca)/2;
56 
57     float s = p*(p-ab)*(p-bc)*(p-ca);
58     if (s < FLT_EPSILON)
59     {
60         return 0.0f;
61     }
62     s = sqrtf(s);
63 
64     float r = ab*bc*ca/(4*s);
65 
66     return r;
67 }
68 
69 int ratio (int   x1,int   y1,int   z1,int   x2,int   y2,int   z2,int   x3,int   y3,int   z3)
70 {
71     float r = TrinagleInCircle(float(x1), float(y1), float(z1), float(x2), float(y2), float(z2), float(x3), float(y3), float(z3));
72     float R = TrinagleOutCircle(float(x1), float(y1), float(z1), float(x2), float(y2), float(z2), float(x3), float(y3), float(z3));
73     if (R < FLT_EPSILON || r < FLT_EPSILON)
74     {
75         return 0;
76     }
77     return (int)(1000*R*R/r/r);
78 }
复制代码

 

posted on   叶飞影  阅读(3065)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示