1.VC&;Matlab 混合编程实现比例导引弹道仿真 实时比例导引三维弹道仿真(VC&;Matlab 混编), 通过实时调用 MATLAB 编写的导弹 计算函数,进行实时弹道解算。MATLAB 编写的导弹计算函数为 dandao.m,mcc 编译后,添加.c 和.cpp 文件, 通过计时器调用 dandao 进行单步运算弹道,并完成当前弹道打点显示。 希望版主加国防币啊! matlab 为 6.5 版。 核心代码如下; void CFaDlgrawLine2() { //调用 dandao.m 函数,这里的输入值和输出值与 dandao.m 函数相对应 out_tx=dandao(&;out_ty,&;out_tz,&;out_mx,&;out_my,&;out_mz,&;out_mp,&;out_mh,&; out_r, in_tx,in_ty,in_tz,in_tp,in_th,in_mx,in_my,in_mz,in_vm,in_vt,in_dt,in_m); //从 mwArray 型中取出 double 类型数据 dout_tx=out_tx.ExtractScalar(1); dout_ty=out_ty.ExtractScalar(1); dout_tz=out_tz.ExtractScalar(1); dout_mx=out_mx.ExtractScalar(1); dout_my=out_my.ExtractScalar(1); dout_mz=out_mz.ExtractScalar(1); dout_mp=out_mp.ExtractScalar(1); dout_mh=out_mh.ExtractScalar(1); dout_r=out_r.ExtractScalar(1); //调用 line 函数以打点方式绘制弹目的当前坐标 m_hMissile=line("xdata",dout_my,"ydata",dout_mx,"zdata",dout_mz, "visible","on","parent",m_mwhAxis,"color","b"); m_hTarget=line("xdata",dout_ty,"ydata",dout_tx,"zdata",dout_tz, "visible","on","parent",m_mwhAxis,"color","r"); //保留当前图上子对象和所有属性不变,等待下一组数据 Vset(m_mwhAxis,"NextPlot","add"); //将输出值赋给输入值,进行迭代 in_tx=out_tx; in_ty=out_ty; in_tz=out_tz; in_mx=out_mx; in_my=out_my; in_mz=out_mz; } %生成弹道坐标系
void CFaDlg::GenAxis2() { double BKColor[]={0.925,0.914,0.847}; mwArray mwBkColor(1,3,BKColor); m_mwhFigure = figure( mwArray("DoubleBuffer"), mwArray("On"), mwArray("NumberTitle"), mwArray("Off"), mwArray("Name"), mwArray("__figure"), mwArray("Color"), mwBkColor, mwArray("Visible"), mwArray("off"), mwArray("MenuBar"), mwArray("none") ); m_mwhAxis= axes(mwArray("arent"), m_mwhFigure, mwArray("Box"), mwArray("On"), mwArray("XGrid"), mwArray("On"), mwArray("YGrid"), mwArray("On"), mwArray("zGrid"), mwArray("On")); mwArray xLabel=get(m_mwhAxis,"xlabel"); mwArray yLabel=get(m_mwhAxis,"ylabel"); mwArray zLabel=get(m_mwhAxis,"zlabel"); set(xLabel,"string","X/米","fontsize",8); set(yLabel,"string","Y/米","fontsize",8); set(zLabel,"string","Z/米","fontsize",8); m_hMissile=line("xdata",0,"ydata",0,"zdata",0,"visible","off","parent",m_mwhAxis); m_hTarget=line("xdata",0,"ydata",0,"zdata",0,"visible","off","parent",m_mwhAxis); Vset(m_mwhAxis,"NextPlot","add");//hold on } %将 matlab 窗口嵌入 VC 图文框 void CFaDlgockMatlabFigure(mwArray mwhFigure,CWnd *pParentWnd) { mwArray mwFigName=get(mwhFigure,mwArray("name")); char *pCharFigureName=strdup((char*)(mwFigName.ToString())); HWND hFig = ::FindWindow(NULL,pCharFigureName); if(hFig == NULL) { AfxMessageBox("未能产生 Figure 窗口,图形绘制失败!"); return; } // 去掉 Figure 窗口的标题栏和边框 long
lStyle = ::GetWindowLong(hFig,GWL_STYLE); ::SetWindowLong(hFig,GWL_STYLE,lStyle &; (~WS_CAPTION) &; (~WS_THICKFRAME)); ::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE |
SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); // 获取绘图区域