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

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;
}
posted @ 2010-03-31 21:37  吴豆豆  阅读(3481)  评论(0编辑  收藏  举报