Ⅰ 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