研究和实现Visual C++的动态控制
动点坐标X是Y坐标对t的积分, 而Y是X坐标对t的积分。因此, 由ΔX的叠加产生的溢出去进给Y; 由ΔY的叠加产生的溢出去进给X。圆弧积分器的原理图如图2所示[1]。求积前, Xi、 Yi中预置圆弧的起点坐标X0、 Y0, 并作左移规格化处理。叠加过程中, 每进给一步动点坐标应作相应的修改, 即: Xi±1→Xi或Yi±1→Yi。修改中是作加l还是减1的运算应当视圆弧所处的象限而定。具体方法是, 设置JVx、 JVy为积分函数寄存器, JRx、 JRy为余数寄存器。在起点时, JVx和Jvy分别寄存起始坐标X0、 Y0,对于第一象限逆圆来说, 在插补过程中, JRy每溢出一个Δy脉冲, JVx应该加1; JRx每溢出一个Δx脉冲, JVy应减1。对于其他各种情况的DDA法圆弧插补, JVx和Jvy是加1还是减1, 取决于动点坐标所在象限及圆弧走向[2]。对不同象限坐标修正见表1。2.2 程序实现给类CCircleView增加数据成员:CPoint endPoint; //起点 (点1)CPoint startPoint; //终点 (点2)int m[20000][2]; //存储动点坐标的二维数组给类CCircleView增加成员函数:void change(int x, int *a); //为二维数组赋值在change()成员函数中设置部分变量:int sumx; //x坐标累加器int sumy; //y坐标累加器int q; //累加器容量int flag; //是否溢出标志int xi,yi; //x,y坐标值以下给出部分程序代码。用DDA法实现圆的插补—确定各动点的坐标, 并存储在二维数组m[][]中:void CCircleView::change(int x, int *a){ int sumx, sumy, q, j, flag;int xi,yi;sumx=0; sumy=0; j=1;xi=x; yi=0;q=4096;for(j=1; j<=q; j++){ m[j][0]=0; m[j][1]=0; }j=1;while(xi>0){ sumx+=xi; sumy+=yi; flag=0;if(sumx>=q){ yi++; m[j][1]=yi; m[j][0]=xi; sumx-=q; flag=1; }if(sumy>=q){ xi--; m[j][0]=xi; m[j][1]=yi; sumy-=q; flag=1; }if(flag==1) j++;}*a=j-1;}鼠标左键拖动后松开触发OnLButtonUp成员函数代码[3]:void CCircleView::OnLButtonUp(UINT nFlags, CPoint point){ blsDown=false;CClientDC dc(this);dc.Ellipse(&rect);int center_x=(startPoint.x+endPoint.x)/2, center_y=(startPoint.y+endPoint.y)/2;double r=sqrt(abs((endPoint.x-startPoint.x)*(endPoint.x-startPoint.x))+abs((endPoint.y-startPoint.y)*(endPoint.y-startPoint.y)))/2;int x0=center_x+0, y0=center_y+0;int *num,b,i; num=&b;change(r,num);m[0][0]=r; m[0][1]=0; CClientDC dc1(this);CPen pen(PS_SOLID,1,RGB(0,255,255));dc1.SelectObject(&pen);dc1.MoveTo(x0+r,y0) ;//第一象限for(i=1;i<=*num;i++){ dc1.LineTo(x0+m[i][0],y0+m[i][1]);for(long j=0; j<=999999; j++);}//第二象限for(i=*num; i>=0; i--){ dc1.LineTo(x0-m[i][0],y0+m[i][1]);for(long j=0; j<=999999; j++);}//第三象限for(i=0; i<=*num; i++){ dc1.LineTo(x0-m[i][0],y0-m[i][1]);for(long j=0; j<=999999; j++);}//第四象限for(i=*num; i>=0; i--){ dc1.LineTo(x0+m[i][0],y0-m[i][1]);for(long j=0; j<=999999; j++);}CView::OnLButtonUp(nFlags, point);}2.3 系统运行的结果系统采用Visual C++6.0可视化开发工具编程, 实现了直线和圆弧插补算法。圆弧插补算法编译运行后的仿真结果如图4所示。本文由海天精工文章整理发表,文章来自网络仅参考学习,本站不承担任何法律责任。//hjlmptdlw.com/
- wnsr888手机版相关的文章
- 发表留言
-
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。