畫線演算法
Ⅰ bresenham畫線演算法與計算機圖形學畫線演算法有什麼不同
計算機圖形學畫線演算法很多,有DDA演算法、逐點比較法、Bresenham演算法等,Bresenham演算法是最著名的,而且演算法中只用到了加法和移位運算,沒有浮點數,沒有乘除法,所以執行速度最快。
Ⅱ 劃線演算法 原理
1.這不是新的演算法,它和我們的乘法豎式其實是一樣的
2.算交點數就能得出乘法的結果,這不奇怪,
從最簡單的乘法看,比如1x3=3
你在橫向劃一條線,縱向劃三條線,交點數當然是3個
再比如2x3=6
你在橫向劃兩條線,縱向劃三條線,交點數當然是6個,不信,你可以數。
原因是:橫向一條線,與縱向三條線,交點數是3個;
而現在,橫向有兩條線,所以交點數有2x3個,也就是6個
這是一位數的乘法,已經清楚了。
但對於多位數的呢,也可以用和上面一樣的方法,橫向劃一組線,縱向劃一組線,然後數交點數,對於比較大的數,恐怕大家沒耐心把點數完。
3.對於多位數的乘法,用視頻中的劃線法,其實和我們的乘法豎式其實是一樣的。
視頻的例子:21x13=273
乘法豎式:
21
x13
----
63
21
----
273
我們在視屏中,看到有數出:2,1,6,3這么些點數,並且把6和1相加變成7放到了結果中。
而在以上乘法豎式中,也有2,1,6,3這么些數字,並且也是把6和1相加變成7放到了結果中。
視頻的例子:123x321=39483
乘法豎式:
123
x321
-------
123
246
369
-------
39483
我們在視屏中,看到有把點數:1,4,9相加得出14,而14中的這個1被進到前面一位去了;
而在以上乘法豎式中,也有把數字:1,4,9相加得出14,而14中的這個1被進到前面一位去。
Ⅲ 求長方形之間的畫線演算法
長方形之間的畫線是怎麼畫的?都不明白樓主想畫什麼線.
Ⅳ 如何用Java實現DDA畫線演算法,逐點畫線演算法,BRESENHAM畫線演算法
C++ JAVA 或其它語言, 他們的+-*/ if else while 這些都幾乎一樣, API和數據類型有差異, 但不影響讀懂演算法,還是去試著看懂吧,
而且我搜了一下, 網上有很多這些演算法的文字描述, 理解起來不難;
研究演算法還是自己動手吧;
LZ加油;
Ⅳ Bresenham畫線演算法
基本上Bresenham畫線演算法的思路如下:
//
假設該線段位於第一象限內且斜率大於0小於1,設起點為(x1,y1),終點為(x2,y2).
//
根據對稱性,可推導至全象限內的線段.
1.畫起點(x1,y1).
2.准備畫下個點。x坐標增1,判斷如果達到終點,則完成。否則,由圖中可知,下個要畫的點要麼為當前點的右鄰接點,要麼是當前點的右上鄰接點.
2.1.如果線段ax+by+c=0與x=x1+1的交點的y坐標大於M點的y坐標的話,下個點為U(x1+1,y1+1)
2.2.否則,下個點為B(x1+1,y1+1)
3.畫點(U或者B).
4.跳回第2步.
5.結束.
這里需要細化的是怎麼判斷下個要畫的點為當前點的右鄰接點還是當前點的右上鄰接點.
設線段方程:ax+by+c=0(x1<x<x2,y1<y<y2)
令dx=x2-x1,dy=y2-y1
則:斜率-a/b
=
dy/dx.
從第一個點開始,我們有F(x,1,y1)
=
a*x1+b*y1+c=0
下面求線段ax+by+c=0與x=x1+1的交點:
由a*(x1+1)+b*y+c
=
0,
求出交點坐標y=(-c-a(x1+1))/b
所以交點與M的y坐標差值Sub1
=
(-c-a(x1+1))/b
-
(y1+0.5)
=
-a/b-0.5,即Sub1的處始值為-a/b-0.5。
則可得條件當
Sub1
=
-a/b-0.5>0時候,即下個點為U.
反之,下個點為B.
代入a/b,則Sub1
=
dy/dx-0.5.
因為是個循環中都要判斷Sub,所以得求出循環下的Sub表達式,我們可以求出Sub的差值的表達式.下面求x=x1+2時的Sub,即Sub2
1.如果下下個點是下個點的右上鄰接點,則
Sub2
=
(-c-a(x1+2))/b
-
(y1+1.5)
=
-2a/b
-
1.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
1.5
-
(-a/b-0.5)
=
-a/b
-
1.代入a/b得Dsub
=
dy/dx
-1;
2.如果下下個點是下個點的右鄰接點,
Sub2
=
(-c-a(x1+2))/b
-
(y1+0.5)
=
-2a/b
-
0.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
0.5
-
(-a/b-0.5)
=
-a/b.
代入a/b得Dsub
=
dy/dx;
於是,我們有了Sub的處始值Sub1
=
-a/b-0.5
=
dy/dx-0.5,又有了Sub的差值的表達式Dsub
=
dy/dx
-1
(當Sub1
>
0)或
dy/dx(當Sub1
<
0).細化工作完成。
於是pcode可以細化如下:
//
Pcode
for
Bresenham
Line
//
By
SoRoMan
x=x1;
y=y1;
dx
=
x2-x1;
dy
=
y2-y1;
Sub
=
dy/dx-0.5;
//
賦初值,下個要畫的點與中點的差值
DrawPixel(x,
y);
//
畫起點
while(x<x2)
{
x++;
if(Sub
>
0)
//
下個要畫的點為當前點的右上鄰接點
{
Sub
+=
dy/dx
-
1;
//下下個要畫的點與中點的差值
y++;
//
右上鄰接點y需增1
}
else//
下個要畫的點為當前點的右鄰接點
{
Sub
+=
dy/dx;
}
//
畫下個點
DrawPixel(x,y);
}
PS:一般優化:
為避免小數轉整數以及除法運算,由於Sub只是用來進行正負判斷,所以可以令Sub
=
2*dx*Sub
=
2dy-dx,則
相應的DSub
=
2dy
-
2dx或2dy.
思考1:如果Sub
=
0時,會產生取兩個點都可以的問題。這個問題還沒深入。
Ⅵ Bresenham openGL畫線演算法
建議把環境配置的語句弄上來,畫不出來不一定是演算法問題。OPENGL有很多錯誤都是黑屏,看不到想要的畫面
Ⅶ 用C++如何實現bresenham畫線演算法計算機圖形學上面有個drawpixel的函數。不知道怎麼用。
drawpixel()函數這就是VC畫點的,不同的平台由不同的函數來畫點,這個是API函數不管什麼平台歸結到底都是調用這個函數來畫點。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);
Ⅷ 圖形學中的中點畫線法與Bresenham演算法畫線的區別
個人認為最關鍵的區別就是那個決策參數的計算方式!
在Bresenham演算法中,假設我們在(x0,y0)處畫了一個點,那我們就要決定下一個點是在(x0+1,y0)還是在(x0+1,y0+1)處畫,這兩個點一般都不在直線上,我們要計算這兩個點離直線有多遠,分別設兩個點離直線的距離為p1、p2,然後決策參數就是p=p2-p1,再根據p的符號來判斷選擇哪個點
至於中點法,我沒有用它來畫過直線,只用來畫過圓(自我感覺畫圓用這個演算法比Bresenham演算法要好很多),但原理應該差不多!
在中點演算法中,決策參數的就是方式就是圓的方程(換成直線就是直線的方程了),比如要畫x^2+y^2=r^2的圓,那決策參數p=x^2+y^2-r^2,然後就不是代入上面找到的兩個點直接代進去,而是代這兩個點的中點進去,求出p的值,根據p的符號來判斷那個中點是在圓上、圓內還是圓外,再進一步決定選擇繪哪個點!
具體的計算過程沒辦法在這里完整演示,但個人認為不同之處還是在於決策參數的選擇與計算
Ⅸ bresenham畫線演算法
用MFC還要bresenham幹嘛