⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6spsview.cpp

📁 此算法是牛顿欧拉法(在VC环境下)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 6spsView.cpp : implementation of the CMy6spsView class
//

#include "stdafx.h"
#include "6sps.h"

#include "6spsDoc.h"
#include "6spsView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView

IMPLEMENT_DYNCREATE(CMy6spsView, CView)

BEGIN_MESSAGE_MAP(CMy6spsView, CView)
	//{{AFX_MSG_MAP(CMy6spsView)
	ON_COMMAND(dyna_displacement, Ondisplacement)
	ON_COMMAND(dyna_force, Onforce)
	ON_COMMAND(dyna_velocity, Onvelocity)
	ON_COMMAND(ID_set, Onset)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView construction/destruction

CMy6spsView::CMy6spsView()
{
	// TODO: add construction code here
    judg=0;
	aa[0][0]=0.8*cos(-15*pi/180); aa[0][1]=0.8*sin(-15*pi/180);
    aa[1][0]=0.8*cos(75*pi/180); aa[1][1]=0.8*sin(75*pi/180);
	aa[2][0]=0.8*cos(105*pi/180); aa[2][1]=0.8*sin(105*pi/180);
	aa[3][0]=0.8*cos(195*pi/180); aa[3][1]=0.8*sin(195*pi/180);
	aa[4][0]=0.8*cos(225*pi/180); aa[4][1]=0.8*sin(225*pi/180);
	aa[5][0]=0.8*cos(-45*pi/180); aa[5][1]=0.8*sin(-45*pi/180);	
	bb[0][0]=0.2*cos(15*pi/180); bb[0][1]=0.2*sin(15*pi/180);
	bb[1][0]=0.2*cos(45*pi/180); bb[1][1]=0.2*sin(45*pi/180);
	bb[2][0]=0.2*cos(135*pi/180); bb[2][1]=0.2*sin(135*pi/180);
	bb[3][0]=0.2*cos(165*pi/180); bb[3][1]=0.2*sin(165*pi/180);
	bb[4][0]=0.2*cos(255*pi/180); bb[4][1]=0.2*sin(255*pi/180);
	bb[5][0]=0.2*cos(285*pi/180); bb[5][1]=0.2*sin(285*pi/180);

	for(i=3;i<6;i++)
	{
		vp[i]=0;ap[i]=0;
	}

	for(i=0;i<6;i++)
	{
		aa[i][2]=1.594058;
		bb[i][2]=0;
	}

	lh=0.4445;lt=0.341066;mh=7;mt=18.8;
	mgh[0]=0;mgh[1]=0;mgh[2]=-7*18.8;
	mgt[0]=0;mgt[1]=0;mgt[2]=-18.8*9.8;
	mp[0]=0;mp[1]=0;mp[2]=48;
	mgp[0]=0;mgp[1]=0;mgp[2]=-48*9.8;
    fe[0]=85.7;fe[1]=41.8;fe[2]=93.4;
	fe[3]=8.08;fe[4]=17.75;fe[5]=0.13;
	cons=FALSE;
	inu[3]=1.26828;ind[3]=0.31338;
}

CMy6spsView::~CMy6spsView()
{
}

BOOL CMy6spsView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView drawing

