OpenGL中點Bresenham繪制直線算法
更新時間:2020年02月20日 07:52:02 作者:Frank(Zhiyang-Dou)
這篇文章主要為大家詳細介紹了OpenGL中點Bresenham繪制直線算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了OpenGL中點Bresenham繪制直線算法,供大家參考,具體內(nèi)容如下
環(huán)境
macos xcode編譯器
代碼
#include <GLUT/GLUT.h> #include <iostream> #include<iostream> #include<cstdlib> #include<ctime> using namespace std; float wid = 400; //設(shè)置窗口的大小,約定窗口必須為正方形 float height = wid; //設(shè)置窗口的大小 int numbers = 20; //設(shè)置劃分的網(wǎng)格的個數(shù) float t = wid/numbers; //模擬像素下的單位1 /* 參數(shù)設(shè)置說明: 輸入直線的兩點A(x1,y1);B(x2,y2) 您應(yīng)當(dāng)確保參數(shù)范圍在-400~400.且為整數(shù)。 *支持不同斜率 *支持兩點位置顛倒 */ int x1 = -300,y1=-400,x2 =400,y2 = 100; void draw_point(float x, float y,int k_kind,int d_kind); float translater(int x); void swap(int &a, int &b) { int tmp = 0; tmp = b; b = a; a = tmp; } void bresenham(int x1, int y1,int x2, int y2){ /* 函數(shù)說明:bresenham算法部分 參數(shù)說明:與openGL已有的劃線函數(shù)一樣,要求用戶提供的是點的起點(x1,y1)和終點(x2,y2) 為了便于觀察,我們會繪制原像素下的直線。 這里的坐標(biāo)要求是-1 ~ 1 */ int k_kind = 0; //k_kind用來表示斜率的類型。0是0~1;1是1~無窮;2是0~-1;3是負無窮~-1 int d_kind =0; //d_kind用來表示dy正負的類型。 if (x1 > x2) { swap(x1,x2); swap(y1,y2); } int dx = abs(x2-x1), dy = abs(y2-y1); if (y1 > y2) {//如果是向下的 y1 = -y1; y2 = -y2; d_kind = 1; } if (dy > dx) { //斜率介于1~無窮的,將看作坐標(biāo)系變換(這里將坐標(biāo)變換)。 swap(x1, y1); swap(x2,y2); swap(dx,dy); k_kind = 1; } float d = (dy +dy -dx)*t; //令d為決策量(這里利用d = dx*w*2避免浮點運算) float x = x1+0.0,y = y1+0.0; draw_point(translater(x),translater(y),k_kind,d_kind); //繪制下一個點 while( x < x2){ //以x為步長 if (d < 0){ d += 2*dy*t; } else{ d += 2*(dy-dx)*t; y += t; //說明應(yīng)該畫在上面那個位置 } x= x + t; draw_point(translater(x),translater(y),k_kind,d_kind); //繪制下一個點 } } float translater(int x){ /* 函數(shù)說明:將像素坐標(biāo)下的坐標(biāo)轉(zhuǎn)化為openGL坐標(biāo) 參數(shù)說明:傳入點像素坐標(biāo)-wid-wid,返回-1~1坐標(biāo) */ return x/wid; } void draw_point(float x , float y, int k_kind,int d_kind){ /* 函數(shù)說明:繪制像素的點,這里將點的大小設(shè)置為7。 顏色采用藍色。 參數(shù)說明:浮點數(shù)x,y是openGl坐標(biāo)系。kind是指明斜率的類型 */ glPointSize(7); glColor3f(0.0,0.0,1.0); glBegin(GL_POINTS); cout <<"k:"<<k_kind<<"d:" << d_kind << endl; if(k_kind==0&&d_kind==1){ y = -y; }else if (k_kind ==1 &&d_kind==1){ x= -x; swap(x,y); }else if (k_kind==1&&d_kind ==0){ swap(x,y); } glVertex3f(x,y,0.0); glEnd(); glFlush(); } void grid(){ /* 函數(shù)說明:繪制網(wǎng)格為了便于將真實的像素pixel轉(zhuǎn)化為我們模擬的像素 */ glClearColor(0, 0, 0, 0);//這是設(shè)置背景色,必須要在glclear之前調(diào)用 glClear(GL_COLOR_BUFFER_BIT); //畫直線 int wid_number = numbers; int hei_number = numbers; float delta_wid = wid / wid_number; float delta_hei = height / hei_number; glColor3f(1.0,1.0,0); for (int i = 1; i < 40 ; i ++ ) { glBegin(GL_LINES); glVertex2f(-1+i*delta_hei/height, -1); glVertex2f(-1+i*delta_hei/height, 1); glVertex2f(-1,-1+i*delta_hei/height); glVertex2f(1,-1+i*delta_hei/height); glEnd(); glFlush(); } glColor3f(1.0,0,0); glBegin(GL_LINES); //繪制坐標(biāo)系,便于觀察 glVertex2f(-1,0); glVertex2f(1,0); glVertex2f(0,-1); glVertex2f(0,1); glEnd(); glFlush(); glBegin(GL_LINES); glColor3f(1.0,0.0,0.0); glVertex2f(translater(x1),translater(y1)); //定點坐標(biāo)范圍 glVertex2f(translater(x2),translater(y2)); glEnd(); glFlush(); //刷新緩沖,保證繪圖命令能被執(zhí)行 bresenham(x1, y1,x2,y2); } int main(int argc, char *argv[]) { //初始化GLUT library glutInit(&argc, argv); //對窗口的大小進行初始化 glutInitWindowSize(700,700); glutInitWindowPosition(300,200); // 設(shè)置窗口出現(xiàn)的位置 //glutInitWindowPosition(int x, int y); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("class16_hw1"); glutDisplayFunc(&grid); glutMainLoop(); return 0;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟
在實際開發(fā)中我們經(jīng)常需要對數(shù)據(jù)庫進行訪問,針對不同類型的數(shù)據(jù)庫(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進行連接,會把我們搞崩潰,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下2023-04-04C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2021-10-10