思路
这道题的意思是给出平面上的三点坐标(不共线),然后求出穿过这三个点的唯一圆的周长。
其实说白了,就是求出三角形外接圆的周长。尝试的过程比较复杂,最后还是凭借数学知识完成本题。
刚开始想到的方法就是找出这个外接圆的半径,进而求出这个圆的周长。先通过三个点坐标求出外接圆的圆心坐标,然后计算半径,再计算圆的周长。问题来了,怎么通过这三个点坐标确定外接圆的圆心?噢,三角形的外心是三个边的垂直平分线的交点,然后开始通过推导,想得出圆心坐标的公式。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