计算机图形学如何判断鼠标点击在里面还是外面将cad图形填充颜色

计算机图形学实验指导
OpenGL…………………………………………..
计算机图形学实验指导
 &&& 一、实验目的
??1、培养学生动手编程解决实际问题的能力。
??2、训练学生分析问题和调试程序的能力。
??3、锻炼学生撰写科技实验论文的能力。
  二、实验要求
??1、问题分析
??充分地分析和理解问题本身,弄清要求做什么,用什么算法。
??2、程序设计
??(1)根据所采用的算法,设计数据结构,画出流程图并编程。
??(2)最后准备调试程序的数据及测试方案。
??3、上机调试
??(1)对程序进行编译,纠正程序中可能出现的语法错误。
??(2)调试前,先运行一遍程序看看究竟将会发生什么。
??(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
??4、整理实习报告
  三、实验报告
??1、实验内容:采用的算法名称
??2、问题描述:包括目标、任务、条件约束描述等。
??3、设计:数据结构设计和核心算法设计。主要功能模块的输入,处理(算法框架)和输出。
??4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
??5、心得:包括程序的改进设想,经验和体会。
??6、程序清单:源程序,其中包括变量说明及详细的注释。
实验一 OpenGL程序设计
&&&&&& 2mouseint button,int
state,int x,int ydisplay()
)考虑到该裁剪窗口和裁剪线段的大小,建议将reshape()函数中的正交投影函数参数变为glOrtho(-5.0, 5.0,
-5.0, 5.0, -1.0, 1.0);
glClearColor (0.0, 0.0,
0.0, 0.0);
glShadeModel (GL_FLAT);
(GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
中第一、二、三个参数分别表示半径,经度线数、纬度线数
glutWireSphere(1.0, 20, 16);&& /* draw sun */
glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) day, 0.0,
1.0, 0.0);
glutWireSphere(0.2, 10, 8);&&& /* draw smaller planet */
glPopMatrix();
glutSwapBuffers();
glViewport (0, 0,
(GLsizei) w, (GLsizei) h);
glMatrixMode
(GL_PROJECTION);
glLoadIdentity ();
gluPerspective(60.0,
(GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (0.0, 0.0,
5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
switch (key) {
day = (day + 10) % 360;
glutPostRedisplay();
day = (day - 10) % 360;
glutPostRedisplay();
year = (year + 5) % 360;
glutPostRedisplay();
year = (year - 5) % 360;
glutPostRedisplay();
glutInit(&argc,
glutInitDisplayMode
(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize
(500, 500);
glutInitWindowPosition
(100, 100);
glutCreateWindow (argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
&&&&&& 2Bezier
600600gluOrtho2D(-50.0,50.0,-50.0,50.0)
1P0-40.0-40.00.0P110.0-200.00.0R030.0240.00.0R130.0-240.00.0Hermite
2P0-40.0-40.00.0P1-10.0200.00.0P210.0-200.00.0P340.040.00.0Bezier
3P0-40.0-40.00.0P1-10.0200.00.0P210.0-200.00.0P340.040.00.0Bezier
4P0-40.0-40.00.0P1-10.0200.00.0P210.0-200.00.0P340.040.00.0B
CayleykochSierpinskiMandelbrot
1CayleyTC.
#include &graphics.h&
#include &math.h&
#define PI 3.1415926
void cayley(int n,float x0,float
y0,float len,int th)
&float x1,y1,x2,y2,x3,y3;
&int th1=20,th2=20;
&float scale=0.7,dtor=PI/180,sl=scale*
&x1=x0+len*cos(th*dtor);
&y1=y0-len*sin(th*dtor);
&x2=x1+sl*cos((th+th1)*dtor);
&y2=y1-sl*sin((th+th1)*dtor);
&x3=x1+sl*cos((th-th2)*dtor);
&y3=y1-sl*sin((th-th2)*dtor);
&line(x0,y0,x1,y1);
&line(x1,y1,x2,y2);
&line(x1,y1,x3,y3);
&cayley(n-1,x1,y1,sl,th+th1);
&cayley(n-1,x1,y1,sl,th-th2);
&float x=320.0,y=470.0;
&int th=90,len=120;
&int gdriver=DETECT,
&initgraph(&gdriver,&gmode,&&);
&setcolor(GREEN);
&cayley(2,x,y,len,th);
&cayley(3,x,y,len,th);
&cayley(5,x,y,len,th);
&cayley(10,x,y,len,th);
&cayley(15,x,y,len,th);
&closegraph();
2KOCH; KochKOCHC
#include&&graphics.h&
#include&&math.h&
float&x=80,y=420;
int&th=0,L=6;
float&dtor=3.;
void koch(int n)
& moveto(x,y);
& x+=d*cos(th*dtor);
& y-=d*sin(th*dtor);
& lineto(x,y);
&koch(n-1);
&koch(n-1);
&koch(n-1);
&koch(n-1);
&int gdriver=DETECT,
&initgraph(&gdriver,&gmode,&&);
&cleardevice();
&setbkcolor(0);
&setcolor(9);
&line(80,60,560,60);
&moveto(80,240);
&lineto(240,240);
&lineto(320,100);
&lineto(400,240);
&lineto(560,240);
&settextstyle(2,0,5);
&outtextxy(40,50,&(a)&);
&outtextxy(40,230,&(b)&);
&outtextxy(40,410,&(c)&);
&closegraph();
&cleardevice();
3Sierpinski;SierpinskiC
#include &graphics.h&
#include &math.h&
#include &stdlib.h&
#include &conio.h&
#include &time.h&
#define N 65535 /**/
/*=============================================================*/
{ int GraphDriver=DETECT;
int GraphM
unsigned int k,
double TempX,TempY,StartX,StartY;
initgraph(&GraphDriver,&GraphMode,&c:\\bc31\\bgi&);
randomize();
/*===============================================================*/
/*Draw triangle (IFS)*/
/*==============================================================*/
setbkcolor(BLUE);
cleardevice();
TempX=(double)getmaxx();
TempY=(double)getmaxy();
StartX=TempX;
StartY=TempY;
for(k=1;k&N;k++)
{ TempX=TempX*0.5;
TempY=TempY*0.5;
mod=random(32766) % 3;
switch(mod)
case 1: TempX+=(double)StartX*0.5;
case 2: TempY+=(double)StartY*0.5;
putpixel((int)TempX,(int)TempY,YELLOW);
closegraph();
4MandelbrotZ
&&&&&&&&&&&&&&&&&&&& Z0=Z;
&&&&&&&&&&&&&&&&&&&& ZK=ZK-12+Z0;& K=1,2,3,….N
Z2ZZMandelbrot
&&&&&& 2Z21001000
&&&&&& Mandelbrot
&&&&&&&&&&&&&&&&&&&& -2.25Re(Z)&=0.75
&&&&&&&&&&&&&&&&&&&& -1.25&=Im(Z)&=1.25
#include&graphics.h&
typedef struct {float
x,y;}ComplexN
complexNum complexSquare(complexNum
&&&&&& complexNum
&&&&&& zSquare.x=z.x*z.x-z.y*z.y;
&&&&&& zSquare.y=2*z.x*z.y;
&&&&&& return
int mandelSqTransf(complexNum z0,int
&&&&&& complexNum
&&&&&& GLint
&&&&&& /*quit
when z*z&4 */
&&&&&& while
((z.x*z.x+z.y*z.y&=4.0) && (count &maxIter)){
&&&&&&&&&&&&& z=complexSquare(z);
&&&&&&&&&&&&& z.x+=z0.x;
&&&&&&&&&&&&& z.y+=z0.y;
&&&&&&&&&&&&& count++;
&&&&&& return
void mandelbrot(int nx,int
maxIter,,float realmin,float realmax,float imagmin,float imagmax)
&&&&&& float
realInc=(realmax-realmin)/
&&&&&& float
imagInc=(imagmax-imagmin)/
&&&&&& ComplexNum
&&&&&& int
&&&&&& int
&&&&&& for(x=0,z.x=x&x++,z.x+=realInc)
&&&&&&&&&&&&& for(y=0.z.y=y&y++,z.y+=imagInc){
&&&&&&&&&&&&&&&&&&&& cnt=iterate(z.maxIter);
&&&&&&&&&&&&&&&&&&&& if(cnt=maxIter)
&&&&&&&&&&&&&&&&&&&&&&&&&&& putpixel(x,y,BLACK);
&&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&&&&& putpixel(x,y,cnt);
&&&&&&&&&&&&& }
1glRecti(GLint
x1,GLint y1, GLint x2,GLint y2)
glutMotionFunc()
glutMotionFunc ( void ( *f ) ( int&
x , int& y ) )//(x,y)
#include &GL/glut.h&
int xstart,ystart,xend,
void mousemove(int xmove,int ymove)
&&&&&& glEnable(GL_COLOR_LOGIC_OP);
&&&&&& glLogicOp(GL_XOR);
&&&&&& glBegin(GL_LINES);
&&&&&&&&&&&&& glVertex2i(xstart,ystart);
&&&&&&&&&&&&& glVertex2i(xend,yend);
&&&&&& glEnd();
&&&&&& xend=
&&&&&& yend=hh-
&&&&&& glBegin(GL_LINES);
&&&&&&&&&&&&& glVertex2i(xstart,ystart);
&&&&&&&&&&&&& glVertex2i(xend,yend);
&&&&&& glEnd();
&&&&&& glFlush();
void mouseud (int btn,int state,int
(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
&&&&&&&&&&&&& xstart
&&&&&&&&&&&&& ystart
&&&&&&&&&&&&& xend=
&&&&&&&&&&&&& yend=
&&&&&& else
&&&&&&&&&&&&& if(btn==GLUT_LEFT_BUTTON
&& state == GLUT_UP)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& xend
&&&&&&&&&&&&&&&&&&&& yend
&&&&&&&&&&&&&&&&&&&& glDisable(GL_COLOR_LOGIC_OP);
&&&&&&&&&&&&&&&&&&&& glBegin(GL_LINES);
&&&&&&&&&&&&&&&&&&&&&&&&&&& glVertex2i(xstart,ystart);
&&&&&&&&&&&&&&&&&&&&&&&&&&& glVertex2i(xend,yend);
&&&&&&&&&&&&&&&&&&&& glEnd();
&&&&&&&&&&&&&&&&&&&& glFlush();
&&&&&&&&&&&&& }
void reshape(int w, int h)
&&&&&& glViewport(0,0,w,h);
&&&&&& glMatrixMode(GL_PROJECTION);
&&&&&& glLoadIdentity();
&&&&&& gluOrtho2D(0.0,(GLfloat)w,0.0,(GLfloat)h);
&&&&&& hh=h;
&&&&&& glMatrixMode(GL_MODELVIEW);
&&&&&& glLoadIdentity();
&&&&&& glClear(GL_COLOR_BUFFER_BIT);
void init(void)
&&&&&& glClearColor(0.0,0.0,0.0,0.0);
void display(void)
&&&&&& glColor3f(1.0,0.0,0.0);
&&&&&& glFlush();
void main(int argc, char **argv)
&&&&&& glutInit(&argc,argv);
&&&&&& glutInitDisplayMode
(GLUT_SINGLE| GLUT_RGB);
&&&&&& init();
&&&&&& glutInitWindowPosition(100,100);
&&&&&& glutInitWindowSize(500,500);
&&&&&& glutCreateWindow(&&);
&&&&&& glutDisplayFunc(display);
&&&&&& glutMotionFunc(mousemove);&&&&&
&&&&&& glutMouseFunc(mouseud);
&&&&&& glutReshapeFunc(reshape);&&&
&&&&&& glutMainLoop();&&&&
1& glutCreateMenu()
glutCreateMenu ( void (*f) ( int value) )//
2glutAddMenuEntry()
glutAddMenuEntry ( char *name, int value)
3glutAttachMenu()
void& glutAttachMenu ( int button ) //buttonGLUT_RIGHT_BUTTONGLUT_LEFT_BUTTON
&&&&&& Void
glutAddSubMenu ( char *name, int menu )//namenameMenu
&&&&&& glutAddMenu()
1glutCreateMenu
2glutAddSubMenu ( char *name, int menu )
GLsizei winWidth = 400,
winHeight = 400;& // Initial
Display-window size.
GLfloat red = 1.0,
green = 1.0, blue = 1.0;& // Initial
triangle color: white.
GLenum fillMode =
GL_SMOOTH;& // Initial polygon fill:
color interpolation.
void init (void)
glClearColor (0.6, 0.6, 0.6, 1.0);&
// Set display-window color to gray.
glMatrixMode (GL_PROJECTION);
gluOrtho2D (0.0, 300.0, 0.0, 300.0);
&void fillOption (GLint selectedOption)
switch (selectedOption) {
case 1:& fillMode =
GL_FLAT;&&& & //&
Flat surface rendering.
case 2:& fillMode =
GL_SMOOTH;& & //&
Gouraud rendering.
glutPostRedisplay ( );
void displayTriangle
glClear (GL_COLOR_BUFFER_BIT);
glShadeModel (fillMode);&&&&&&&&&&
//& Set fill method for
glColor3f (red,
green, blue);&& //& Set color for first two vertices.
glBegin (GL_TRIANGLES);
glVertex2i (280, 20);
glVertex2i (160, 280);
glColor3f (red, 0.0,
0.0);&&& // Set color of
last vertex to red.
glVertex2i (20, 100);
glEnd ( );
glFlush ( );
void reshapeFcn (GLint
newWidth, GLint newHeight)
glViewport (0, 0, newWidth, newHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
gluOrtho2D (0.0, (GLfloat) newWidth, 0.0, (GLfloat )newHeight);
displayTriangle ( );
glFlush ( );
void main (int argc,
char **argv)
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (200, 200);
glutInitWindowSize (winWidth, winHeight);
glutCreateWindow (&Menu Example&);
glutDisplayFunc (displayTriangle);
glutCreateMenu (fillOption);&&&&&&&&&&&&&
// Create pop-up menu.
glutAddMenuEntry (&Solid-Color Fill&, 1);
glutAddMenuEntry (&Color-Interpolation Fill&, 2);
/*& Select a menu option
using the right mouse button.& */
glutAttachMenu (GLUT_RIGHT_BUTTON);
glutReshapeFunc (reshapeFcn);
glutMainLoop ( );计算机图形学试题-启明星创新实验室
1:请简述计算机图形学的应用领域。答:计算机图形学的应用领域主要是:科学、艺术、工程、商务、工业、医药、政府、娱乐、广告、教学、培训2:名称解释:何谓刷新频率?&何谓分辨率?&何谓像素?&何谓图元?答:刷新式CRT在屏幕上重复画图的频率称为刷新频率;CRT无重叠显示的最多点数称为分辨率;每个可由电子束点亮的屏幕点称为一个像素;图像软件包中用来描述各种图形元素的函数称为图形输出原语,或简称为图元。3:根据三原色原理,一个色彩,其红色分量强度值为1.0,绿色分量强度值为1.0,而蓝色分量强度值为0.0,则该色彩为:黄色。4:分析如下两种计算机图形系统结构的优劣,并说明优劣的原因。图1&计算机图形系统结构1图2&计算机图形系统结构2答:结构1为简单光栅图形系统结构;结构2为带有现实处理器的光栅图形系统结构。结构1优点:帧缓存可以系统存储器的任意位置,视频控制电器通过访问帧缓存来刷新屏幕。为了处理动画效果,在高性能系统中还提供2个帧缓冲;&&&&&&缺点:system&memory&与帧缓存相当于绑定在一起;结构2:优点:将CPU&从图形的复杂出来中解脱出来,提供独立的西那是处理器的存储区域,光栅扫描显示系统的图架构中包含现实处理器。&&&&&&&&缺点:为减少光栅系统中对存储量的需求而采用的行程编码技术对强度的改变难以记录,另外当包含许多短行程时,显示控制器处理光栅式困难的。5:给定如下一段源代码,请分析该代码执行后OpenGL显示窗口内显示的内容。#include&&gl/glut.h&void&showNothing(void){glClearColor(0.0,0.0,1.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glFlush();}void&main(int&argc,&char**&argv){glutInit(&argc,&argv);glutCreateWindow("An&example&OpenGL&program");glutDisplayFunc(showNothing);glutMainLoop();}答:显示一窗口,背景颜色为蓝色,窗口标题为“An&example&OpenGL&program”。6:写出将OpenGL显示窗口左上角设定到像素位置(50,100),显示窗口宽度为400像素且高度为300像素的语句。答:glutInitWindowPosition(50,100);//窗口位置glutInitWindowSize(400,300);//窗口大小7:如果下面三段代码被正确的嵌入到一个可以执行的OpenGL绘图框架中,请问在代码段2中绘制的哪些点可以在代码段3中创建的显示窗口中得到显示?&//代码段1:glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,&300.0,&0.0,&300.0);//代码段2:glBegin(GL_POINTS);glVertex2f(10.0,10.0);glVertex2f(200.0,200.0);glVertex2f(400.0,400.0);glEnd();//代码段3:glutInitWindowSize(100,100);glutInitWindowPosition(50,100);&glutCreateWindow("An&example&OpenGL&program");答:点(10.0,10.0),(200.0,200.0)。8:阅读下面的代码(特别注意粗体部分代码行),分析为什么在显示回调函数showLineSegment中绘制的正方形,结果在显示窗口中看到却是长方形?如果希望在显示回调函数绘制的正方形在显示窗口中仍然显示为正方形,在保证showLineSegment中的代码不变的情况下,该如何处理?(见第一实验代码P7)#include&&gl/glut.h&void&showLineSegment(void){glClearColor(1.0,1.0,1.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,0.0,1.0);glBegin(GL_POLYGON);glVertex2i(100,100);glVertex2i(200,100);glVertex2i(200,200);glVertex2i(100,200);glEnd();glFlush();}void&adjustRatio(GLsizei&w,&GLsizei&h){&&&glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300,0.0,300);}void&main(int&argc,&char**&argv){glutInit(&argc,&argv);glutInitWindowSize(300,600);//1.因为windowsize中长宽比不是1:1glutInitWindowPosition(50,100);glutCreateWindow("An&example&OpenGL&program");glutDisplayFunc(showLineSegment);glutReshapeFunc(adjustRatio);glutMainLoop();}答:1.&因为windowsize中长宽比不是1:1;2.将函数adjustRatio(GLsizei&w,&GLsizei&h)中“gluOrtho2D(0.0,300,0.0,300);”改为如下代码:if&(w&&=&h)gluOrtho2D(0.0,300,0.0,300*h/w);elsegluOrtho2D(0.0,300*w/h,0.0,300);9:阅读下面的代码,(1)请简要描述该代码执行后的效果;(2)如果将myIdle函数中的glutPostRedisplay()使用myDisplay()函数替换,能否看到动画效果?(3)如果将myDisplay函数中的glFlush()替换为glutSwapBuffers(),能够看到动画效果?#include&&gl/glut.h&GLfloat&tx&=&0.0;GLfloat&ty&=&0.0;void&init(void){&&&glClearColor(0.0,0.0,0.0,0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void&myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POLYGON);glVertex2f(tx,ty);glVertex2f(20+tx,ty);glVertex2f(20+tx,20+ty);glVertex2f(tx,20+ty);&&&&glEnd();glFlush();//glutSwapBuffers();}void&myIdle(void){tx&+=&0.01;ty&+=&0.01;if&(tx&300.0)&tx&=&0.0;if&(ty&300.0)&ty&=&0.0;glutPostRedisplay();//myDisplay();}void&main(int&argc,&char**&argv){glutInit(&argc,&argv);glutInitDisplayMode(GLUT_SINGLE&|&GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(300,300);glutCreateWindow("MultiObject&Animation");init();glutIdleFunc(myIdle);glutDisplayFunc(myDisplay);glutMainLoop();}答:1.看到一个红色小方块在黑色背景窗口里一直进行从左下到右上运动;2.能;3.不能。10:在鼠标的交互式控制中,OpenGL可以通过检查按下鼠标的状态来进行相应的控制。阅读如下代码,并分析鼠标左键单击和鼠标右键单击情况下,观察到的程序执行结果有何不同。#include&&gl/glut.h&#include&&windows.h&GLfloat&tx&=&0.0;GLfloat&ty&=&0.0;void&init(void){&&&glClearColor(0.0,0.0,0.0,0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void&myIdle(void){tx&+=&0.01;ty&+=&0.01;if&(tx&300.0)&tx&=&0.0;if&(ty&300.0)&ty&=&0.0;glutPostRedisplay();}void&myMouseClick(int&button,&int&state,&int&x,&int&y){if&(button&==&GLUT_LEFT_BUTTON&&&&state&==&GLUT_DOWN)glutIdleFunc(myIdle);if&(button&==&GLUT_RIGHT_BUTTON&&&&state&==&GLUT_DOWN)glutIdleFunc(NULL);}void&myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POLYGON);glVertex2f(tx,ty);glVertex2f(20+tx,ty);glVertex2f(20+tx,20+ty);glVertex2f(tx,20+ty);&&&&glEnd();glutSwapBuffers();}void&main(int&argc,&char**&argv){glutInit(&argc,&argv);glutInitDisplayMode(GLUT_DOUBLE&|&GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(300,300);glutCreateWindow("MultiObject&Animation");init();glutMouseFunc(myMouseClick);&glutDisplayFunc(myDisplay);glutMainLoop();}答:鼠标左键单击,红色方块从左下角往右上角开始运动;鼠标右键单击,红色方块停止运动。11:给定如下三行代码段,试分析最初绘制的黄色长方形所历经的几何变换的秩序。&&glColor3f(1.0,1.0,0.0);glRotatef(90.0,0.0,0.0,1.0);/旋转glTranslatef(-100.0,0.0,0.0);//平移glScalef(0.5,1.0,1.0);//缩放glRecti(50,100,150,150);//绘制一个黄色长方形答:先缩放后平移再旋转在x方向缩放0.5被,y轴z轴方向不变;再在x轴方向上平移-100个单位;最后生成绕z轴旋转90°的图形;12:给定如下的显示回调函数的代码片段,假定glLoadIdentity()函数定义的矩阵为,glTranslatef(50.0,50.0,0.0);定义的矩阵为,glRotatef(90.0,0.0,0.0,1.0);定义的矩阵为,glTranslatef(-100.0,0.0,0.0);定义的矩阵为,glScalef(0.5,1.0,1.0);定义的矩阵为。假定Line&2代码执行后MODELVIEW矩阵堆栈状态为:
试分析Line&5,&Line&7,&Line&9,&Line&10,&Line&12,&Line&14,&Line&16,&Line&17每一行代码执行后,MODELVIEW矩阵堆栈状态。glMatrixMode(GL_MODELVIEW);//&Line&1glLoadIdentity();//&Line&2&&&&&glColor3f(1.0,0.0,0.0);&//&Line&3glRecti(50,100,200,150);&//&Line&4glPushMatrix();//&Line&5glColor3f(0.0,1.0,0.0);&//&Line&6glTranslatef(50.0,50.0,0.0);&//&Line&7&glRecti(50,100,200,150);&//&Line&8glPopMatrix();//&Line&9glPushMatrix();//&Line&10glColor3f(0.0,0.0,1.0);&//&Line&11glRotatef(90.0,0.0,0.0,1.0);&//&Line&12&glRecti(50,100,200,150);&//&Line&13glPopMatrix();//&Line&14glColor3f(1.0,1.0,0.0);&//&Line&15glTranslatef(-100.0,0.0,0.0);&//&Line&16glScalef(0.5,1.0,1.0);&//&Line&17glRecti(50,100,200,150);&//&Line&18答:glMatrixMode(GL_MODELVIEW);//&Line&1glLoadIdentity();//&Line&2&&I
&&&&&glColor3f(1.0,0.0,0.0);&//&Line&3glRecti(50,100,200,150);&//&Line&4glPushMatrix();//&Line&5&&
glColor3f(0.0,1.0,0.0);&//&Line&6glTranslatef(50.0,50.0,0.0);&//&Line&7&
glRecti(50,100,200,150);&//&Line&8glPopMatrix();//&Line&9
glPushMatrix();//&Line&10
glColor3f(0.0,0.0,1.0);&//&Line&11glRotatef(90.0,0.0,0.0,1.0);&//&Line&12&
glRecti(50,100,200,150);&//&Line&13glPopMatrix();//&Line&14
glColor3f(1.0,1.0,0.0);&//&Line&15glTranslatef(-100.0,0.0,0.0);&//&Line&16glScalef(0.5,1.0,1.0);&//&Line&17
13:给定如下的代码行,请分析该程序执行后在显示窗口你将观察到的场景。#include&&gl/glut.h&void&display(){glClearColor(1.0,1.0,1.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,0.0,0.0);glMatrixMode(GL_PROJECTION);glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);&//使用glOrtho函数可以将当前的可视空间设置为正投影空间。glOrtho(左,右,下,上,远,近)。glMatrixMode(GL_MODELVIEW);gluLookAt(0.0,0.0,0.0,0.0,0.0,-1.0,0.0,1.0,0);&glutWireCube(0.5); //绘制边长为0.5的线框式立方体,且立方体的中心和世界坐标系原点重合glFlush();}void&main(int&argc,&char**&argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(0,0);glutCreateWindow("Orthogonal&projection");glutDisplayFunc(display);glutMainLoop();}14:给定如下的显示回调函数的代码片段,glMatrixMode(GL_PROJECTION);//line&1glLoadIdentity();//line&2glOrtho(-1.0,1.0,-1.0,1.0,-1.0,);//line&3glMatrixMode(GL_MODELVIEW);//line&4glLoadIdentity();//line&5gluLookAt(1.0,0.5,1.0,0.0,0.0,0.0,0.0,1.0,0);&//line&6glutWireCube(0.5);//line&7glFlush();//line&8如果将line&6代码用gluLookAt(0.0,.0,0.0,0.0,0.0,1.0,0);代替,那么代替前后在显示窗口上OpenGL绘制的立方体是否相同?原因是什么?答:相同,因为在正交投影情况下,改变观察位置,但不改变观察方向和向上方向,对最终观察结果没有影响。15:给定如下四个显示回调函数的代码片段,试分析每个代码片段执行后绘制的立方体是否在正平行投影的可视化范围内?&(1)显示回调函数代码片段1:glOrtho(-1.0,1.0,-1.0,1.0,-1.0,2.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(1.0,0.5,1.0,0.0,0.0,0.0,0.0,1.0,0);glutWireCube(0.5);答:是(2)显示回调函数代码片段2:glOrtho(-1.0,1.0,-1.0,1.0,-1.0,);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0,.0,0.0,0.0,0.0,1.0,0);glutWireCube(0.5);答:是(3)显示回调函数代码片段3:glOrtho(-1.0,1.0,-1.0,1.0,-1.0,2.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0,.0,0.0,0.0,0.0,1.0,0);glutWireCube(0.5);答:否(4)显示函调函数代码片段4:glOrtho(-1.0,1.0,-1.0,1.0,-1.0,);//glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(1.0,0.5,1.0,0.0,0.0,0.0,0.0,1.0,0);glutWireCube(0.5);答:是16:给定如下的显示回调函数,试分析此时OpenGL定义的是点光源还是无穷远光源?如果是点光源,请分析该光源在世界坐标系中的位置。void&display(void){&GLfloat&light0_pos[4]&=&{0.0,&0.0,&0.0,&1.0};glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glLightfv(GL_LIGHT0,&GL_POSITION,&light0_pos); gluLookAt(4.0,4.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);glutSolidTeapot(1.0);//glut&object,自动计算每个顶点的法向量glutSwapBuffers();}答:点光源(4.0,4.0,4.0)17:给定如下的显示回调函数,试分析此时OpenGL定义的是点光源还是无穷远光源?如果是点光源,请分析该光源在世界坐标系中的位置。void&display(void){GLfloat&light0_pos[4]&=&{0.0,&0.0,&0.0,&1.0};&&&&glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(4.0,4.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);glLightfv(GL_LIGHT0,&GL_POSITION,&light0_pos);&glutSolidTeapot(1.0);&glutSwapBuffers();}答:点光源(0.0,0.0,0.0)18:给定如下的显示回调函数,请大致描述一下你将在显示窗口观察到的渲染场景。&void&display(void){&&&&glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(4.0,4.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);glPushMatrix();glRotatef(theta,0.0,1.0,0.0);//theta表示一个随时间变化而变化的角度值glLightfv(GL_LIGHT0,&GL_POSITION,&light0_pos);glPopMatrix();glutSolidTeapot(1.0);glutSwapBuffers();}答:茶壶可以有鼠标控制沿z轴旋转;光源和观察者绕着物体旋转,并且物体没有动(但是看起是物体在动,而光源和观察者没有动)。19:在齐次坐标表示方法下,坐标位置的二维平移变换可以使用下面的矩阵乘法表示: (1)其中,和分别表示方向和方向的平移量。另外,坐标位置的二维绕原点旋转可以使用下面的矩阵乘法表示: (2)其中,表示旋转的角度。给定二维空间的任意一点,请给出坐标位置绕点旋转角度的矩阵乘法表示公式。答:先平移再旋转。分两步完成。先将点平移到原点,然后在绕原点进行旋转。最后&20:在齐次坐标表示方法下,坐标位置的二维平移变换可以使用下面的矩阵乘法表示: (1)其中,和分别表示方向和方向的平移量。另外,坐标位置的二维相对于原点的缩放可以使用下面的矩阵乘法表示: (2)其中,和分别表示在方向和方向的缩放系数。给定二维空间的任意一点,请给出坐标位置相对于点且在方向和方向的缩放系数为和的矩阵乘法表示公式。答:先缩放再平移。整个过程分两步完成。最后&&21:说明OpenGL核心库、OpenGL实用库和OpenGL实用工具包之间的区别。答:OpenGL核心库:这部分函数常用于常规的、核心的图形处理,是OpenGL的核心部分,包含300多个函数,函数名前缀一律是“gl”,核心库可以在所有的OpenGL平台上运行;&OpenGL实用库:这部分函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。包含约50个函数,函数名前缀一律是“glu”,实用库可以在所有的OpenGL平台上运行。&OpenGL的使用工具包:这部分函数主要提供基于窗口的工具,以及一些绘制较复杂物体的函数。包含大约30多个函数,函数名前缀为“glut”,glut中的窗口管理函数不依赖于运行环境,可以在所有的OpenGL平台上运行22:试分析三种画线算法:直线方程法、DDA方法、Bresenham方法的优劣。&直线方程法的基本思想:根据直线的几何方程确定线段路径上的像素位置。&Bresenham算法的特点是:1,不必计算直线之斜率,因此不做除法;2,不用浮点数,只用整数;3,只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现.Bresenham算法速度很快,并适于用硬件实现.DDA算法的特点:浮点数运算不易硬件实现中点画线法特点:只有整数运算,不含乘除法可用硬件实现因(X0,Y0)在直线上,所以F(X0,Y0)=0

我要回帖

更多关于 ai不规则图形填充颜色 的文章

 

随机推荐