欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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++中bitset位圖介紹及模擬實現(xiàn)

    C++中bitset位圖介紹及模擬實現(xiàn)

    位圖就是用每一位來存放某種狀態(tài),適用于海量數(shù)據(jù),本文就介紹一下C++中bitset位圖介紹及模擬實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-07-07
  • C++ 函數(shù)重載詳情介紹

    C++ 函數(shù)重載詳情介紹

    這篇文章主要介紹了C++ 函數(shù)重載詳情,函數(shù)重載還有一個別名叫函數(shù)多態(tài),函數(shù)多態(tài)是C++在C語言基礎(chǔ)上的新特性,它可以讓我們使用多個同名函數(shù),下面來看看文章具體內(nèi)容的介紹
    2021-11-11
  • C語言五子棋小游戲?qū)崿F(xiàn)代碼

    C語言五子棋小游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細介紹了C語言五子棋小游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一篇文章帶你了解C語言內(nèi)存對齊公式

    一篇文章帶你了解C語言內(nèi)存對齊公式

    這篇文章主要介紹了C語言內(nèi)存對齊,包括內(nèi)存對其的基本概念及用法,以及注意事項,并以實例形式加以說明,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • C語言的變量類型及內(nèi)存大小詳解

    C語言的變量類型及內(nèi)存大小詳解

    這篇文章主要介紹了CC和C++變量類型及內(nèi)存大小,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟

    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-04
  • 淺談C++中char型變量的地址輸出

    淺談C++中char型變量的地址輸出

    下面小編就為大家?guī)硪黄獪\談C++中char 型變量的地址輸出。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • C語言中計算函數(shù)執(zhí)行時間的三種方式

    C語言中計算函數(shù)執(zhí)行時間的三種方式

    本文主要介紹了C語言中計算函數(shù)執(zhí)行時間的三種方式,主要包括clock(),timeb和time,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程

    C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • C語言使用矩形法求定積分的通用函數(shù)

    C語言使用矩形法求定積分的通用函數(shù)

    這篇文章主要為大家詳細介紹了C語言使用矩形法求定積分的通用函數(shù),分別求解sinx, cosx,e^x,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論