广告招募

研究和实现Visual C++的动态控制

2026年03月16日 09:06:00      来源:东莞市宇匠数控设备有限公司 >> 进入该公司展台      阅读量:2

分享:


动点坐标XY坐标对t的积分, YX坐标对t的积分。因此, 由ΔX的叠加产生的溢出去进给Y 由ΔY的叠加产生的溢出去进给X。圆弧积分器的原理图如图2所示[1]

求积前, Xi Yi中预置圆弧的起点坐标X0 Y0 并作左移规格化处理。叠加过程中, 每进给一步动点坐标应作相应的修改, 即: Xi±1XiYi±1Yi。修改中是作加l还是减1的运算应当视圆弧所处的象限而定。


具体方法是, 设置JVx JVy为积分函数寄存器, JRx JRy为余数寄存器。在起点时, JVxJvy分别寄存起始坐标X0 Y0,对于象限逆圆来说, 在插补过程中, JRy每溢出一个Δy脉冲, JVx应该加1 JRx每溢出一个Δx脉冲, JVy应减1。对于其他各种情况的DDA法圆弧插补, JVxJvy是加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/


版权与免责声明:
1.凡本网注明"来源:全球供应商网"的所有作品,版权均属于全球供应商网,转载请必须注明全球供应商网。违反者本网将追究相关法律责任。
2.企业发布的公司新闻、技术文章、资料下载等内容,如涉及侵权、违规遭投诉的,一律由发布企业自行承担责任,本网有权删除内容并追溯责任。
3.本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。 4.如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系。