投影面积(公式在高数中有)

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;

}

你可能感兴趣的:(投影面积(公式在高数中有))