6spsview.cpp
来自「此算法是牛顿欧拉法(在VC环境下)」· C++ 代码 · 共 1,058 行 · 第 1/2 页
CPP
1,058 行
dc.TextOut(250,60,"f (N)");
for(numi=-600;numi<=800;numi=numi+200)
{
dc.MoveTo(300,250-numi/5);
dc.LineTo(620,250-numi/5);
itoa(numi,str,10);
dc.TextOut(250,240-numi/5,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,404,"t (s)");
for(numi=0,i=0;numi<=0.3;numi=numi+0.05)
{
dc.MoveTo(300+numi*800,100);
dc.LineTo(300+numi*800,400);
dc.TextOut(290+numi*800,404,strt[i++]);
}
dc.TextOut(250,70,"f (N)");
for(numi=-750;numi<=750;numi=numi+250)
{
dc.MoveTo(300,250-numi/5);
dc.LineTo(540,250-numi/5);
itoa(numi,str,10);
dc.TextOut(250,240-numi/5,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];
}
for(j=0;j<3;j++)
{
vl[i][j]=vl[i][6]*el[i][j];
}
}
for(i=0;i<6;i++)
{
cma=vp[3];cmb=vp[4];cmc=vp[5];
cmd=tb[i][0];cme=tb[i][1];cmf=tb[i][2];
crossmul();
cmd=cmg+vp[0];cme=cmh+vp[1];cmf=cmi+vp[2];
cma=el[i][0];cmb=el[i][1];cmc=el[i][2];
crossmul();
vl[i][3]=cmg/l[i][3];vl[i][4]=cmh/l[i][3];vl[i][5]=cmi/l[i][3];
}
for(i=0;i<6;i++)
{
cma=vp[3];cmb=vp[4];cmc=vp[5];
cmd=tb[i][0];cme=tb[i][1];cmf=tb[i][2];
crossmul();
cmd=cmg;cme=cmh;cmf=cmi;
crossmul();
cmd=ap[0]+cmg;
cme=ap[1]+cmh;
cmf=ap[2]+cmi;
cma=el[i][0];cmb=el[i][1];cmc=el[i][2];
crossmul();
al[i][3]=(cmg-2*vl[i][0]*vl[i][3])/l[i][3];
al[i][4]=(cmh-2*vl[i][1]*vl[i][4])/l[i][3];
al[i][5]=(cmi-2*vl[i][2]*vl[i][5])/l[i][3];
}
for(i=0;i<6;i++)
{
cma=al[i][3];cmb=al[i][4];cmc=al[i][5];
cmd=lt*el[i][0];cme=lt*el[i][1];cmf=lt*el[i][2];
crossmul();
at[i][0]=cmg;at[i][1]=cmh;at[i][2]=cmi;
cmd=(l[i][3]-lh)*el[i][0];
cme=(l[i][3]-lh)*el[i][1];
cmf=(l[i][3]-lh)*el[i][2];
crossmul();
ah[i][0]=cmg;ah[i][1]=cmh;ah[i][2]=cmi;
cma=vl[i][3];cmb=vl[i][4];cmc=vl[i][5];
cmd=vl[i][0]*el[i][0];
cme=vl[i][1]*el[i][1];
cmf=vl[i][2]*el[i][2];
crossmul();
ah[i][0]=ah[i][0]+2*cmg;
ah[i][1]=ah[i][1]+2*cmh;
ah[i][2]=ah[i][2]+2*cmi;
for(j=0;j<3;j++)
{
ft[i][j]=mt*at[i][j];
fh[i][j]=mh*ah[i][j];
}
}
for(i=0;i<3;i++)
{
fd[6][i]=0;md[6][i]=0;
}
for(i=0;i<6;i++)
{
for(j=0;j<3;j++)
{
ind[j]=ind[3]*el[i][j];
inu[j]=inu[3]*el[i][j];
ml[i][j]=(ind[j]+inu[j])*al[i][j+3];
}
cma=vl[i][3];cmb=vl[i][4];cmc=vl[i][5];
cmd=(ind[0]+inu[0])*vl[i][3];
cme=(ind[1]+inu[1])*vl[i][4];
cmf=(ind[2]+inu[2])*vl[i][5];
crossmul();
ml[i][0]=ml[i][0]+cmg;
ml[i][1]=ml[i][1]+cmh;
ml[i][2]=ml[i][2]+cmi;
cma=(l[i][3]-lh)*el[i][0];
cmb=(l[i][3]-lh)*el[i][1];
cmc=(l[i][3]-lh)*el[i][2];
cmd=fh[i][0];cme=fh[i][1];cmf=fh[i][2];
crossmul();
ml[i][0]=ml[i][0]+cmg;
ml[i][1]=ml[i][1]+cmh;
ml[i][2]=ml[i][2]+cmi;
cma=lt*el[i][0];cmb=lt*el[i][1];cmc=lt*el[i][2];
cmd=ft[i][0];cme=ft[i][1];cmf=ft[i][2];
crossmul();
ml[i][0]=ml[i][0]+cmg;
ml[i][1]=ml[i][1]+cmh;
ml[i][2]=ml[i][2]+cmi;
cma=el[i][0];cmb=el[i][1];cmc=el[i][2];
cmd=ml[i][0];cme=ml[i][1];cmf=ml[i][2];
crossmul();
fd[i][0]=cmg/l[i][3];
fd[i][1]=cmh/l[i][3];
fd[i][2]=cmi/l[i][3];
for(j=0;j<3;j++)
{
//fd[i][j]=-((fh[i][j]+mgh[j])*el[i][j]*(l[i][3]-lh)+(ft[i][j]+mgt[j])*el[i][j]*lt)/l[i][j];
fd[6][j]=fd[6][j]+fd[i][j];
}
cma=fd[i][0];cmb=fd[i][1];cmc=fd[i][2];
cmd=tb[i][0];cme=tb[i][1];cmf=tb[i][2];
crossmul();
md[6][0]=md[6][0]+cmg;
md[6][1]=md[6][1]+cmh;
md[6][2]=md[6][2]+cmi;
}
for(i=0;i<3;i++)
{
fp[i]=mp[i]*ap[i];
}
for(i=0;i<3;i++)
{
fto[i]=fe[i]+mgp[i]+fp[i]+fd[6][i];
}
fto[3]=fe[3]+md[6][0];
fto[4]=fe[4]+md[6][1];
fto[5]=fe[5]+md[6][2];
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
jt[i][j]=ja[j][i];
}
}
matrcal();
for(i=0;i<6;i++)
{
fr[i]=0;
for(j=0;j<6;j++)
{
fr[i]=fr[i]+ji[i][j]*fto[j];
}
if(i==0)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(255,0,0));
}
if(i==1)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(0,255,0));
}
if(i==2)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(0,0,255));
}
if(i==3)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(255,0,255));
}
if(i==4)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(0,255,255));
}
if(i==5)
{
dc.SetPixel(300+t*800,250-fr[i]/5,RGB(0,0,0));
}
}
}
}
void CMy6spsView::cal()
{
for(i=2;i<5;i++)
{
sp[i]=0;
vp[i]=0;
ap[i]=0;
}
sp[0]=0.06*cos(50*t/3);
sp[1]=0.06*sin(50*t/3);
sp[2]=0.39;
sp[5]=50*t/3;
vp[0]=-sin(50*t/3);
vp[1]=cos(50*t/3);
vp[5]=50/3;
ap[0]=-50*cos(50*t/3)/3;
ap[1]=-50*sin(50*t/3)/3;
ap[5]=0;
}
void CMy6spsView::cbl()
{
if(t<=0.1)
{
sp[0]=15*pow(t,2)/2-0.14765;
vp[0]=15*t;
ap[0]=15;
}
else if(t>0.1&&t<=0.1968667)
{
sp[0]=1.5*t-0.22265;
vp[0]=1.5;
ap[0]=0;
}
else
{
sp[0]=-7.5*pow(t,2)+4.453*t-0.513324;
vp[0]=4.453-15*t;
ap[0]=-15;
}
if(t<=0.0859904)
{
sp[1]=7.5*pow(t,2)-0.136;
vp[1]=15*t;
ap[1]=15;
}
else if(t<=0.2108764)
{
sp[1]=-0.1914576+1.28986*t;
vp[1]=1.28986;
ap[1]=0;
}
else
{
sp[1]=-0.524974+4.453*t-7.5*pow(t,2);
vp[1]=4.453-15*t;
ap[1]=-15;
}
if(t<=0.0881635)
{
sp[2]=7.5*pow(t,2)+0.31;
vp[2]=15*t;
ap[2]=15;
}
else if(t>0.0881635&&t<=0.2087035)
{
sp[2]=0.251704+1.32245*t;
vp[2]=1.32245;
ap[2]=0;
}
else
{
sp[2]=-0.074975+4.453*t-7.5*pow(t,2);
vp[2]=4.453-15*t;
ap[2]=-15;
}
for(i=3;i<6;i++)
{
sp[i]=0;
vp[i]=0;
ap[i]=0;
}
}
void CMy6spsView::crossmul()
{
cmg=cmb*cmf-cme*cmc;
cmh=cmc*cmd-cma*cmf;
cmi=cma*cme-cmb*cmd;
}
void CMy6spsView::matrcal()
{
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
ji[i][j]=0;
if(i==j)
{
ji[i][j]=1;
}
}
}
for(i=0;i<6;i++)
{
numa=jt[i][i];
for(j=i;j<6;j++)
{
jt[i][j]=jt[i][j]/numa;
}
for(j=0;j<6;j++)
{
ji[i][j]=ji[i][j]/numa;
}
for(j=i+1;j<6;j++)
{
numb=jt[j][i];
for(k=i;k<6;k++)
{
jt[j][k]=jt[j][k]-numb*jt[i][k];
}
for(k=0;k<6;k++)
{
ji[j][k]=ji[j][k]-numb*ji[i][k];
}
}
}
for(i=5;i>=0;i--)
{
for(j=i-1;j>=0;j--)
{
for(k=5;k>=0;k--)
{
ji[j][k]=ji[j][k]-ji[i][k]*jt[j][i];
}
}
}
for(i=0;i<6;i++)
{
ji[5][i]=ji[5][i]/jt[5][5];
}
}
void CMy6spsView::Onset()
{
// TODO: Add your command handler code here
setdia dlg;
judg=0;
Invalidate();
dlg.m_vir=0;
dlg.m_fx=85.7;
dlg.m_fy=41.8;
dlg.m_fz=93.4;
dlg.m_mx=8.08;
dlg.m_my=17.75;
dlg.m_mz=0.13;
int res;
res=MessageBox("请注意外部条件取值范围","警告",MB_ICONINFORMATION);
if(dlg.DoModal()==IDOK)
{
fe[0]=dlg.m_fx;
fe[1]=dlg.m_fy;
fe[2]=dlg.m_fz;
fe[3]=dlg.m_mx;
fe[4]=dlg.m_my;
fe[5]=dlg.m_mz;
if(dlg.m_vir==0)
{
cons=FALSE;
}
else
{
cons=TRUE;
}
if(cons==FALSE)
{
res=MessageBox("您选择了动姿态空间圆周运动并设置了外部条件,确认吗?","警告",MB_YESNO+MB_ICONQUESTION);
if(res==IDNO)
{
dlg.m_vir=0;
dlg.m_fx=85.7;
dlg.m_fy=41.8;
dlg.m_fz=93.4;
dlg.m_mx=8.08;
dlg.m_my=17.75;
dlg.m_mz=0.13;
if(dlg.DoModal()==IDOK)
{
fe[0]=dlg.m_fx;
fe[1]=dlg.m_fy;
fe[2]=dlg.m_fz;
fe[3]=dlg.m_mx;
fe[4]=dlg.m_my;
fe[5]=dlg.m_mz;
if(dlg.m_vir==0)
{
cons=FALSE;
}
else
{
cons=TRUE;
}
}
}
}
else
{
res=MessageBox("您选择了定姿态空间直线运动并设置了外部条件,确认吗?","注意",MB_YESNO+MB_ICONQUESTION);
if(res==IDNO)
{
dlg.m_vir=0;
dlg.m_fx=85.7;
dlg.m_fy=41.8;
dlg.m_fz=93.4;
dlg.m_mx=8.08;
dlg.m_my=17.75;
dlg.m_mz=0.13;
if(dlg.DoModal()==IDOK)
{
fe[0]=dlg.m_fx;
fe[1]=dlg.m_fy;
fe[2]=dlg.m_fz;
fe[3]=dlg.m_mx;
fe[4]=dlg.m_my;
fe[5]=dlg.m_mz;
if(dlg.m_vir==0)
{
cons=FALSE;
}
else
{
cons=TRUE;
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?