• 三角形的内切圆与外接圆面积之比【几何计算】


    题目来源是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 <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 }

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

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

     1 #include<stdio.h>
     2 #include<math.h>
     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 //提示:自动阅卷结束唯一标识,请勿删除或增加。
  • 相关阅读:
    文件读取原理和文件删除原理
    day 1 随堂作业
    day 2 随堂作业
    day 3 随堂作业
    day 4 随堂作业
    day 5 随堂作业
    day 6 随堂作业
    day 7 随堂作业
    day 8 随堂作业
    day 9 随堂作业
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3525049.html
Copyright © 2020-2023  润新知