1、实验一OpenGL直线圆的绘制实验一、OpenGL直线、圆的绘制1、 实验目的1)了解OpenGL 图形库的功能和结构;2)学习了解OpenGL 程序的基本结构,及常用函数; 3)学习使用OpenGL 绘制基本图形(线、圆); 2、 实验内容 1)使用OpenGL 编写一个简单的C+程序,使该程序能够绘制出直线。 2 )使用OpenGL 编写一个简单的C+程序,使该程序能够绘制出圆。 3、 实验过程1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);2)使用Visual V+6.0 新建一个C+文档,并创建相应的工程;3)在文档中引入OpenGL的头文件,编辑代码实现鼠标拖动
2、画直线,画圆。4、 实验结果可单击鼠标左键,然后拖动鼠标画出两条直线,并同时画出圆;可单击鼠标右键,然后拖动鼠标画出两个圆,并同时画出直线。结果截图:1.鼠标左键主要控制绘制的直线:2.鼠标右键主要控制绘制的圆:5、 实验代码1.#include 2.#include 3.4./ GLint pNum = 0;5.GLint px1, py1, px2, py2, cx, cy, r;6.GLint winWidth=600, winHeight=600;7.8./画直线/9.void Draw_Bresenham(int pStartx,int pStarty,int pEndx,int p
3、Endy)10./用Bresenham算法画直线11. int i;12.13. if(pStartx=pEndx)14. 15. /为竖线16. if(pStarty=pEndy)17. 18. for(i=pStarty;i=pEndy;i+)19. glVertex2f(pStartx,i);20. 21. else22. 23. for(i=pEndy;i=pStarty;i+)24. glVertex2f(pStartx,i);25. 26.27. return;28. 29.30. /为横线31. if(pStarty=pEndy)32. 33. if(pStartx=pEndx)
4、34. 35. for(i=pStartx;i=pEndx;i+)36. glVertex2f(i,pStarty);37. 38. else39. 40. for(i=pEndx;i0 & m=1)52. 53. if(pStartxpEndx)54. 55. while(pStartx=0)59. 60. p+=2*m-2;61. pStarty+;62. 63. else64. p+=2*m;65. 66. 67. else68. 69. while(pEndx=0)73. 74. p+=2*m-2;75. pEndy+;76. 77. else78. p+=2*m;79. 80. 81
5、.82. return;83. 84.85. p=-2*m-1;86. if(m=-1)87. 88. if(pStartxpEndx)89. 90. while(pStartx=0)94. 95. p+=-2*m-2;96. pStarty-;97. 98. else99. p+=-2*m;100. 101. 102. else103. 104. while(pEndx=0)108. 109. p+=-2*m-2;110. pEndy-;111. 112. else113. p+=-2*m;114. 115. 116.117. return;118. 119.120. p=2/m-1;121
6、. if(m1)122. 123. if(pStartypEndy)124. 125. while(pStarty=0)129. 130. p+=2/m-2;131. pStartx+;132. 133. else134. p+=2/m;135. 136. 137. else138. 139. while(pEndy=0)143. 144. p+=2/m-2;145. pEndx+;146. 147. else148. p+=2/m;149. 150. 151.152. return;153. 154.155. p=-2/m-1;156. if(pStartypEndy)157. 158. w
7、hile(pStarty=0)162. 163. p+=-2/m-2;164. pStartx-;165. 166. else167. p+=-2/m;168. 169. 170. else171. 172. while(pEndy=0)176. 177. p+=-2/m-2;178. pEndx-;179. 180. else181. p+=-2/m;182. 183. 184.185.186./画圆/187./其他象限绘制188.void CirclePoints(int x,int y) 189. /第1象限190. glVertex2f(x,y);191. glVertex2f(y,x
8、);192. /第2象限193. glVertex2f(-x,y);194. glVertex2f(-y,x);195. /第3象限196. glVertex2f(-y,-x);197. glVertex2f(-x,-y);198. /第4象限199. glVertex2f(x,-y);200. glVertex2f(y,-x);201. 202.203./中点算法画圆204.void DrawCircle(int cx,int cy,int radis)205.206. glPushMatrix();207. glTranslatef(cx,cy,0);208. glPointSize(1)
9、;209. glColor3f(0.5f, 0.5f, 1.0f);210. glBegin(GL_POINTS);211.212. int x,y;213. double p;214. x=0;215. y=radis;216. p=1.25-radis;217. while(x=0)222. 223. y-;224. p+=2.0*(x-y)+5;225. 226. else227. p+=2*x+3;228. 229. glEnd();230. glPopMatrix();231.232.233.234./绘制坐标轴235.void DrawOx()236. glColor3f(0.95
10、, 0.7, 0.8);237. glPointSize(1);238. glBegin(GL_LINES);239. glVertex2f(-winWidth/2,0);240. glVertex2f(winWidth/2,0);241. glVertex2f(0,winHeight/2);242. glVertex2f(0,-winHeight/2);243. glEnd();244.245.246./显示函数247.void Display()248. /GL_COLOR_BUFFER_BIT(用背景颜色填充)249. glClear(GL_COLOR_BUFFER_BIT);250.2
11、51. DrawOx();252.253. glColor3f(0.0,0.0,1.0);254. 255. glBegin(GL_POINTS);256. /BresenhamLine(px1, py1, px2, py2);257. Draw_Bresenham(px1, py1, px2, py2);258. glEnd();259. glBegin(GL_POINTS);260. Draw_Bresenham(py1, px1, py2, px2);261. glEnd();262. /glBegin(GL_LINES);263. /glVertex2f(px1,py1);264. /
12、glVertex2f(px2,py2);265. /glVertex2f(py1,px1);266. /glVertex2f(py2,px2);267. /glEnd();268. DrawCircle(cx,cy,r);269. DrawCircle(cy,cx,r);270.271. /交换缓冲区272. glutSwapBuffers();273. /glFlush();/ 刷新绘图命令 274.275.276.277./ 设置渲染状态(听起来满下人,实际上很简单)278.void SetupRC(void)279.280. /清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景
13、颜色281. /和glColor4f(1.0f, 0.0f, 0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的282. /最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明283. glClearColor(1.0f, 1.0f, 1.0f,1.0f);284.285.286./ 当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,287./几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧288.void ChangeSize(int w, int h)289.290. winWidth = w;291. winH
14、eight = h; 292. / 设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)293. glViewport(0,0,w,h); 294. / 重置坐标系统,指定设置投影参数295. glMatrixMode(GL_PROJECTION);296. /调用单位矩阵,去掉以前的投影参数设置297. glLoadIdentity();298. /设置投影参数299. gluOrtho2D(-w/2,w/2,-h/2,h/2);300.301.302./鼠标点击303.void MousePlot(GLint button,GLint action,GLint xMous
15、e,GLint yMouse)304. if(button=GLUT_LEFT_BUTTON & action=GLUT_DOWN)305. px1 = xMouse - winWidth/2;306. py1 = winHeight/2 - yMouse;307. 308. if(button=GLUT_LEFT_BUTTON & action=GLUT_UP)309. px2 = xMouse - winWidth/2;310. py2 = winHeight/2 - yMouse;311. glutPostRedisplay(); 312. 313. if(button=GLUT_RIG
16、HT_BUTTON & action=GLUT_DOWN)314. cx=xMouse-winWidth/2;315. cy=winHeight/2-yMouse;316. 317.318./鼠标移动319.void MouseMove(GLint xMouse,GLint yMouse)320. px2 = xMouse - winWidth/2;321. py2 = winHeight/2 - yMouse;322. r=sqrt(pow(xMouse-winWidth/2-cx),2)+pow(winHeight/2-yMouse-cy),2);323. glutPostRedispla
17、y();324.325.326./ 主函数327.int main(int argc, char* argv)328.329. glutInit(&argc, argv);330. /设置显示模式331. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);332. /设置窗口大小像素333. glutInitWindowSize(600, 600);334. /设置窗口出现在屏幕的位置335. glutInitWindowPosition(300,160);336. /建立一个叫OpenGL的窗口337. glutCreateWi
18、ndow(OpenGL-Line);338. 339. /调用函数Display进行绘制340. glutDisplayFunc(Display);341. /调用鼠标移动函数342. /glutPassiveMotionFunc(PassiveMouseMove);343. glutMotionFunc(MouseMove);344. /调用鼠标点击函数345. glutMouseFunc(MousePlot);346. 347. /如果窗口大小改变则调用函数ChangeSize重新进行绘制348. glutReshapeFunc(ChangeSize); 349. /清屏350. SetupRC(); 351. /循环绘制352. glutMainLoop();353. 354. return 0;355.356.如有侵权请联系告知删除,感谢你们的配合!357.358.359.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1