技術(shù)文章
研究和實現(xiàn)Visual C++的動態(tài)控制
閱讀:177 發(fā)布時間:2020-8-12
動點坐標(biāo)X是Y坐標(biāo)對t的積分, 而Y是X坐標(biāo)對t的積分。因此, 由ΔX的疊加產(chǎn)生的溢出去進(jìn)給Y; 由ΔY的疊加產(chǎn)生的溢出去進(jìn)給X。圓弧積分器的原理圖如圖2所示[1]。
求積前, Xi、 Yi中預(yù)置圓弧的起點坐標(biāo)X0、 Y0, 并作左移規(guī)格化處理。疊加過程中, 每進(jìn)給一步動點坐標(biāo)應(yīng)作相應(yīng)的修改, 即: Xi±1→Xi或Yi±1→Yi。修改中是作加l還是減1的運算應(yīng)當(dāng)視圓弧所處的象限而定。
具體方法是, 設(shè)置JVx、 JVy為積分函數(shù)寄存器, JRx、 JRy為余數(shù)寄存器。在起點時, JVx和Jvy分別寄存起始坐標(biāo)X0、 Y0,對于第一象限逆圓來說, 在插補過程中, JRy每溢出一個Δy脈沖, JVx應(yīng)該加1; JRx每溢出一個Δx脈沖, JVy應(yīng)減1。對于其他各種情況的DDA法圓弧插補, JVx和Jvy是加1還是減1, 取決于動點坐標(biāo)所在象限及圓弧走向[2]。
對不同象限坐標(biāo)修正見表1。
2.2 程序?qū)崿F(xiàn)
給類CCircleView增加數(shù)據(jù)成員:
CPoint endPoint; //起點 (點1)
CPoint startPoint; //終點 (點2)
int m[20000][2]; //存儲動點坐標(biāo)的二維數(shù)組
給類CCircleView增加成員函數(shù):
void change(int x, int *a); //為二維數(shù)組賦值
在change()成員函數(shù)中設(shè)置部分變量:
int sumx; //x坐標(biāo)累加器
int sumy; //y坐標(biāo)累加器
int q; //累加器容量
int flag; //是否溢出標(biāo)志
int xi,yi; //x,y坐標(biāo)值
以下給出部分程序代碼。
用DDA法實現(xiàn)圓的插補—確定各動點的坐標(biāo), 并存儲在
二維數(shù)組m[][]中:
void CCircleView::change(int x, int *a)
{ int sumx,
int xi,yi;
sumx=0;
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;
if(sumx>=q)
{ yi++; m[j][1]=yi; m[j][0]=xi; sumx-=q; flag=1; }
if(
{ xi--; m[j][0]=xi; m[j][1]=yi;
if(flag==1) j++;
}
*a=j-1;
}
鼠標(biāo)左鍵拖動后松開觸發(fā)OnLButtonUp成員函數(shù)代碼[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 系統(tǒng)運行的結(jié)果
系統(tǒng)采用Visual C++6.0可視化開發(fā)工具編程, 實現(xiàn)了直線和圓弧插補算法。圓弧插補算法編譯運行后的仿真結(jié)果如圖4所示。
本文由 伯特利數(shù)控文章 整理發(fā)表,文章來自網(wǎng)絡(luò)僅參考學(xué)習(xí),本站不承擔(dān)任何法律責(zé)任。
/bethel/news/