- 題目鏈接 :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 表示。