- 题目链接 :https://nanti.jisuanke.com/t/A2226
- 题意:给定三个点,求三角形的内切圆和外接圆的面积(需要先判断是否能构成三角形)
- 思路:
1)判断三角形 :不要用a+b>c的方法了!既然上了大学就用叉乘,判断向量叉乘是否 = 0,如果是0就无法构成三角形。
2)求三角形面积:不要用海伦公式了!既然上了大学就用叉乘,向量a向量b = ab*sinα = 1/2 S
- 代码:
#include "bits/stdc++.h"
#define fori(i,l,u) for(int i = l;i < u;i++)
#define forj(j,l,u) for(int j = l;j < u;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn = 1e5;
int T;
double a1,b1,a2,b2,a3,b3;
double A,B,C;
double s = 0;
double S1,S2,r1,r2;
double length(double a1,double b1,double a2,double b2){
return sqrt(pow(a1-a2,2)+pow(b1-b2,2));
}
int main(){
freopen("1.txt","r",stdin);
cin>>T;
while (T--) {
cin>>a1>>b1>>a2>>b2>>a3>>b3;
A = length(a1,b1,a2,b2);
B = length(a1,b1,a3,b3);
C = length(a2,b2,a3,b3);
s = fabs((a1-a2)*(b3-b2) - (b1-b2)*(a3-a2));
if (s == 0) {
cout<<"NO SOLUTION"<<endl;
}else{
r1 = s/(A+B+C);
r2 = (A*B*C)/(2*s);
S1 = M_PI*r1*r1;
S2 = M_PI*r2*r2;
printf("%.10lf %.10lf\n",S1,S2);
}
}
return 0;
}
- 遇到的问题:
1)好久不写题忘了叉乘怎么求了。。。
2)刚开始想用叉乘判断是否构成三角形时需不需要三个向量两两相乘,但是只要是俩向量叉乘 = 0就三点一线,构不成,否则肯定≠0.
3)都用double。并且最后输出的时候用printf能精确小数点的位数。
4)π在c/cpp里是M_PI 表示。