【POJ】2242.The Circumference of the Circle

思路

这道题的意思是给出平面上的三点坐标(不共线),然后求出穿过这三个点的唯一圆的周长。

其实说白了,就是求出三角形外接圆的周长。尝试的过程比较复杂,最后还是凭借数学知识完成本题。

刚开始想到的方法就是找出这个外接圆的半径,进而求出这个圆的周长。先通过三个点坐标求出外接圆的圆心坐标,然后计算半径,再计算圆的周长。问题来了,怎么通过这三个点坐标确定外接圆的圆心?噢,三角形的外心是三个边的垂直平分线的交点,然后开始通过推导,想得出圆心坐标的公式。x,y,x1,y1,x2,y2,x3,y3...尼玛!?这么多未知数。。。

然后开始寻找别的方法,想起高中学过的数学三角函数知识,正弦定理,c/sin(C) = d(外接圆的直径)

那怎么求sin(C)呢?噢,高中还学过,S = absin(C)/2,(S为三角形的面积)只要知道面积,就可以知道直径d = (abc)/2S,哈哈,下面只要把面积S求出来就可以了。

问题又来了,怎么通过三个点坐标求出三角形的面积呢?哦,以前数学课上学过向量的叉乘运算,S = |axb|/2,
(a,b均为向量)那么可通过求向量叉乘的模来求出面积。计算的过程又涉及到行列式,可以简化计算。

太特么神奇了,终于意识到数学的重要性了。。。

用C语言实现这个过程需要用到两个库函数,一个是fabs,用于取浮点数绝对值,另一个是hypot,用于根据直角三角形的两条直角边的长度来求斜边的长度。

 代码

#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main(int argc, char const *argv[])
{
    double x1, x2, x3, y1, y2, y3;
    while (~scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3))
    {
        double a = hypot(x1 - x2, y1 - y2);
        double b = hypot(x2 - x3, y2 - y3);
        double c = hypot(x1 - x3, y1 - y3);
        double S = fabs(x1 * y2 + x3 * y1 + x2 * y3 - x3 * y2 - x1 * y3 - x2 * y1);
        printf("%.2f\n",a*b*c*PI/S);//特别注意,double的输入使用%lf,输出使用%f!!!!不然不能通过!
    }
    return 0;
}

参考链接

https://blog.csdn.net/archielau/article/details/7647865

https://blog.csdn.net/synapse7/article/details/12144063

https://zh.cppreference.com/w/cpp/numeric/math/hypot

猜你喜欢

转载自www.cnblogs.com/zhaijiayu/p/9641359.html