當前位置:編程學習大全網 - 編程語言 - 線性規劃怎麽做?

線性規劃怎麽做?

CDC類不是有現成的功能嗎?

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);

}

}

  • 上一篇:單雙休有什麽利弊,如何取舍?
  • 下一篇:三年級計劃表怎麽做?
  • copyright 2024編程學習大全網