1、CAD工程名称:CAD工程作者:杨志(信计 0701)主要功能:1、在顶视图(XY 平面)画 4 个圆,在每一个圆上取 36 个控制点,在每个圆取一个相应点,利用样条插值获取 31 个点(含之前的 4 个点) ,画出三维图像。2、利用 STL 的栈,实现撤消和返回的功能。工程简介:顶视图画圆:1.pDoc-RNum 记录圆的个数,当圆的个数小于等于 4 时 OnLButtonDown 获取圆心位置存放在 Point3 roundpoint4中。2.OnLButtonUp 获取点 point,求出半径 float radius4;每隔 10 度获取一个控制点,存放在 CArray PtDate
2、中。3.获取壶嘴。画完 4 个圆之后,OnLButtonDblClk 选中第四个圆的一个控制点,OnLButtonDown 获取壶嘴的位置。左视图:每画完一个圆,左视图 DrawLeft()画出此圆的 36 个控制点,OnLButtonDown 选中一个圆的 36 个控制点,OnMouseMove 移动鼠标,OnLButtonUp 获取移动后的位置,PtDate把原来的点改成新的点坐标,在前视图,顶视图和三维视图根据新的点重新画图。前视图:(同左视图)撤消操作:Mesh 中声明 Round 类,如下:class Roundpublic: CArray ptarrray;Point3 round
3、point4; /圓心float radius4; /半径int roundNum; /圆的个数int roundNo; /圆的编号BOOL ISOVER;Round()for (int i=0;i roundStack,用于存放每次操作的点。在画圆过程 OnLButtonUp把 PtDate 的点 COPY()到栈中,在画壶嘴时把点 COPY()到栈中。单击撤消按钮时执行下面函数:void CMy3DMAXDoc:OnBack() / TODO: Add your command handler code hereif (mesh.roundStack.size()=1)AfxMessage
4、Box(“已空!“);return;else if (!mesh.roundStack.empty()/将要弹出的 round 保存到 redoStack 中Round roundPop=mesh.roundStack.top();mesh.redoStack.push(roundPop);/mesh.roundStack.pop();if(mesh.roundStack.empty()AfxMessageBox(“已空!“);return;Round round=mesh.roundStack.top();mesh.ClearbsData();ISOVER=round.ISOVER;RNum
5、=round.roundNum;RNo=round.roundNo;for(int a=0;a4;a+)mesh.roundpointa=round.roundpointa;mesh.radiusa=round.radiusa;mesh.PtDate.RemoveAll();mesh.PtDate.Copy(round.ptarrray);UpdateAllViews(NULL);单击返回按钮时进行下面函数void CMy3DMAXDoc:OnRedo() / TODO: Add your command handler code hereif(mesh.redoStack.empty()re
6、turn;else if (!mesh.redoStack.empty()/将要弹出的 round 保存到 roundStack 中/ Round roundPop=mesh.redoStack.top();/ mesh.roundStack.push(roundPop);/ mesh.redoStack.pop();/ if(mesh.redoStack.empty()/ / AfxMessageBox(“已空!“);/ return;/ Round round=mesh.redoStack.top();mesh.roundStack.push(round);mesh.redoStack.p
7、op();mesh.ClearbsData();ISOVER=round.ISOVER;RNum=round.roundNum;RNo=round.roundNo;for(int a=0;a4;a+)mesh.roundpointa=round.roundpointa;mesh.radiusa=round.radiusa;mesh.PtDate.RemoveAll();mesh.PtDate.Copy(round.ptarrray);UpdateAllViews(NULL);Mesh 类 :void DrawTop(CDC* pDC,float scale); /画顶视图void DrawLe
8、ft(CDC* pDC,float scale); /画左视图 void DrawFront(CDC* pDC,float scale); /画前视图void BSpline(Point3 a,Point3 b,Point3 c,Point3 d,float sx30,float sy30,float sz30);/根据四个点获取样条插值函数点void DarwMesh() /画网格void DrawEdges() /画面样条插值函数void Mesh:BSpline(Point3 a,Point3 b,Point3 c,Point3 d,float sx31,float sy31,float
9、 sz31)float X4,Y4,Z4,s4;X0=a.x;X1=b.x;X2=c.x;X3=d.x;Y0=a.y;Y1=b.y;Y2=c.y;Y3=d.y;Z0=a.z;Z1=b.z;Z2=c.z;Z3=d.z;s1=(Y2-Y0)/2.0;s2=(Y3-Y1)/2.0;s0=(3*(Y1-Y0)-s1)/2.0;s3=(3*(Y3-Y2)-s2)/2.0;for(int k=0;k3;k+)float a,b,c,d,s1,s2;d=Yk;s1=sk;s2=sk+1;c=s1;a=s2+s1-2*(Yk+1-Yk);b=3*(Yk+1-Yk)-2*s1-s2;for(int i=0;i1
10、1;i+)float t=i/10.0;syk*10+i=a*t*t*t+b*t*t+c*t+d;s1=(X2-X0)/2.0;s2=(X3-X1)/2.0;s0=(3*(X1-X0)-s1)/2.0;s3=(3*(X3-X2)-s2)/2.0;for(k=0;k3;k+)float a,b,c,d,s1,s2;d=Xk;s1=sk;s2=sk+1;c=s1;a=s2+s1-2*(Xk+1-Xk);b=3*(Xk+1-Xk)-2*s1-s2;for(int i=0;i11;i+)float t=i/10.0;sxk*10+i=a*t*t*t+b*t*t+c*t+d;s1=(Z2-Z0)/2.0
11、;s2=(Z3-Z1)/2.0;s0=(3*(Z1-Z0)-s1)/2.0;s3=(3*(Z3-Z2)-s2)/2.0;for(k=0;k3;k+)float a,b,c,d,s1,s2;d=Zk;s1=sk;s2=sk+1;c=s1;a=s2+s1-2*(Zk+1-Zk);b=3*(Zk+1-Zk)-2*s1-s2;for(int i=0;i11;i+)float t=i/10.0;szk*10+i=a*t*t*t+b*t*t+c*t+d;整个窗口 W=1064; H=706其中 4 个 View W=400 H=300对话框 W=250, H=607(可知分界线的宽度为 7,菜单栏+工具栏+状态栏高度为 99)