void CMy6spsView::OnDraw(CDC* pDC)
{
	CMy6spsDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	switch (judg)
	{
		case 1:	drawdis(); break;
		case 2:	drawvelo();	break;
		case 3: drawfor(); break;
		default: break;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView printing

BOOL CMy6spsView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMy6spsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMy6spsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView diagnostics

#ifdef _DEBUG
void CMy6spsView::AssertValid() const
{
	CView::AssertValid();
}

void CMy6spsView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMy6spsDoc* CMy6spsView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy6spsDoc)));
	return (CMy6spsDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMy6spsView message handlers

void CMy6spsView::Ondisplacement() 
{
	// TODO: Add your command handler code here
	judg=1;
	Invalidate();	
}

void CMy6spsView::Onforce() 
{
	// TODO: Add your command handler code here
	judg=3;
	Invalidate();	
}

void CMy6spsView::Onvelocity() 
{
	// TODO: Add your command handler code here
	judg=2;
	Invalidate();	
}

void CMy6spsView::drawdis()
{
	CClientDC dc(this);
	if(cons==FALSE)
	{
		static char strt[9][5]={{'0'},{'0','.','0','5'},{'0','.','1','0'},{'0','.','1','5'},{'0','.','2','0'},{'0','.','2','5'},{'0','.','3','0'},{'0','.','3','5'},{'0','.','4','0'}};
		dc.TextOut(245,110,"l (mm)");
		dc.TextOut(645,304,"t (s)");
		for(numi=1.25;numi<1.5;numi=numi+0.05)
		{
			itoa(numi*1000,str,10);
			dc.TextOut(250,1290-numi*800,str);
			dc.MoveTo(300,1300-numi*800);
			dc.LineTo(620,1300-numi*800);
		}
		for(numi=0,i=0;numi<=0.4;numi=numi+0.05)
		{
			dc.TextOut(290+numi*800,304,strt[i++]);
			dc.MoveTo(300+numi*800,140);
			dc.LineTo(300+numi*800,300);
		}
		end=0.37699;
	}
	else
	{
		static char strt[7][5]={{'0'},{'0','.','0','5'},{'0','.','1','0'},{'0','.','1','5'},{'0','.','2','0'},{'0','.','2','5'},{'0','.','3','0'}};
		dc.TextOut(245,80,"l (mm)");
		dc.TextOut(565,314,"t (s)");
		for(numi=1.1;numi<1.7;numi=numi+0.1)
		{
			itoa(numi*1000,str,10);
			dc.TextOut(250,740-numi*400,str);
			dc.MoveTo(300,750-numi*400);
			dc.LineTo(540,750-numi*400);
		}
		for(numi=0,i=0;numi<=0.3;numi=numi+0.05)
		{
			dc.TextOut(290+numi*800,314,strt[i++]);
			dc.MoveTo(300+numi*800,110);
			dc.LineTo(300+numi*800,310);
		}
		end=0.2968667;
	}
	
	for(t=0;t<=end;t=t+0.0001)
	{
		if(cons==FALSE)
		{
			cal();
			for(i=0;i<2;i++)
			{
				nt[i]=sp[i]/0.23;
			}		
			nt[2]=0.222036/0.23;
			bet=acos(nt[2]); 
			if(t<0.37699/2)
			{
				alp=-atan(nt[0]/nt[1]);
			}
			else
			{
				alp=pi-atan(nt[0]/nt[1]);
			}
			gam=-alp;
		}
		else
		{
			cbl();
			alp=0;
			bet=0;
			gam=0;
		}

		tr[0][0]=cos(alp)*cos(gam)-sin(alp)*cos(bet)*sin(gam);
		tr[0][1]=-cos(alp)*sin(gam)-sin(alp)*cos(bet)*cos(gam);
		tr[1][1]=-sin(alp)*sin(gam)+cos(alp)*cos(bet)*cos(gam);
		tr[1][2]=-sin(bet)*cos(alp);
		tr[2][0]=sin(bet)*sin(gam);
		tr[2][1]=sin(bet)*cos(gam);
		tr[2][2]=cos(bet);		
		tr[0][2]=sin(alp)*sin(bet);
		tr[1][0]=sin(alp)*cos(gam)+cos(alp)*cos(bet)*sin(gam);

		for(i=0;i<6;i++)
		{
			for(j=0;j<3;j++)
			{
				tb[i][j]=0;
				for(k=0;k<3;k++)
				{
					tb[i][j]=tb[i][j]+tr[j][k]*bb[i][k];
				}
			}
			for(j=0;j<3;j++)
			{
				l[i][j]=tb[i][j]+sp[j]-aa[i][j];
			}
			l[i][3]=sqrt(pow(l[i][0],2)+pow(l[i][1],2)+pow(l[i][2],2));

			if(cons==FALSE)
			{
				if(i==0)
				{
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(255,0,0));
				}
				if(i==1)
				{	        
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(0,255,0));
				}
				if(i==2)
				{	        
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(0,0,255));
				}
				if(i==3)
				{	        
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(255,0,255));
				}
				if(i==4)
				{	        
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(0,255,255));
				}
				if(i==5)
				{	        
					dc.SetPixel(300+t*800,1300-l[i][3]*800,RGB(0,0,0));
				}
			}
			else
			{
				if(i==0)
				{
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(255,0,0));			
				}
				if(i==1)
				{	        
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(0,255,0));
				}
				if(i==2)
				{	        
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(0,0,255));
				}
				if(i==3)
				{	        
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(255,0,255));
				}
				if(i==4)
				{	        
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(0,255,255));
				}
				if(i==5)
				{	        
					dc.SetPixel(300+t*800,750-l[i][3]*400,RGB(0,0,0));
				}
			}
		}

	}
}

