導航:首頁 > 源碼編譯 > dda演算法畫直線

dda演算法畫直線

發布時間:2022-05-28 16:56:14

Ⅰ DDA演算法:如何畫出斜率大於1的直線

下面是我編寫的一個在12864上畫線的函數,可以畫任意方向的線段。但先要有一個畫點函數:Lcd_PutPixel(x,y,1)。
line(int x0,int y0,int x1,int y1)
{
int i,dx,dy,e,x,y;
Lcd_PutPixel(x0,y0,1);
Lcd_PutPixel(x1,y1,1);
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
if(dx>0&&dy>0)
{
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x++;
e=e+2*dy;
if(e>=0)
{
y++;
e=e-2*dx;
}
}
}
else
{
e=-dy;
x=x0;
y=y0;
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y++;
e=e+2*dx;
if(e>=0)
{
x++;
e=e-2*dy;
}
}
}
}
if(dx<0&&dy<0)
{
dx=x0-x1;
dy=y0-y1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x--;
e=e+2*dy;
if(e>=0)
{
y--;
e=e-2*dx;
}
}
}
else
{
e=-dy;
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y--;
e=e+2*dx;
if(e>=0)
{
x--;
e=e-2*dy;
}
}
}
}
if(dx>0&&dy<0)
{
dy=y0-y1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x++;
e=e+2*dy;
if(e>=0)
{
y--;
e=e-2*dx;
}
}
}
else
{
e=-dy;
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y--;
e=e+2*dx;
if(e>=0)
{
x++;
e=e-2*dy;
}
}
}
}
if(dx<0&&dy>0)
{
dx=x0-x1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x--;
e=e+2*dy;
if(e>=0)
{
y++;
e=e-2*dx;
}
}
}
else
{
e=-dy;
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y++;
e=e+2*dx;
if(e>=0)
{
x--;
e=e-2*dy;
}
}
}
}
if(dx!=0&&dy==0)
{
if(dx>0)
{
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x++;
}
}
else
{
dx=x0-x1;
for(i=0;i<dx;i++)
{
Lcd_PutPixel(x,y,1);
x--;
}
}
}
if(dx==0&&dy!=0)
{
if(dy>0)
{
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y++;
}
}
else
{
dy=y0-y1;
for(i=0;i<dy;i++)
{
Lcd_PutPixel(x,y,1);
y--;
}
}
}
}

Ⅱ dda畫直線演算法matlab

function DDA(x1,y1,x2,y2,color)length =abs(x2-x1);
if abs(y2-y1)>length
length=abs(y2-y1);
end
dx=(x2-x1)/length;
dy=(y2-y1)/length;
x=x1+0.5*sign(dx);
y=y1+0.5*sign(dy);
hold on
for i=1:length
plot(round(x),round(y),'Color',color)
x=x+dx;
y=y+dy;
end
hold offend

Ⅲ 計算機圖形學:Matlab編程畫直線(DDA演算法)

function DDA(x1,y1,x2,y2,color)

length =abs(x2-x1);
if abs(y2-y1)>length
length=abs(y2-y1);
end
dx=(x2-x1)/length;
dy=(y2-y1)/length;
x=x1+0.5*sign(dx);
y=y1+0.5*sign(dy);
hold on
for i=1:length
plot(round(x),round(y),'Color',color)
x=x+dx;
y=y+dy;
end
hold off
end

Ⅳ VC++怎麼實現用戶給出兩點,用DDA演算法連成線段

在你的CXXXview類上右鍵 添加成員函數類型void 函數名DDALine(參數是兩個點的xy坐標 還有顏色值RGB 一共五個參數)
再次滑鼠右鍵CXXXView添加成員變數 參數兩個點的坐標 四個參數 都是float 公有成員public
如果直接在窗體里根據已知參數話直線的話 把你的代碼放在OnDraw()函數里
如果用滑鼠操作的話 那你要添加windows消息 按快捷鍵ctrl+w 類向導找到你的CXXXView在消息里添加WM_OnLButtonDown(滑鼠按下) WM_OnMouseMove(滑鼠移動) WM_OnButtonUp(滑鼠抬起) 並設置一個BOOL變數控制畫線
在OnLButtonDown里傳遞參數point.x point.y等於初始點xy坐標 bool量=true
OnMouseMove里的point是第二坐標的xy
OnButtonUp bool量等於false

Ⅳ 分別解釋直線生成演算法DDA法、中點畫線法和Bresenham法的基本原理

DDA稱為數值微分畫線演算法,是直線生成演算法中最簡單的一種。原理相當簡單,就是最直觀的根據斜率的偏移程度,決定是以x為步進方向還是以y為步進方向。然後在相應的步進方向上,步進變數每次增加一個像素,而另一個相關坐標變數則為Yk_1=Yk+m(以x為步進變數為例,m為斜率)
假定直線斜率k在0~1之間,當前象素點為(xp,yp),則下一個象素點有兩種可選擇點P1(xp+1,yp)或P2(xp+1,yp+1)。若P1與P2的中點(xp+1,yp+0.5)稱為M,Q為理想直線與x=xp+1垂線的交點。當M在Q的下方時,則取P2應為下一個象素點;當M在Q的上方時,則取P1為下一個象素點。這就是中點畫線法的基本原理

Bresenham:過各行、各列像素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線各垂直網格線的交點,然後確定該列像素中與此交點最近的像素。該演算法的優點在於可以採用增量計算,使得對於每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素。

大概就是這樣,預知詳細,可以參考圖形學的書籍

Ⅵ 根據dda畫直線演算法,編一程序求(0,0)到(4,12)

摘要 DDA-line(x1,y1,x2,y2,color)

Ⅶ 求計算機圖形學中的直線繪制函數法、DDA演算法、中點法和Bresenham演算法的優缺點以及比較.

