本文主要是介绍计算机图形学实验——直线,多边形绘制算法(橡皮筋效果),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
计算机图形学实验1.1橡皮筋效果绘制
- OpenGL橡皮筋效果实现
- 橡皮筋效果直线
- 橡皮筋效果多边形
- 运行截图
- 小结
OpenGL橡皮筋效果实现
「实验题目」
设计一个二维卡通交互设计系统,实现直线,多边形绘制算法(橡皮筋效果)
「题目分析」
我们知道两点确定一条直线,对于直线来说,橡皮筋效果无非固定直线的一端,另一端随着鼠标的拖动不断绘制;所以大体思路讨论鼠标点击、拖动和绘制直线和这两个控制点之间的关系就vans了。
对于多边形来说,我采用的方法是通过直线定义多边形,相当于对直线橡皮筋的推广画法;比如说,一个矩形可以用对角线定义,随着对角线的伸缩,矩形的橡皮筋效果就实现了
P.S. TA说,正式的橡皮筋多边形绘制不是这么草率.好吧,那不管:(
橡皮筋效果直线
显示函数
用一个FixPoint数组保存确定下来的控制点对,这样就可以保存下绘画痕迹了。
这样想,直线橡皮筋需要固定一个控制点位置(鼠标按下位置),第二个控制点随着鼠标拖动不断更新并绘制,当鼠标抬起,则不需要绘制了。使用isDraw状态的切换,控制什么时候可以绘制新的图元
void Display(){glClear(GL_COLOR_BUFFER_BIT);glClearColor(0,0,0,1);glColor3f(0, 0.4, 0);glPolygonMode(GL_FRONT, GL_FILL);//历史记录for(int i=1; i <= counter; i++){switch(drawMode){case 1: DrawLine(FixPoint[i].x1, FixPoint[i].y1, FixPoint[i].x2, FixPoint[i].y2); break;case 2: DrawTriangle(FixPoint[i].x1, FixPoint[i].y1, FixPoint[i].x2, FixPoint[i].y2); break;case 3: DrawRectangle(FixPoint[i].x1, FixPoint[i].y1, FixPoint[i].x2, FixPoint[i].y2); break;case 4: DrawHexagon(FixPoint[i].x1, FixPoint[i].y1, FixPoint[i].x2, FixPoint[i].y2); break;case 5: DrawCircle(FixPoint[i].x1, FixPoint[i].y1, FixPoint[i].x2, FixPoint[i].y2); break;}}//橡皮筋效果if(isDraw == 1){switch(drawMode){case 1: DrawLine(ponint1x, ponint1y, ponint2x, ponint2y); break;case 2: DrawTriangle(ponint1x, ponint1y, ponint2x, ponint2y); break;case 3: DrawRectangle(ponint1x, ponint1y, ponint2x, ponint2y); break;case 4: DrawHexagon(ponint1x, ponint1y, ponint2x, ponint2y); break;case 5: DrawCircle(ponint1x, ponint1y, ponint2x, ponint2y); break;}}glutSwapBuffers();
}
监听mouseClick的回调函数
处理isDraw是否开启绘画的逻辑,鼠标抬起的时候写入点击—抬起位置对(即第一、第二个控制点相应坐标)到历史记录数组中保存即可
void mouseClick(GLint button, GLint action, GLint xMouse, GLint yMouse){//三个阶段: 按下确定第一个点,推拽更新第二个点坐标(仍然只能确定一个点),实现橡皮筋效果;// 抬起确定第二个点位置,固定形状if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){isDraw = 1;ponint1x = xMouse; ponint1y = windowHeight - yMouse;}if(button == GLUT_LEFT_BUTTON && action == GLUT_UP){isDraw = 0;ponint2x = xMouse; ponint2y = windowHeight - yMouse;FixPoint[++counter] = Node{ponint1x, ponint1y, ponint2x, ponint2y};glutPostRedisplay();}
}
监听mouseClick的回调函数
void mouseMove(GLint xMouse, GLint yMouse){//根据拖动更新第二个坐标位置ponint2x = xMouse; ponint2y = windowHeight - yMouse;glutPostRedisplay();
}
橡皮筋效果多边形
这里实现就比较简单了,通过从左下到右上的弹性"控制线",定义了三角形(等腰三角形中线)、矩形(对角线)、正六边形(斜对称轴)、圆形(水平直径)
等腰三角形绘制Function
void DrawTriangle(double x1, double y1, double x2, double y2){glBegin(GL_POLYGON);glVertex2f(x1, y1);glVertex2f(x2, y2);glVertex2f(2*x2-x1, y1);glEnd();
}
矩形绘制Function
void DrawRectangle(double x1, double y1, double x2, double y2){double height = abs(y2 - y1);glBegin(GL_POLYGON);glVertex2f(x1,y1);glVertex2f(x1,y1 + height);glVertex2f(x2,y2);glVertex2f(x2,y2 - height);glEnd();
}
正六边形绘制Function
void DrawHexagon(double x1, double y1, double x2, double y2){double edgeLen = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) / 2;glBegin(GL_POLYGON);glVertex2f(x1, y1);glVertex2f(x1 - edgeLen/2, (y1+y2)/2);glVertex2f(x1, y2);glVertex2f(x2, y2);glVertex2f(x1 + 3*edgeLen/2, (y1+y2)/2);glVertex2f(x2, y1);glEnd();
}
圆形形绘制Function
void DrawCircle(double x1, double y1, double x2, double y2){double ox = (x1+x2)/2, oy = (y1+y2)/2;double r = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));glBegin(GL_POLYGON);int n = 360;for(int i=0; i<n; i++)glVertex2f(r*cos(2*i*PI/n)+ox, r*sin(2*i*PI/n)+oy);glEnd();
}
运行截图
小结
就酱紫,然后木有了,感觉够用了。
完整代码资源戳这里🦄️
这篇关于计算机图形学实验——直线,多边形绘制算法(橡皮筋效果)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!