void CMy6spsView::drawvelo()
{
	CClientDC dc(this);
	if(cons==FALSE)
	{
		static char strt[9][5]={{'0'},{'0','.','0','5'},{'0','.','1','0'},{'0','.','1','5'},{'0','.','2','0'},{'0','.','2','5'},{'0','.','3','0'},{'0','.','3','5'},{'0','.','4','0'}};
		dc.TextOut(645,350,"t (s)");	
		for(numi=0,i=0;numi<=0.4;numi=numi+0.05)
		{
			dc.MoveTo(300+numi*800,154);
			dc.LineTo(300+numi*800,346);
			dc.TextOut(290+numi*800,350,strt[i++]);
		}
		dc.TextOut(245,124,"v (mm/s)");
		for(numi=-1.6;numi<=1.6;numi=numi+0.4)
		{
			dc.MoveTo(300,250-numi*60);
			dc.LineTo(620,250-numi*60);
			if(numi>0)
			{
				numi=floor((numi+0.002)*10)/10;
			}
			itoa(numi*1000,str,10);
			dc.TextOut(250,240-numi*60,str);	
		}		
		end=0.37699;
	}
	else
	{
		static char strt[7][5]={{'0'},{'0','.','0','5'},{'0','.','1','0'},{'0','.','1','5'},{'0','.','2','0'},{'0','.','2','5'},{'0','.','3','0'}};
		dc.TextOut(565,324,"t (s)");
		for(numi=0,i=0;numi<=0.3;numi=numi+0.05)
		{
			dc.MoveTo(300+numi*800,176);
			dc.LineTo(300+numi*800,320);
			dc.TextOut(290+numi*800,324,strt[i++]);
		}
		dc.TextOut(245,146,"v (mm/s)");
		for(numi=-2.0;numi<=0.6;numi=numi+0.4)
		{
			dc.MoveTo(300,200-numi*60);
			dc.LineTo(540,200-numi*60);
			if(numi>0)
			{
				numi=floor((numi+0.002)*10)/10;
			}
			itoa(numi*1000,str,10);
			dc.TextOut(250,190-numi*60,str);
		}
		end=0.2968667;
	}

	for(t=0;t<=end;t=t+0.0001)
	{
		if(cons==FALSE)
		{
			cal();
			for(i=0;i<2;i++)
			{
				nt[i]=sp[i]/0.23;
			}		
			nt[2]=0.222036/0.23;
			bet=acos(nt[2]); 
			if(t<0.37699/2)
			{
				alp=-atan(nt[0]/nt[1]);
			}
			else
			{
				alp=pi-atan(nt[0]/nt[1]);
			}
			gam=-alp;
		}
		else
		{
			cbl();
			alp=0;
			bet=0;
			gam=0;
		}

		tr[0][0]=cos(alp)*cos(gam)-sin(alp)*cos(bet)*sin(gam);
		tr[0][1]=-cos(alp)*sin(gam)-sin(alp)*cos(bet)*cos(gam);
		tr[1][1]=-sin(alp)*sin(gam)+cos(alp)*cos(bet)*cos(gam);
		tr[1][2]=-sin(bet)*cos(alp);
		tr[2][0]=sin(bet)*sin(gam);
		tr[2][1]=sin(bet)*cos(gam);
		tr[2][2]=cos(bet);		
		tr[0][2]=sin(alp)*sin(bet);
		tr[1][0]=sin(alp)*cos(gam)+cos(alp)*cos(bet)*sin(gam);		
	
		for(i=0;i<6;i++)
		{
			for(j=0;j<3;j++)
			{
				tb[i][j]=0;
				for(k=0;k<3;k++)
				{
					tb[i][j]=tb[i][j]+tr[j][k]*bb[i][k];	
				}
			}
			for(j=0;j<3;j++)
			{
				l[i][j]=tb[i][j]+sp[j]-aa[i][j];
			}
			l[i][3]=sqrt(pow(l[i][0],2)+pow(l[i][1],2)+pow(l[i][2],2));
			for(j=0;j<3;j++)
			{
				el[i][j]=l[i][j]/l[i][3];
			}
		}

		for(i=0;i<6;i++)
		{
            for(j=0;j<3;j++)
			{
				ja[i][j]=el[i][j];
			}
			cma=tb[i][0];cmb=tb[i][1];cmc=tb[i][2];
			cmd=el[i][0];cme=el[i][1];cmf=el[i][2];
			crossmul();
			ja[i][3]=cmg;ja[i][4]=cmh;ja[i][5]=cmi;
		}

		for(i=0;i<6;i++)
		{
			vl[i][6]=0;
			for(j=0;j<6;j++)
			{
				vl[i][6]=vl[i][6]+ja[i][j]*vp[j];
			}

			if(cons==FALSE)
			{
				if(i==0)
				{		
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(255,0,0));			
				}
				if(i==1)
				{	        
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(0,255,0));
				}
				if(i==2)
				{	        
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(0,0,255));
				}
				if(i==3)
				{	        
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(255,0,255));
				}
				if(i==4)
				{	        
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(0,255,255));
				}
				if(i==5)
				{	        
					dc.SetPixel(300+t*800,250-vl[i][6]*60,RGB(0,0,0));
				}
			}
			else
			{
				if(i==0)
				{
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(255,0,0));			
				}
				if(i==1)
				{	        
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(0,255,0));
				}
				if(i==2)
				{	        
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(0,0,255));
				}
				if(i==3)
				{	        
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(255,0,255));
				}
				if(i==4)
				{	        
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(0,255,255));
				}
				if(i==5)
				{	        
					dc.SetPixel(300+t*800,200-vl[i][6]*60,RGB(0,0,0));
				}
			}
		}
	}
}

void CMy6spsView::drawfor()
{
	CClientDC dc(this);
	if(cons==FALSE)
	{
		static char strt[9][5]={{'0'},{'0','.','0','5'},{'0','.','1','0'},{'0','.','1','5'},{'0','.','2','0'},{'0','.','2','5'},{'0','.','3','0'},{'0','.','3','5'},{'0','.','4','0'}};
		dc.TextOut(645,374,"t (s)");
		for(numi=0,i=0;numi<=0.4;numi=numi+0.05)
		{
			dc.MoveTo(300+numi*800,90);
			dc.LineTo(300+numi*800,370);
			dc.TextOut(290+numi*800,374,strt[i++]);
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -