欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    实验一OpenGL直线圆的绘制.doc

    • 资源ID:3017477       资源大小:129.52KB        全文页数:20页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验一OpenGL直线圆的绘制.doc

    -/实验一、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的头文件,编辑代码实现鼠标拖动画直线,画圆。4、 实验结果可单击鼠标左键,然后拖动鼠标画出两条直线,并同时画出圆;可单击鼠标右键,然后拖动鼠标画出两个圆,并同时画出直线。结果截图:1. 鼠标左键主要控制绘制的直线:2. 鼠标右键主要控制绘制的圆:5、 实验代码1. #include <gl/glut.h>2. #include <math.h>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 pEndy)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)34. 35. for(i=pStartx;i<=pEndx;i+)36. glVertex2f(i,pStarty);37. 38. else39. 40. for(i=pEndx;i<=pStartx;i+)41. glVertex2f(i,pStarty);42. 43.44. return;45. 46.47. /为斜线48. float m=(pEndy-pStarty)*1.0/(pEndx-pStartx);49. float p;50.51. p=2*m-1;52. if(m>0 && m<=1)53. 54. if(pStartx<pEndx)55. 56. while(pStartx<=pEndx)57. 58. glVertex2f(pStartx+,pStarty);59. if(p>=0)60. 61. p+=2*m-2;62. pStarty+;63. 64. else65. p+=2*m;66. 67. 68. else69. 70. while(pEndx<=pStartx)71. 72. glVertex2f(pEndx+,pEndy);73. if(p>=0)74. 75. p+=2*m-2;76. pEndy+;77. 78. else79. p+=2*m;80. 81. 82.83. return;84. 85.86. p=-2*m-1;87. if(m<0 && m>=-1)88. 89. if(pStartx<pEndx)90. 91. while(pStartx<=pEndx)92. 93. glVertex2f(pStartx+,pStarty);94. if(p>=0)95. 96. p+=-2*m-2;97. pStarty-;98. 99. else100. p+=-2*m;101. 102. 103. else104. 105. while(pEndx<=pStartx)106. 107. glVertex2f(pEndx+,pEndy);108. if(p>=0)109. 110. p+=-2*m-2;111. pEndy-;112. 113. else114. p+=-2*m;115. 116. 117.118. return;119. 120.121. p=2/m-1;122. if(m>1)123. 124. if(pStarty<pEndy)125. 126. while(pStarty<=pEndy)127. 128. glVertex2f(pStartx,pStarty+);129. if(p>=0)130. 131. p+=2/m-2;132. pStartx+;133. 134. else135. p+=2/m;136. 137. 138. else139. 140. while(pEndy<=pStarty)141. 142. glVertex2f(pEndx,pEndy+);143. if(p>=0)144. 145. p+=2/m-2;146. pEndx+;147. 148. else149. p+=2/m;150. 151. 152.153. return;154. 155.156. p=-2/m-1;157. if(pStarty<pEndy)158. 159. while(pStarty<=pEndy)160. 161. glVertex2f(pStartx,pStarty+);162. if(p>=0)163. 164. p+=-2/m-2;165. pStartx-;166. 167. else168. p+=-2/m;169. 170. 171. else172. 173. while(pEndy<=pStarty)174. 175. glVertex2f(pEndx,pEndy+);176. if(p>=0)177. 178. p+=-2/m-2;179. pEndx-;180. 181. else182. p+=-2/m;183. 184. 185. 186.187. /画圆/188. /其他象限绘制189. void CirclePoints(int x,int y) 190. /第1象限191. glVertex2f(x,y);192. glVertex2f(y,x);193. /第2象限194. glVertex2f(-x,y);195. glVertex2f(-y,x);196. /第3象限197. glVertex2f(-y,-x);198. glVertex2f(-x,-y);199. /第4象限200. glVertex2f(x,-y);201. glVertex2f(y,-x);202. 203. 204. /中点算法画圆205. void DrawCircle(int cx,int cy,int radis)206.207. glPushMatrix();208. glTranslatef(cx,cy,0);209. glPointSize(1);210. glColor3f(0.5f, 0.5f, 1.0f);211. glBegin(GL_POINTS);212.213. int x,y;214. double p;215. x=0;216. y=radis;217. p=1.25-radis;218. while(x<=y+1)219. 220. CirclePoints(x,y);221. x+;222. if(p>=0)223. 224. y-;225. p+=2.0*(x-y)+5;226. 227. else228. p+=2*x+3;229. 230. glEnd();231. glPopMatrix();232. 233.234.235. /绘制坐标轴236. void DrawOx()237. glColor3f(0.95, 0.7, 0.8);238. glPointSize(1);239. glBegin(GL_LINES);240. glVertex2f(-winWidth/2,0);241. glVertex2f(winWidth/2,0);242. glVertex2f(0,winHeight/2);243. glVertex2f(0,-winHeight/2);244. glEnd();245. 246.247. /显示函数248. void Display()249. /GL_COLOR_BUFFER_BIT(用背景颜色填充)250. glClear(GL_COLOR_BUFFER_BIT);251.252. DrawOx();253.254. glColor3f(0.0,0.0,1.0);255. 256. glBegin(GL_POINTS);257. /BresenhamLine(px1, py1, px2, py2);258. Draw_Bresenham(px1, py1, px2, py2);259. glEnd();260. glBegin(GL_POINTS);261. Draw_Bresenham(py1, px1, py2, px2);262. glEnd();263. /glBegin(GL_LINES);264. /glVertex2f(px1,py1);265. /glVertex2f(px2,py2);266. /glVertex2f(py1,px1);267. /glVertex2f(py2,px2);268. /glEnd();269.270. DrawCircle(cx,cy,r);271. DrawCircle(cy,cx,r);272.273. /交换缓冲区274. glutSwapBuffers();275. /glFlush();/ 刷新绘图命令276. 277.278.279. / 设置渲染状态(听起来满下人,实际上很简单)280. void SetupRC(void)281. 282. /清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景颜色283. /和glColor4f(1.0f, 0.0f, 0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的284. /最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明285. glClearColor(1.0f, 1.0f, 1.0f,1.0f);286. 287.288. / 当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,289. /几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧290. void ChangeSize(int w, int h)291. 292. winWidth = w;293. winHeight = h;294. / 设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)295. glViewport(0,0,w,h);296. / 重置坐标系统,指定设置投影参数297. glMatrixMode(GL_PROJECTION);298. /调用单位矩阵,去掉以前的投影参数设置299. glLoadIdentity();300. /设置投影参数301. gluOrtho2D(-w/2,w/2,-h/2,h/2);302. 303.304. /鼠标点击305. void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)306. if(button=GLUT_LEFT_BUTTON && action=GLUT_DOWN)307. px1 = xMouse - winWidth/2;308. py1 = winHeight/2 - yMouse;309. 310. if(button=GLUT_LEFT_BUTTON && action=GLUT_UP)311. px2 = xMouse - winWidth/2;312. py2 = winHeight/2 - yMouse;313. glutPostRedisplay();314. 315. if(button=GLUT_RIGHT_BUTTON && action=GLUT_DOWN)316. cx=xMouse-winWidth/2;317. cy=winHeight/2-yMouse;318. 319. 320. /鼠标移动321. void MouseMove(GLint xMouse,GLint yMouse)322. px2 = xMouse - winWidth/2;323. py2 = winHeight/2 - yMouse;324. r=sqrt(pow(xMouse-winWidth/2-cx),2)+pow(winHeight/2-yMouse-cy),2);325. glutPostRedisplay();326. 327.328. / 主函数329. int main(int argc, char* argv)330. 331. glutInit(&argc, argv);332. /设置显示模式333. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);334. /设置窗口大小像素335. glutInitWindowSize(600, 600);336. /设置窗口出现在屏幕的位置337. glutInitWindowPosition(300,160);338. /建立一个叫OpenGL的窗口339. glutCreateWindow("OpenGL-Line");340. 341. /调用函数Display进行绘制342. glutDisplayFunc(Display);343. /调用鼠标移动函数344. /glutPassiveMotionFunc(PassiveMouseMove);345. glutMotionFunc(MouseMove);346. /调用鼠标点击函数347. glutMouseFunc(MousePlot);348. 349. /如果窗口大小改变则调用函数ChangeSize重新进行绘制350. glutReshapeFunc(ChangeSize);351. /清屏352. SetupRC();353. /循环绘制354. glutMainLoop();355. 356. return 0;357.

    注意事项

    本文(实验一OpenGL直线圆的绘制.doc)为本站会员(小**)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开