gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/Bomb.cpp

    #include <math.h>
#include <fstream.h>
#include <iomanip.h>
//Download by http://www.NewXing.com
#include "Bomb.h"
#include "EarthModel.h"

const double PI=3.1415926;
const double RAD=180./PI;
extern double now_time ;

CBomb::CBomb()
{
	pXS=new double [1000000][36];
	Tag=0;
}

CBomb::~CBomb()
{
}

void CBomb::Analysize( double XS[], double Max[] )
{
	if ( fabs(Max[0]) < fabs(XS[8]) ) Max[0] = XS[17];
	if ( fabs(Max[1]) < fabs(XS[13]) ) Max[1] = XS[14];
	if ( fabs(Max[2]) < fabs(XS[14]) ) Max[2] = XS[12];	

	return ;
}

void CBomb::RecordData( double XS[] )
{
	(*(pXS+Tag))[0] = now_time ;
	for ( int i=0; i<36; ++i )  
	{
		(*(pXS+Tag))[i+1] = XS[i];
	}
	++Tag;	
	
	return ;
}

void CBomb::RecordToFile( void )
{
	CEarth  *pEarth_Record = new CEarth ; 
   	extern double t_step;
	extern float  dis_FIN[4];
	
	ofstream fFile( "BallisticData.txt" );
	fFile.flags(ios :: left); 

	fFile<<setw(8)<<"time";
	fFile<<setw(14)<<" x "<<setw(14)<<" y "<<setw(14)<<" z ";
	fFile<<setw(14)<<"Vx"<<setw(14)<<"Vy"<<setw(14)<<"Vz"<<setw(14)<<"Vel";
	fFile<<setw(14)<<"cita"<<setw(14)<<"psi_V"<<setw(14)<<"gama_v";
	fFile<<setw(14)<<"alpha"<<setw(14)<<"beta";
	fFile<<setw(14)<<"m"<<setw(14)<<"Thrust";
	fFile<<setw(14)<<"nx2"<<setw(14)<<"ny2";
	fFile<<setw(14)<<"delta_y"<<setw(14)<<"delta_z";
	fFile<<setw(14)<<"B"<<setw(14)<<"h";
	fFile<<setw(14)<<"XForce"<<setw(14)<<"YForce"<<setw(14)<<"ZForce";
	fFile<<setw(14)<<"q"<<setw(14)<<"diff_q";
	fFile<<setw(14)<<"CITA"<<setw(14)<<"pusai"<<endl;

	CalRange(  );//将数据文件最后一帧,计算成实际落点参数
	for ( int i = 0; i < Tag+1; ++ i )  //最后一组用于修正
	{
	    fFile<<setw(8)<<pXS[i][0];	//time
		fFile<<setw(14)<<pXS[i][4]<<setw(14)<<pXS[i][5]<<setw(14)<<pXS[i][6];	// x y z
	    fFile<<setw(14)<<pXS[i][1]<<setw(14)<<pXS[i][2]<<setw(14)<<pXS[i][3]<<setw(14)<<pXS[i][10];		// Vx Vy Vz Vel
		fFile<<setw(14)<<pXS[i][11]*RAD<<setw(14)<<pXS[i][12]*RAD<<setw(14)<<pXS[i][13]*RAD;//cita  pesai_V gamma_v (deg)
		fFile<<setw(14)<<pXS[i][14]*RAD<<setw(14)<<pXS[i][15]*RAD;				// alpha beta  (deg)
		fFile<<setw(14)<<pXS[i][7]<<setw(14)<<pXS[i][19];						// m  Thrust
		fFile<<setw(14)<<pXS[i][34]<<setw(14)<<pXS[i][35];						// nx2 ny2
		fFile<<setw(14)<<pXS[i][32]*RAD<<setw(14)<<pXS[i][33]*RAD;				// delta_y  delta_z   (deg)
		fFile<<setw(14)<< ( pEarth_Record->Cal_B( pXS[i][18]) )*RAD <<setw(14)<<pXS[i][16];					// B h
		fFile<<setw(14)<<pXS[i][20]<<setw(14)<<pXS[i][21]<<setw(14)<<pXS[i][22];// xXForce YForce ZForce
		fFile<<setw(14)<<pXS[i][25]*RAD<<setw(14)<<pXS[i][26]*RAD;				// q[0]  q[1] degree/s
		fFile<<setw(14)<<pXS[i][29]*RAD<<setw(14)<<pXS[i][30]*RAD<<endl;		// CITA PUSAI   (deg)
	}

	return ;
}

/*计算实际落点参数*/
void CBomb::CalRange( void )
{
	extern double a,b,c,d,e;
	double XC;
	XC= pXS[Tag-1][4];
	double Temp[36];
	for ( int i=0; i<36; ++i )
	{//用线性插值,计算实际落点参数
		Temp[i] = pXS[Tag-1][i]+(pXS[Tag-2][i]-pXS[Tag-1][i])*(0.0-pXS[Tag-1][16])/(pXS[Tag-2][16]-pXS[Tag-1][16]); 
	}

	for ( i = 0; i < 36; ++ i )	
	{
		pXS[Tag][i] = Temp[i];
	}
a=fabs(XC-pXS[Tag][4]);
//b=pXS[Tag][10]*RAD;
c=pXS[Tag][0];
d=pXS[Tag][4];
e=fabs(pXS[Tag][6]);

	return ;
}