




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言球体纹理图像不用常规纹理图像,编程把一个五角星纹理图像绘制到球体上。实现这一过程的关键是判断空间上的点是位于五角星内部还是外部。如果是在五角星内部用红色绘制,在外部用黄色绘制,然后用一条蓝带把球体分成两半。第一步,确定五角星形状,以此为依据检测空间上的点是否位于五角星之内。如下图所示: 图1、五角星形状平面图图1是五角星形状平面图,a1至a5五等分圆,b1至b5在五等分圆的基础上增加一个角度以确定五角星的大小。第二步,以a1b3,a2b4,a3b5,a4b1,a5b2五条边界直线为依据判断空间上的点位置是在五角星内部还是外部。任何片断如果至少位于4条边界线内,那么它在五角星内部,否则在五角星之外。图2、球体纹理图像实物图直线的斜率截距方程为:y=kx+b其中,k表示斜率,b是y轴截距。给定线段的两个端点,(x1,y1)和(x2,y2),可计算出斜率k和截距b。k=(y2-y1)/(x2-x1)b=y1-kx1;球面的参数方程为:球体纹理图像实现过程,首先用球面参数方程建造球体,然后用直线斜率截距方程根据条件判断球面体上的点位于哪个空间,最后按要求着色。下面为程序清单:#include glglut.h#include math.h#define ANGLE 72/五等分圆(五角星顶点角度)#define DTANGLE 12/偏移角度(确定五角星的大小)#define PI 3.1415926#define EX 150/视点X分量#define EY 150/视点Y分量#define EZ -150/视点Z分量float clr3=0.6,0.0,0.0;float cly3=0.6,0.5,0.0;float clb3=0.0,0.3,0.6;void lightm()GLfloat lamb14=0.3f,0.3f,0.3f,1.0f;GLfloat ldif14=0.55f,0.55f,0.55f,1.0f;GLfloat lspe14=0.5f,0.5f,0.5f,1.0f;GLfloat lpos14=200.0f,200.0f,-200.0f,1.0f;GLfloat mamb4=0.3f,0.3f,0.3f,1.0f;GLfloat mdif4=0.2f,0.2f,0.2f,1.0f;GLfloat mspe4=0.3f,0.3f,0.3f,1.0f;GLfloat memi4=0.3f,0.3f,0.3f,1.0f;GLfloat mshininess=128.0f;glLightfv(GL_LIGHT2,GL_AMBIENT,lamb1);glLightfv(GL_LIGHT2,GL_DIFFUSE,ldif1);glLightfv(GL_LIGHT2,GL_SPECULAR,lspe1);glLightfv(GL_LIGHT2,GL_POSITION,lpos1);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mamb);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mdif);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mspe);glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,memi);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mshininess);/=-=-=-=-=-=-=-=-=-=-= 建立五角星数据 =-=-=-=-=-=-=-=-=-=-=-=/数据返回在(px1,py1,px2,py2)数组中void MakeCircleData(float r,float px15,float py15,float px25,float py25)float tm1,tm2;for(int i=0;i5;i+)tm1=i*ANGLE*PI/180.0;tm2=(i*ANGLE+DTANGLE)*PI/180.0;px1i=r*cos(tm1);py1i=r*sin(tm1);px2i=r*cos(tm2);py2i=r*sin(tm2);/=-=-=-=-=-=-=-=-=-=-=-= 计算直线斜率 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=float GetLineK(float x1,float y1,float x2,float y2)float k;k=(y2-y1)/(x2-x1);return k;/=-=-=-=-=-=-=-=-= 判断点(x,y)是在五角星内部还是外部=-=-=-=-=-=-=-=-=int GetFillModel(float x,float y,float px15,float py15, float px25,float py25)int lines5=2,3,4,0,1;float linek5,dx,dy;int i,myInOut=-3;for(i=0;i5;i+)lineki=GetLineK(px1i,py1i,px2linesi,py2linesi);/计算并判断点(x,y)是否在第1条边界线内dx=px22-x;dy=dx*linek0;if(y=px23-dx)myInOut+=1;/计算并判断点(x,y)是否在第3条边界线内dx=px24-x;dy=dx*linek2;if(y=py24-dy)myInOut+=1;/计算并判断点(x,y)是否在第4条边界线内dx=px20-x;dy=dx*linek3;if(y=py20-dy)myInOut+=1;/计算并判断点(x,y)是否在第5条边界线内dy=py21-y;dx=dy/linek4;if(x=1)return 1;/位于五角星内部返回1elsereturn 0;/位于五角星外部返回0/=-=-=-=-=-=-=-=-=-=-=-= 绘制球体纹理图 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=void Drawsolidface(float r,float alfa,float beta)int fillcolor;float sx,sy,sz,sx1,sy1,sz1,ex,ey,ez;float px15,py15,px25,py25;double a1,b1,c,d;float i,j; MakeCircleData(r,px1,py1,px2,py2);c=alfa*PI/180.0;d=beta*PI/180.0;for(j=0;j180;j+=0.3)a1=j*PI/180.0;for(i=0;i360;i+=0.3)b1=i*PI/180.0;sx=r*sin(a1)*cos(b1);sy=r*sin(a1)*sin(b1);sz=r*cos(a1);ex=(EX-sx)*cos(c)*cos(d); ey=(EY-sy)*sin(c)*cos(d); ez=(EZ-sz)*sin(d);/判断点(sx,sz)位于哪个片断着色区fillcolor=GetFillModel(sx,sz,px1,py1,px2,py2);sx1=sx*cos(c)-sy*sin(c);sy1=sx*sin(c)*cos(d)+sy*cos(c)*sin(d)+sz*sin(d);sz1=-sx*sin(c)*sin(d)-sy*cos(c)*sin(d)+sz*cos(d);/片断按要求着色if(sy-9)/蓝带片断着色区glColor3fv(clb);elseif(fillcolor=1)/五角星内部片断着色区glColor3fv(clr);else /五角星外部片断着色区glColor3fv(cly);glEnable(GL_NORMALIZE);glBegin(GL_POINTS);glNormal3f(ex*sx1,ez*sz1,ey*sy1);glVertex3f(sx1,sz1,sy1); glEnd();void RenderScene()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); Drawsolidface(50.0,145,325.0);glutSwapBuffers();void SetupRC()glClearColor(0.3f,0.3f,0.3f,1.0f);lightm();glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1.0);glEnable(GL_LIGHT2);glEnable(GL_COLOR_MATERIAL);void WindowSize(GLsizei w,GLsizei h)GLfloat aspectRatio;GLfloat tmb=100.0;if(h=0)h=1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();aspectRatio=(GLfloat)w/(GLfloat)h;if(w=h)glOrtho(-tmb,tmb,-tmb/aspectRatio,tmb/aspectRatio,10*tmb,-10*tmb);elseglOrtho(-tmb*aspectRatio,tmb*aspectRatio,-tmb,tmb,10*tmb,-10*tmb);glMatrixMode(GL_MODELVIEW);glLoadIdentity();int main(int argc,char *ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广告策划师资格认定考试试卷及答案解析
- 2025年电子音响工程师技术水平测验试卷及答案解析
- 2025年宠物行为学导盲犬面试题库
- 课件与人工智能结合案例
- 课件《牙齿的秘密》
- 2025年慈善募捐专员笔试模拟题
- 2025年心理矫治岗位笔试模拟试卷
- 2025年AR技术中级工程师模拟题集锦
- 2025年乡村振兴专干招聘考试重点题库解析
- 2025年社保待遇核算竞聘面试模拟题
- 广东省汕头市金平区2021-2022学年八年级下学期期末英语卷
- 物流行业固废处理方案
- 申请报建户外货梯的申请书
- DB S63-0011-2021食品安全地方标准 黑果枸杞中花青素含量的测定
- 《如何说孩子才会听怎么听孩子才肯说》读书分享
- 康复科讲课课件
- 《蒙牛乳业集团财务共享服务中心优化研究》
- 工业互联网安全防护措施手册
- 电力建设工程施工安全管理导则
- 2025年软件资格考试信息处理技术员(初级)(基础知识、应用技术)合卷试卷及解答参考
- 2023-2024学年江苏省盐城市盐都区八年级(下)期末物理试卷(含答案)
评论
0/150
提交评论