中點畫線法 收藏
演算法目的:畫一條直線
演算法思想:
判斷兩個畫素點的重點是在直線的下方,上方還是直線上,從而確定該選擇那乙個畫素點。
線內: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...