您好,欢迎访问一九零五行业门户网

研究和实现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所示。
本文由 伯特利数控文章 整理发表,文章来自网络仅参考学习,本站不承担任何法律责任。
/bethel/news/
其它类似信息

推荐信息