DDA稱為數值微分畫線演算法,是直線生成演算法中最簡單的一種.原理相當簡單,就是最直觀的根據斜率的偏移程度,決定是以x為步進方向還是以y為步進方向.然後在相應的步進方向上,步進變數每次增加一個像素,而另一個相關坐標變數則為Yk_1=Yk+m(以x為步進變數為例,m為斜率)假定直線斜率k在0~1之間,當前象素點為(xp,yp),則下一個象素點有兩種可選擇點P1(xp+1,yp)或P2(xp+1,yp+1).若P1與P2的中點(xp+1,yp+0.5)稱為M,Q為理想直線與x=xp+1垂線的交點.當M在Q的下方時,則取P2應為下一個象素點;當M在Q的上方時,則取P1為下一個象素點.這就是中點畫線法的基本原理Bresenham:過各行、各列像素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線各垂直網格線的交點,然後確定該列像素中與此交點最近的像素.該演算法的優點在於可以採用增量計算,使得對於每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素.大概就是這樣,預知詳細,

Ⅷ 計算機圖形學的題:已知起點A(16,-5)和終點B(-4,8),用DDA法在A和B之間生成一段直線

樓主,你是用對稱DDA演算法還是簡單DDA演算法呢?

我用對稱DDA演算法給你做了下,答案如下,供參考(由於貼上去格式會亂,附了一張圖片):

對稱DDA演算法

1.計算初值△x=-4-16=-20,△y=8-(-5)=13,則n=5,ε=2-n=0.03125

因此,增量分別為:ε*△x=-0.625,ε*△y=0.40625

2.按遞推公式循環計算點的坐標,並取整數顯示。

i計算坐標顯示坐標i計算坐標顯示坐標

x1y1xipyipX1y1xipyip

016.5-4.516-4175.2252.4062552

115.875-4.0937515-4184.62.812542

215.25-3.687515-3193.9753.2187533

314.625-3.2812514-2203.353.62533

414-2.87514-2212.7254.0312524

513.375-2.4687513-2222.14.437524

612.125-2.062512-2231.4754.8437514

711.5-1.6562511-1240.855.2505

810.875-1.2510-1250.2255.6562505

910.25-0.8437510026-0.46.062506

109.6-0.43759027-1.0256.46875-16

118.975-0.031258028-1.656.875-16

128.350.3758029-2.2757.28125-27

137.7250.781257030-2.97.6875-27

147.11.18757131-3.5258.09375-38

156.4751.593756132-4.158.5-48

165.85252

3.畫一張圖XY軸,將(xip,yip)標上去,描繪成一條直線即可。

Ⅸ 計算機圖形學問題

1、直線的生成和2種演算法:DDA演算法:代碼如下
void
dda(Graphics
g,int
x1,int
x2,int
y1,int
y2)
{int
k;
float
x,y,dx,dy;
k=Math.abs(x2-x1);
if(Math.abs(y2-y1)>k)
k=Math.abs(y2-y1);
dx=(float)(x2-x1)/k;
dy=(float)(y2-y1)/k;
x=(float)x1;
y=(float)y1;
for(int
i=0;i<k;i++)
drawLine((int)x+.5f,((int)y+.5f,((int)x+.5f.((int)y+.5f);
x=x+dx;
y=y+dy;
}
}
Breseham演算法;
2、填充的定義和2種演算法分別是
掃描線種子填充演算法和遞歸演算法
3、圖像學的定義與運用
定義是研究如何在計算機環境下生成,處理和現實圖形的一門學科。具體應用很廣泛:像有些公司在製造汽車,飛機等時,會先畫出制圖,一般都會在計算機上繪制出來;等等吧

Ⅹ 如何用dda演算法在vc++中畫線

在你的CXXXview類上右鍵 添加成員函數類型void 函數名DDALine(參數是兩個點的xy坐標 還有顏色值RGB 一共五個參數)
再次滑鼠右鍵CXXXView添加成員變數 參數兩個點的坐標 四個參數 都是float 公有成員public
如果直接在窗體里根據已知參數話直線的話 把你的代碼放在OnDraw()函數里

如果用滑鼠操作的話 那你要添加windows消息 按快捷鍵ctrl+w 類向導找到你的CXXXView在消息里添加WM_OnLButtonDown(滑鼠按下) WM_OnMouseMove(滑鼠移動) WM_OnButtonUp(滑鼠抬起) 並設置一個BOOL變數控制畫線
在OnLButtonDown里傳遞參數point.x point.y等於初始點xy坐標 bool量=true
OnMouseMove里的point是第二坐標的xy
OnButtonUp bool量等於false

閱讀全文

與dda演算法畫直線相關的資料

熱點內容
程序員那麼可愛陸離跳水是哪集 瀏覽:15
如何製作cdn伺服器 瀏覽:109
寫java加密程序 瀏覽:657
菜鳥數據分析pdf 瀏覽:287
單片機做實用東西 瀏覽:647
我的世界最強斗羅伺服器怎麼覺醒武魂 瀏覽:925
密友圈app怎麼切換用戶登錄 瀏覽:214
我把程序員當愛豆追 瀏覽:972
android判斷電話接通 瀏覽:644
大孔文件夾 瀏覽:783
反詐騙app在哪裡下載 瀏覽:525
軍工程序員面試視頻 瀏覽:811
質心演算法原理 瀏覽:421
163smtpphp 瀏覽:667
java緩存使用 瀏覽:918
java驗證碼識別ocr 瀏覽:877
馬雲生產伺服器 瀏覽:214
上哪裡找app新用戶 瀏覽:542
王陸807詞彙pdf 瀏覽:966
linux命令行開設置窗口 瀏覽:132