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


    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;
    }
    
  • 相关阅读:
    RGB色彩模式
    淘宝console
    倒计时
    放大镜效果
    谢谢你乱码
    [Linux Deploy]镜像扩展容量
    [Linux Deploy]SD 卡挂载问题
    [Linux Deploy]安装PHP环境
    [Linux Deploy]安装Dotnet Core 环境
    [Linux Deploy]安装MYSQL 设置自启动
  • 原文地址:https://www.cnblogs.com/gdutbean/p/1701748.html
Copyright © 2020-2023  润新知