亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

OpenGL繪制貝塞爾曲線

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

本文實例為大家分享了OpenGL繪制貝塞爾曲線的具體代碼,供大家參考,具體內容如下

最終效果圖:

通過3個點形成一條貝塞爾曲線

1. 鼠標問題

在使用鼠標獲取坐標的時候,要知道鼠標獲取的坐標和屏幕坐標是不同的;

openGL使用右手坐標
從左到右,x遞增
從下到上,y遞增
從遠到近,z遞增

而鼠標是從左到右增x,同時從上到下也是增y

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

2. 繪制

setpoint 用來繪制點
setline 用來繪制線
setBezier 用來繪制貝塞爾曲線

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

實際繪制的時候就是不斷的增加t,求出下一點的值然后將兩個鏈接起來,然后再將下一個點作為起點,再求出下下一個點

Api解釋在代碼中

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

//這是一個點的類,用于存儲其中點的坐標
class Point
{
public:
  int x, y;
  void setxy(int _x, int _y) {
    x = _x;
    y = _y;
  }
};

//點的數量
static int POINTSNUM = 0;

//用于存儲點的集合,因為繪制的都是4個點的貝塞爾曲線,所以數組大小為4
static Point points[4];

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

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

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

// 繪制貝塞爾曲線
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函數
void display()
{
  glClear(GL_COLOR_BUFFER_BIT);
  glFlush();
}



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

    //如果達到了4個繪制貝塞爾曲線,并在之后給計數器清零
    if (POINTSNUM == 3) { 
      //繪制貝塞爾曲線  
      glColor3f(0.0, 0.0, 1.0); // 設定貝塞爾曲線的顏色

      Point p_current = points[0]; //設為起點
      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); // 添加鼠標事件
  glutDisplayFunc(display); // 執(zhí)行顯示  
  glutMainLoop(); //進人GLUT事件處理循環(huán)
  return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++  boost 時間與日期處理詳細介紹

    C++ boost 時間與日期處理詳細介紹

    這篇文章主要介紹了C++ boost 時間與日期處理詳細介紹的相關資料,這里提供實例代碼,及實現效果,需要的朋友可以參考下
    2016-11-11
  • C語言函數的遞歸和調用實例分析

    C語言函數的遞歸和調用實例分析

    一個函數在它的函數體內調用它自身稱為遞歸調用。這種函數稱為遞歸函數。C語言允許函數的遞歸調用。在遞歸調用中,主調函數又是被調函數。執(zhí)行遞歸函數將反復調用其自身,每調用一次就進入新的一層
    2013-07-07
  • C++鍵盤記錄程序代碼

    C++鍵盤記錄程序代碼

    這篇文章主要介紹了C++鍵盤記錄程序代碼,是Windows應用程序開發(fā)中非常實用的功能,該功能也常被一些遠程操控程序所實用,需要的朋友可以參考下
    2014-10-10
  • C++自動生成迷宮游戲

    C++自動生成迷宮游戲

    這篇文章主要為大家詳細介紹了C++自動生成迷宮游戲,運用并查集自動生成迷宮地圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++進化后的const變量實例探究

    C++進化后的const變量實例探究

    這篇文章主要為大家介紹了C++進化后的const變量實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • C++輸出斐波那契數列的兩種實現方法

    C++輸出斐波那契數列的兩種實現方法

    以下是對C++中輸出斐波那契數列的兩種實現方法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++利用數組(一維/二維)處理批量數據的方法

    C++利用數組(一維/二維)處理批量數據的方法

    對于簡單的問題,使用簡單的數據類型就可以了,但是對于有些需要處理的數據,只用以上簡單的數據類型是不夠的,難以反映出數據的特點,也難以有效的進行處理,本文小編給大家介紹了C++利用數組(一維/二維)處理批量數據的方法,需要的朋友可以參考下
    2023-10-10
  • C++中queue容器的具體使用

    C++中queue容器的具體使用

    本文主要介紹了C++中queue容器的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C++實現圖書管理系統(tǒng)(文件操作與類)

    C++實現圖書管理系統(tǒng)(文件操作與類)

    這篇文章主要為大家詳細介紹了C++實現圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一文總結C++中的異常

    一文總結C++中的異常

    異常是一種處理錯誤的方式,當一個函數發(fā)現自己無法處理的錯誤時就可以拋出異常,讓函數的直接或間接調用者處理這個錯誤,本文給大家總結了C++中的異常,需要的朋友可以參考下
    2023-10-10

最新評論