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;
}