博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三角形的内切圆与外接圆面积之比【几何计算】
阅读量:4510 次
发布时间:2019-06-08

本文共 3765 字,大约阅读时间需要 12 分钟。

题目来源是CSDN:http://club.csdn.net/module/club/student/programming_challenges

http://hero.pongo.cn/Question/Details?ID=232&ExamID=227

 

一个三角形必然存在它的内切圆与外接圆,求他们的面积比。

考虑到精度问题,我们输出面积比*1000的整数部分(直接下取整)。

输入数据是一个三角形的三个顶点,但这三个顶点在三维空间中,所以输入是9个整数,

分别表示三个顶点(x1,y1,z1) (x2,y2,z2) (x3,y3,z3),保证三点不共线,每个整数在-1000,+1000范围内。

输出内接圆与外切圆的面积比*1000的整数部分。

 

这个题其实关键是对几何公式的运用:

(1)用三维坐标系中计算两点距离的公式计算三角形的三条边a、b、c。(公式参考百度百科)

(2)计算内切圆半径r。(公式参考维基百科)

 

下面是对公式的推导:

 

(3)计算外接圆的半径R。

公式参考如下:

(4)上面计算r、R的过程需要用到三角形的面积S。

根据三角形三边长a、b、c计算面积S可以用海伦公式:(维基百科)

(5)计算出了r、R就可以计算内切圆和外接圆的面积之比了。

这个计算量还是不小的,慢慢算吧。

 

 

 

代码我懒得写了呵呵,下面转载博客园网友的代码:http://www.cnblogs.com/WhyEngine/p/3520538.html

1 #include 
2 #include
3 #include
4 #include
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 ,及其外接圆的半径R42 // 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 }

 据说第一个题目来源链接题目描述有点问题:http://blog.csdn.net/zhd_honda/article/details/18254691

下面是第二个题目来源链接的代码,通过了的:(唉本来不想写代码了,想想偷懒不得。)

1 #include
2 #include
3 double ab,bc,ac; 4 double p,S; 5 double r,R; 6 int ratio (int x1,int y1,int z1,int x2,int y2,int z2,int x3,int y3,int z3) 7 { 8 ab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); 9 bc=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2));10 ac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)+(z1-z3)*(z1-z3));11 p=(ab+bc+ac)/2;12 S=sqrt(p*(p-ab)*(p-bc)*(p-ac));13 r=2*S/(ab+bc+ac);14 R=ab*bc*ac/4/S;15 return (int)((r/R)*(r/R)*1000);16 }17 //start 提示:自动阅卷起始唯一标识,请勿删除或增加。18 int main()19 { 20 printf("%d",ratio(0,0,0,0,0,0,0,0,0));21 }22 //end //提示:自动阅卷结束唯一标识,请勿删除或增加。

 

 

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/3525049.html

你可能感兴趣的文章
程序员的学习和积累
查看>>
.net实现支付宝在线支付
查看>>
centos7 swoole 三步搞定全部
查看>>
noip2014day1题解
查看>>
Excel:一些方法的理解
查看>>
【转】在RHEL上升级Python
查看>>
java:环境变量设置
查看>>
Servlet的学习之Response响应对象(3)
查看>>
基础知识回顾——上下文管理器
查看>>
ARM(RISC)和x86(CISC)的技术差异
查看>>
第3章 对象基础
查看>>
文件压缩与解压缩
查看>>
android 搜索自动匹配关键字并且标红
查看>>
Android ViewPager使用详解
查看>>
python爬虫之scrapy的pipeline的使用
查看>>
mysql 1366错误
查看>>
mfc 导出数据保存成excel和txt格式
查看>>
让Android中的webview支持页面中的文件上传
查看>>
UML基础
查看>>
Oracle 从Dump 文件里提取 DDL 语句 方法说明
查看>>