CDC * PDC = CDC::from handle(hdc);
PDC->;move to(PS);
PDC->;line to(PE);
以下是壹段引文:
直線段的掃描轉換算法
1數值微分(DDA)方法
我的理解是壹個坐標軸是步長值(增量是1),另壹個坐標是基於直線的斜率(k)。
增量,然後四舍五入計算機確定每個點的坐標。
具體算法(我用OPENGL模擬)
void setPixel(閃爍xCoord,閃爍yCoord)
{
GL begin(GL _ POINTS);
glVertex2i(xCoord,yCoord);
glEnd();
}
內聯整數舍入(常量浮點a)
{
return int(a+0.5);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx = xEnd - x0,dy = yEnd - y0,步數,k;
float xIncrement,yIncrement,x = x0,y = y0
if(abs(dx)>abs(dy))
{
步驟= ABS(dx);
}
其他
{
步驟= ABS(dy);
}
Xin crement = float(dx)/float(steps);
yin crement = float(dy)/float(steps);
setPixel(round(x),round(y));
for(k = 0;k & lt步驟;k++)
{
x+= Xin crement;
y+= yin crement;
setPixel(round(x),round(y));
}
}
2中點畫線法
同樣,我理解的算法是取壹個有多個增量的坐標軸作為步長值(1),而另壹個坐標
值是1還是不變,取決於這兩個坐標值的中點是在這條直線的上面還是下面。
具體算法如下:
void lineMiddle(int x0,int y0,int xEnd,int yEnd)
{
int a,b,c,d1,d2,d;
a = y0-yEnd;
b = xEnd-x0;
d = 2 * a+b;//判別檢驗(2a+b為初始值)
d 1 = 2 * a;//直線下方中點的增量值
D2 = 2 * a+b;//真實直線上方中點的增量值
int x,y;
x = x0y = y0
setPixel(x,y);
while(x & lt;xEnd)
{
if(d & lt;0)//中點在直線下方。
{
x++;
y++;
d+= D2;
}
Else//中點在直線上方。
{
x++;
d+= d 1;
}
setPixel(x,y);
}
}
3.Bresenham畫線算法程序;
用壹個坐標軸作為步長值(即+1),另壹個坐標軸是否加1是根據斜率(k),k決定的。
如果大於0.5,則加+1,如果小於0.5,則保持不變。為了計算方便,如果d大於1,
然後減壹,歸零。設e,e=d-0.5,所以有e >;0,加1,e
在硬件實現上。
該算法實現如下:
void lineBresenham(int x0,int y0,int x1,int y1)
{
int x,y,dx,dy;
浮點k,e;
dx = x 1-x0;
dy = y 1-y0;;
k =(float)dy/dx;
e =-0.5;
x = x0
y = y0
setPixel(x,y);
for(int I = 0;我& ltdx;i++)
{
x = x+1;
e = e+k;
如果(e & gt=0)
{
y++;
e = e-1;
}
setPixel(x,y);
}
}