http://222.200.98.145:8000/JudgeOnline/showproblem?problem_id=1084
求投影面积,主要是
面积*COS a(a为两个面的夹角)
面积由海伦公式得S=SQRT(P(P-A)(P-B)(P-C)) (P==(A+B+C)/2);
COS A可以由单位向量的夹角得,其中单位向量为(A,B,C)(A0,B0,C0)
COS A=ABS(AA0+BB0+CC0)/(sqrt(A^2+B^2+C^2)*sqrt(A0^2+B0^2+C0^2));
单位向量又可以有平面内的任两个向量得到
N=AB*AC= | I, J, K |==(B*C0-C*B0)I+(C*A0+A*C0)J+(A*B0-B*A0)K;
| A, B, C|
|A0, B0,C0|
OK 代码如下
顺便说下我的SB ,我居然把某些变量定义为INT,,囧,,这个可是致命伤哦,,马虎的我,,要慢慢培养细心,谨慎的学习态度
#include<iostream> #include<cmath> #define Nmax 5 using namespace std; double tra[4][4],plane[4][4],col[Nmax][Nmax],num[Nmax],col_a[Nmax][Nmax],num_a[Nmax]; double ABS(double a) { if(a<0)return a*-1; return a; } double dis(int a,int b) { double x=tra[a][0]; double y=tra[a][1]; double z=tra[a][2]; double x0=tra[b][0]; double y0=tra[b][1];; double z0=tra[b][2]; return sqrt( (x-x0)*(x-x0) + (y-y0)*(y-y0)+ (z-z0)*(z-z0) ); } double Get_are() { double a=dis(0,1); double b=dis(1,2); double c=dis(2,0); // printf("%lf %lf %lf\n",a,b,c); double p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } void Solve() { int i; for( i=0;i<3;i++) { col[1][i]=tra[1][i]-tra[0][i]; col[2][i]=tra[2][i]-tra[0][i]; } num[0]=col[1][1]*col[2][2]-col[1][2]*col[2][1]; num[1]=col[1][2]*col[2][0]-col[1][0]*col[2][2]; num[2]=col[1][0]*col[2][1]-col[1][1]*col[2][0]; for( i=0;i<3;i++) { col_a[1][i]=plane[1][i]-plane[0][i]; col_a[2][i]=plane[2][i]-plane[0][i]; } num_a[0]=col_a[1][1]*col_a[2][2]-col_a[1][2]*col_a[2][1]; num_a[1]=col_a[1][2]*col_a[2][0]-col_a[1][0]*col_a[2][2]; num_a[2]=col_a[1][0]*col_a[2][1]-col_a[1][1]*col_a[2][0]; double a=0; double ans1=0; double ans2=0; for(i=0;i<3;i++) { a+=num[i]*num_a[i]; ans1+=num[i]*num[i]; ans2+=num_a[i]*num_a[i]; } double are=Get_are(); double ans=ABS( (ABS(a)*are)/( sqrt(ans1)*sqrt(ans2) ) ); // printf("%.2lf\n",are); // printf("%.2lf\n",angle); printf("%.2lf\n",ans); //getchar(); } int main() { int cas; cin>>cas; while(cas--) { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) scanf("%lf",&tra[i][j]); } for(i=0;i<3;i++) { for(j=0;j<3;j++) scanf("%lf",&plane[i][j]); } Solve(); } return 0; }