使用OpenGL C++語言,橡皮筋技術/互動式繪制三角形
大部分理解都寫在代碼注釋里面了,有疑問可以直接評論區問UP,
說在前面
之前在網上參考了很多類似的代碼,他們都有龐大的頭檔案,個別代碼還參考了C++的萬能頭檔案(這玩意在VS2019中不能直接運行,還需要配置),但最后我發現,如果只是想畫個互動式三角形,其實就需要一個gl包即可,
不廢話了,直接貼完整代碼
#include <gl/glut.h>
#include <stdio.h>
#define NUM 3 //設定頂點數量
int alreadyFirstPoint = 0; //標記是否已經開始繪制折線
int winWidth = 800, winHeight = 600;
int Mousex, Mousey; //當前滑鼠的位置
int n = 0; //記錄折線數量
struct LineNode {//定義一條線,包含兩個點,四個資料
int x1;
int y1;
int x2;
int y2;
}Line[NUM];
void Initial(void)//非邏輯代碼,初始化
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //設定視窗顏色
}
void ChangeSize(int w, int h)//非邏輯代碼,控制視窗size
{
winWidth = w;
winHeight = h;
glViewport(0, 0, w, h); //指定視窗顯示區域
glMatrixMode(GL_PROJECTION); //指定設定投影引數
glLoadIdentity(); //呼叫單位矩陣,去掉以前的投影引數設定
gluOrtho2D(0.0, winWidth, 0.0, winHeight); //設定投影引數
}
void PassiveMouseMove(GLint xMouse, GLint yMouse)//非邏輯代碼,修正滑鼠坐標
{
Mousex = xMouse;
Mousey = winHeight - yMouse;
glutPostRedisplay();
}
/*
Display()方法才是真正畫線的方法
*/
void Display()
{
int i, j;
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //線性模式畫圖
glClear(GL_COLOR_BUFFER_BIT); //用當前背景色填充視窗
glColor3f(0, 0, 0); //指定當前的繪圖顏色
for (i = 0; i < n; i++) {//回圈+glBegin維持已經畫好的線段
glBegin(GL_LINES); //繪制直線
//設定一條線的兩個頂點:
glVertex2i(Line[i].x1, Line[i].y1);//設定第一個點
glVertex2i(Line[i].x2, Line[i].y2);//設定第二個點
glEnd();
}
if (alreadyFirstPoint == 1) {//當點擊滑鼠之后,一條線的第二個點將跟隨滑鼠移動
glBegin(GL_LINES);
if (n < 2) {
glVertex2i(Line[i].x1, Line[i].y1);//始發點確定坐標
glVertex2i(Mousex, Mousey);//落點跟隨滑鼠移動
}
else {//當畫出兩條線之后,停止滑鼠橡皮筋,并且首尾相連成為三角形
glVertex2i(Line[0].x1, Line[0].y1);
glVertex2i(Line[1].x2, Line[1].y2);
}
glEnd();
//printf("測驗\n");
}
glutSwapBuffers(); //交換緩沖區
}
/*
控制滑鼠拖拽的函式,這段代碼是橡皮筋的核心
*/
void MouseDraw(GLint button, GLint action, GLint xMouse, GLint yMouse) {
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) {//這行就是一個普通的滑鼠按鍵事件
if (alreadyFirstPoint == 0) {
alreadyFirstPoint = 1;//標記出滑鼠點擊了第一個點
Line[n].x1 = xMouse;
Line[n].y1 = winHeight - yMouse;//修正y的坐標
}
else {
if (n < 2) {//人為規定最多只能畫三條線
Line[n].x2 = xMouse;
Line[n].y2 = winHeight - yMouse;
//printf("測驗,你畫了一條新的線段\n");
n++;//折線數量+1
}
//折線的第二點作為下一段線的第一個的點
Line[n].x1 = Line[n - 1].x2;
Line[n].y1 = Line[n - 1].y2;
}
}
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//使用雙快取及RGB模型
glutInitWindowSize(winWidth, winHeight); //指定視窗的尺寸
glutInitWindowPosition(100, 100); //指定視窗在螢屏上的位置
glutCreateWindow("作業2-互動式畫三角形"); //創建視窗
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize); //指定視窗回呼函式
glutMouseFunc(MouseDraw); //指定滑鼠回應函式
glutPassiveMotionFunc(PassiveMouseMove); //指定滑鼠移動回應函式
Initial(); //開始初始化
glutMainLoop(); //啟動主GLUT事件處理回圈
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/175935.html
標籤:其他
