最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenGL繪制貝塞爾曲線(xiàn)

 更新時(shí)間:2020年04月20日 14:58:12   作者:薛昭君  
這篇文章主要為大家詳細(xì)介紹了OpenGL繪制貝塞爾曲線(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了OpenGL繪制貝塞爾曲線(xiàn)的具體代碼,供大家參考,具體內(nèi)容如下

最終效果圖:

通過(guò)3個(gè)點(diǎn)形成一條貝塞爾曲線(xiàn)

1. 鼠標(biāo)問(wèn)題

在使用鼠標(biāo)獲取坐標(biāo)的時(shí)候,要知道鼠標(biāo)獲取的坐標(biāo)和屏幕坐標(biāo)是不同的;

openGL使用右手坐標(biāo)
從左到右,x遞增
從下到上,y遞增
從遠(yuǎn)到近,z遞增

而鼠標(biāo)是從左到右增x,同時(shí)從上到下也是增y

所以在求 y 的時(shí)候,用(屏幕大小-y)來(lái)獲取

2. 繪制

setpoint 用來(lái)繪制點(diǎn)
setline 用來(lái)繪制線(xiàn)
setBezier 用來(lái)繪制貝塞爾曲線(xiàn)

其中公式的意義可以參考百科:

實(shí)際繪制的時(shí)候就是不斷的增加t,求出下一點(diǎn)的值然后將兩個(gè)鏈接起來(lái),然后再將下一個(gè)點(diǎn)作為起點(diǎn),再求出下下一個(gè)點(diǎn)

Api解釋在代碼中

#include "GL\glut.h"
#include <math.h>
#include <Windows.h>

//這是一個(gè)點(diǎn)的類(lèi),用于存儲(chǔ)其中點(diǎn)的坐標(biāo)
class Point
{
public:
  int x, y;
  void setxy(int _x, int _y) {
    x = _x;
    y = _y;
  }
};

//點(diǎn)的數(shù)量
static int POINTSNUM = 0;

//用于存儲(chǔ)點(diǎn)的集合,因?yàn)槔L制的都是4個(gè)點(diǎn)的貝塞爾曲線(xiàn),所以數(shù)組大小為4
static Point points[4];

//初始化函數(shù)
void init(void)
{
  glClearColor(1.0, 1.0, 1.0, 0); //設(shè)定背景為黑色
  glColor3f(0.0,0.0,0.0); //繪圖顏色為白色
  glPointSize(2.0); //設(shè)定點(diǎn)的大小為2*2像素的
  glMatrixMode(GL_PROJECTION); // 設(shè)定合適的矩陣
  glLoadIdentity(); // 是一個(gè)無(wú)參的無(wú)值函數(shù),其功能是用一個(gè)4×4的單位矩陣來(lái)替換當(dāng)前矩陣,實(shí)際上就是對(duì)當(dāng)前矩陣進(jìn)行初始化。也就是說(shuō),無(wú)論以前進(jìn)行了多少次矩陣變換,在該命令執(zhí)行后,當(dāng)前矩陣均恢復(fù)成一個(gè)單位矩陣,即相當(dāng)于沒(méi)有進(jìn)行任何矩陣變換狀態(tài)
  gluOrtho2D(0.0,600.0,0.0,480.0); //平行投影,四個(gè)參數(shù)分別是x,y范圍
}

//繪制點(diǎn)
void setPoint(Point p) {
  glBegin(GL_POINTS);
  glVertex2f(p.x, p.y);
  glEnd();
  glFlush();
}

// 繪制直線(xiàn)
void setline(Point p1, Point p2) {
  glBegin(GL_LINES);
  glVertex2f(p1.x,p1.y);
  glVertex2f(p2.x, p2.y);
  glEnd();
  glFlush();
}

// 繪制貝塞爾曲線(xiàn)
Point setBezier(Point p1, Point p2, Point p3, Point p4,double t) {
  Point p;
  double a1 = pow((1 - t), 3);
  double a2 = pow((1 - t), 2) * 3 * t;
  double a3 = 3 * t*t*(1 - t);
  double a4 = t*t*t;
  p.x = a1*p1.x + a2*p2.x + a3*p3.x + a4*p4.x;
  p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;
  return p;
}


//display函數(shù)
void display()
{
  glClear(GL_COLOR_BUFFER_BIT);
  glFlush();
}



// 鼠標(biāo)事件
void mymouseFunction(int button, int state, int x, int y) {
  if (state == GLUT_DOWN) // 如果鼠標(biāo)按下,不區(qū)分左右鍵的
  {
    points[POINTSNUM].setxy(x,480- y); // 這里求鼠標(biāo)點(diǎn)的坐標(biāo)的時(shí)候
    // 設(shè)置點(diǎn)的顏色,繪制點(diǎn)
    glColor3f(1.0,0.0,0.0);
    setPoint(points[POINTSNUM]);
    // 設(shè)置線(xiàn)的顏色,繪制線(xiàn)
    glColor3f(1.0,0.0,0.0);
    if(POINTSNUM > 0) setline(points[POINTSNUM-1],points[POINTSNUM]);

    //如果達(dá)到了4個(gè)繪制貝塞爾曲線(xiàn),并在之后給計(jì)數(shù)器清零
    if (POINTSNUM == 3) { 
      //繪制貝塞爾曲線(xiàn)  
      glColor3f(0.0, 0.0, 1.0); // 設(shè)定貝塞爾曲線(xiàn)的顏色

      Point p_current = points[0]; //設(shè)為起點(diǎn)
      for (double t = 0.0; t <= 1.0; t += 0.05)
      {
        Point P = setBezier(points[0], points[1], points[2], points[3], t);
        setline(p_current, P);
        p_current = P;
      }

      POINTSNUM = 0; 
    }
    else {
      POINTSNUM++;
    }
  }
}

int main(int argc, char *argv[])
{
  glutInit(&argc, argv); //固定格式
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  //緩存模式
  glutInitWindowSize(600, 480);  //顯示框的大小
  glutInitWindowPosition(100, 100); //確定顯示框左上角的位置
  glutCreateWindow("第四次作業(yè)");

  init(); // 初始化
  glutMouseFunc(mymouseFunction); // 添加鼠標(biāo)事件
  glutDisplayFunc(display); // 執(zhí)行顯示  
  glutMainLoop(); //進(jìn)人GLUT事件處理循環(huán)
  return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語(yǔ)言 字符串的拼接和分割實(shí)例

    c語(yǔ)言 字符串的拼接和分割實(shí)例

    今天小編就為大家分享一篇c語(yǔ)言 字符串的拼接和分割實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C/C++整數(shù)乘積的溢出問(wèn)題的解決

    C/C++整數(shù)乘積的溢出問(wèn)題的解決

    整數(shù)乘積的溢出問(wèn)題是指兩個(gè)整數(shù)相乘得到的結(jié)果超過(guò)了所能表示的數(shù)據(jù)類(lèi)型的范圍,本文給大家介紹了C/C++整數(shù)乘積的溢出問(wèn)題的解決,需要的朋友可以參考下
    2024-02-02
  • C語(yǔ)言編程中建立和解除內(nèi)存映射的方法

    C語(yǔ)言編程中建立和解除內(nèi)存映射的方法

    這篇文章主要介紹了C語(yǔ)言編程中建立和解除內(nèi)存映射的方法,分別為mmap()函數(shù)和munmap()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++多線(xiàn)程編程超詳解

    C++多線(xiàn)程編程超詳解

    本文給大家介紹的是C++多線(xiàn)程編程,由于C++本身沒(méi)有多線(xiàn)程機(jī)制,在windows下我們使用調(diào)用SDK win32 api來(lái)實(shí)現(xiàn),示例都很簡(jiǎn)單,講解的也很詳細(xì),推薦給大家
    2021-09-09
  • VSCODE調(diào)試RDKit內(nèi)核的方法步驟(C++)

    VSCODE調(diào)試RDKit內(nèi)核的方法步驟(C++)

    本文主要介紹了VSCODE調(diào)試RDKit內(nèi)核的方法步驟,這個(gè)過(guò)程可以分為三個(gè)部分:安裝 RDKit 所需環(huán)境,安裝 VSCode 相應(yīng)插件, 寫(xiě)調(diào)試代碼編譯,感興趣的可以了解一下
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)倉(cāng)庫(kù)物資管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)倉(cāng)庫(kù)物資管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)倉(cāng)庫(kù)物資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++流程控制中用于跳轉(zhuǎn)的return和goto語(yǔ)句學(xué)習(xí)教程

    C++流程控制中用于跳轉(zhuǎn)的return和goto語(yǔ)句學(xué)習(xí)教程

    這篇文章主要介紹了C++流程控制中用于跳轉(zhuǎn)的return和goto語(yǔ)句學(xué)習(xí)教程,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • 用C++的odeint庫(kù)求解微分方程

    用C++的odeint庫(kù)求解微分方程

    求解微分方程的數(shù)值解一般使用MATLAB等數(shù)值計(jì)算軟件,其實(shí)C++也可以求解微分方程,需要用到odeint庫(kù),它是boost庫(kù)的一部分。官方教程和示例比較晦澀,本文力求用較短的篇幅介紹它的基本用法,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++ decltype用法舉例說(shuō)明

    C++ decltype用法舉例說(shuō)明

    decltype是C++11添加的一個(gè)新的關(guān)鍵字,目的是選擇并返回操作數(shù)的數(shù)據(jù)類(lèi)型,重要的是,在此過(guò)程中編譯器分析表達(dá)式并得到它的類(lèi)型,卻不實(shí)際計(jì)算表達(dá)式的值,今天通過(guò)本文給大家介紹C++ decltype用法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • C語(yǔ)言高效實(shí)現(xiàn)向量循環(huán)移位

    C語(yǔ)言高效實(shí)現(xiàn)向量循環(huán)移位

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言高效實(shí)現(xiàn)向量循環(huán)移位,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評(píng)論

满洲里市| 信宜市| 丰台区| 鄂州市| 白水县| 万州区| 汉川市| 塔城市| 蓝山县| 长子县| 和龙市| 赤峰市| 平昌县| 宜宾县| 潍坊市| 时尚| 房产| 铜山县| 阳曲县| 三门峡市| 黑山县| 台州市| 石台县| 都安| 麦盖提县| 扬州市| 永仁县| 阳曲县| 临夏县| 湖北省| 定陶县| 界首市| 涞水县| 全椒县| 宁晋县| 通辽市| 两当县| 迁安市| 三门峡市| 乐陵市| 馆陶县|