中點畫線法

2021-05-22 02:44:19 字數 2673 閱讀 5514

中點畫線法 收藏

演算法目的:畫一條直線

演算法思想:

判斷兩個畫素點的重點是在直線的下方,上方還是直線上,從而確定該選擇那乙個畫素點。

線內:f(x,y) ==0;

上方:f(x,y) > 0;

下方:f(x,y) < 0;

證明:若是畫素點在直線上,則肯定滿足直線方程,則將畫素點(x0,y0)帶入方程得:

ax0 + by0 + c = 0;

由於直線下方的點在和直線上的點的x座標相同時,其縱座標小於直線上的點:

故ax0 + by + c  < 0;(y < y0);

同理:直線上方的點(x0,y),ax0 + by + c > 0; (y > y0);

尋找中點:

當|k| < 1 && k > 0時;

由於此時,橫座標的變化速度大於縱座標,故此時我們以橫座標的變化為基準.

取直線上任意一點(xp,yp).這一點已確定作為直線上的一點,那麼我們在確定一下點時,就應該尋找(xp+1,yp),(xp+1,yp+1)兩個畫素點的中點(xp+1,yp+0.5);並判斷該點是處於直線的那個方向:

直線上:可以兩點任意一點。

上方: 取(xp+1,yp);

下方: 取(xp+1,yp+1);

如何判斷該點在直線的那個方向呢?

由上述表述可知:

線內:f(x,y) ==0;

上方:f(x,y) > 0;

下方:f(x,y) < 0;

故我們只需把該店帶入方程,並判斷方程的正負即可:

d0 = a(xp+1) + b(yp+0.5) + c

--->  d0 = axp + byp + c + a + 0.5b;

若我們令: d = axp + byp + c;

則: d0 = d + a + 0.5b;

現在我們只需判斷d0的正負即可判斷點在直線的方向,從而就可以確定該選擇點(xp+1,yp),還是點(xp+1,yp+1);

若d0 < 0;--->(xp+1,yp+1);

若d0 > 0;--->(xp+1,yp);

若d0==0;--->兩者均可.

現在分別討論下每種情況:

d0 < 0; ---->(xp+1,yp+1)

我們來算一下下個中點的值:

下乙個中點應該為:(xp+2,yp+1.5);

d1 = a(xp+2) + b(yp+1.5) + c;

---> d1 = axp + byp + c + 2a + 1.5b;

---> d1 = axp + byp + c + a + 0.5b + a + b;

---> d1 = d0 + a + b;

我們可以看出當d0 < 0時,下乙個中點的增量為 a+b.故我們可以通過增量計算下乙個中點,而不用再通過座標重新計算中點值了;

d0 > 0; ---> (xp+1,yp);

我們算下這種情況下的中點值:

下乙個中點應該為:(xp+2,yp+0.5)

d2 = a(xp+2) + b(yp+0.5) + c;

---> d2 = axp + byp + c + 2a + 0.5b;

---> d2 = d + a + 0.5b + a;

---> d2 = d0 + a;

我們可以看出當d0 > 0時,下乙個中點的增量為 a,故我們可以通過+a得到下乙個中點值.

當d0 == 0;時,由於選擇哪種情況都可以,故我們可以把它放入上面任意一種情況之中.

我們在看一下d0值.

d0 = d + a + 0.5b;

由於 d = axp + byp + c;

且點(xp,yp)在直線上,所以d == 0;所以我們判斷d0的正負只需判斷a + 0.5b的正負即可,而我們再求下乙個中點的值來判斷正負時,只需加上增量,來判斷相加之後的值的正負即可.

|k| >= 1;時同理.

演算法開始:

我們假設從(x0,y0)開始畫直線:由於(x0,y0)在直線上.

故: ax0 + by0 + c = 0;

則d0 = a + 0.5b.由於我們使用的只是d的符號,而增量都是整數,故我們可以用2d來代替d來擺脫浮點數。

故 d = 2a + b; d1 = 2(a+b); d2 = 2a;

我們該如何計算a,b的值呢?

下面我們將畫線已知的兩點(x0,y0),(x1,y1)帶入直線方程:ax + by + c = 0;得:

a / b = y0 - y1/ x1 - x0;

現在我們將直線方程變形一下:

y = -a/b x - c/b;

由此可知,只要a/b c/b的值確定後,直線方程就確定了,a,b是何值無關緊要只要滿足a/b的值即可.

故我們可以令:

a = y0 - y1; b = x1 - x0;

演算法思想基本上算是分析完成了。該開始寫**了。基本上都是思想容易,想轉換為正確的**就難了:為了寫出正確的**,我們現在理一下思路,我們應該把直線分為幾種情況呢?

應該有四種情況:

因為直線的斜率絕對值是否大於1,以及直線的斜率是否大於0 都將會影響到我們的演算法:

故我們這樣分類:

① 0 < k < = 1

② k > 1

③ -1 < k <= 0

④ k <= -1;

好的,我們想在思路應該是更清晰一步了,我們只需對各個分類進行處理就好了。

mfc DDA演算法 中點畫線演算法函式

直線的端點座標 x0,y0 x1,y1 void cquhongjuanview draw line dda cdc pdc,int x0,int x1,int y0,int y1 double y y0 for int x x0 x x1 x double x x0 for int y y0 y ...

彙編 畫點 畫線

先設定螢幕顯示模式 640 480 16 再採用描點畫圖,通過int10中斷來描點畫 mov ah,0 mov al,12h 640 480 16int 10h畫乙個點 通過巨集,將相關引數可以直接傳入 一條語句中,分別傳入頁面 y座標 x座標 顏色,通過將ah放入0ch,通過10h中斷來描點 wr...

中點bresenham演算法畫線

要求 使用中點bresenham演算法繪製任意斜率的直線。可用滑鼠左鍵繪製直線 左鍵按下點為起點,彈起點為終點 新建mfc專案 畫線需要滑鼠響應,所以在view類中新增onlbuttonup和onlbuttondown來進行滑鼠訊息的處理 方法 滑鼠右擊檢視類 如cmymouseview 選擇 ad...