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

opengldda演算法畫直線

發布時間:2023-03-07 14:38:23

❶ opengl DDA 演算法程序 為什畫出的直線斷斷續續的

DDA是用好多點來表示的直線。。。

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

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

❸ 怎麼在opengl中畫直線

#include <iostream>
#include <windows.h>
#include <GL/glut.h>

using namespace std ;

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0) ;
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0) ;
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 1.0, 1.0) ;
glBegin(GL_LINES) ;
glVertex3f(0.25, 0.25, 0.0) ;
glVertex3f(0.75, 0.25, 0.0) ;
glEnd() ;
glFlush() ;
}

int main(int argc, char **argv)
{
glutInit(&argc, argv) ;
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;
glutInitWindowSize(200, 200) ;
glutCreateWindow("I love OpenGl") ;
init() ;
glutDisplayFunc(display) ;
glutMainLoop() ;

return 0 ;
}

❹ 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--;
}
}
}
}

閱讀全文

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

熱點內容
怎麼顯示android的APP 瀏覽:121
c編譯器怎麼刪除空格 瀏覽:695
php自動釋放內存 瀏覽:219
golang編譯庫 瀏覽:794
oracle數據字元串加密 瀏覽:603
研究生去上海當程序員 瀏覽:90
u8電腦伺服器連接失敗怎麼解決 瀏覽:569
bat腳本創建日期命名文件夾 瀏覽:104
將圖片轉換為pdf格式 瀏覽:980
java中形參 瀏覽:83
枚舉類型編譯器 瀏覽:519
oraclejava包 瀏覽:568
手機定位手機怎麼定位安卓 瀏覽:523
在哪個app買歐萊雅最便宜 瀏覽:495
程序員吃零食好嗎 瀏覽:261
php工程師主要做什麼 瀏覽:356
tvp保存到哪個文件夾 瀏覽:197
怎麼把空調裡面的壓縮機拆卸掉 瀏覽:943
linux4k對齊 瀏覽:968
單片機與開關電源 瀏覽:276