OSG绘制基本图形实验一

合集下载

实验一:基本图形生成算法实验说明

实验一:基本图形生成算法实验说明

实验一基本图形生成一.实验学时4学时二.实验类型设计型实验三.实验目的和要求1、了解光栅化图形学的主要理论和知识。

2、了解VS的Windows窗口编程中几何图形的绘制调用接口。

3、掌握线段的生成算法原理和算法,掌握微分画线法、中点画线算法的原理,学会用C++程序进行算法的设计。

4、选作:掌握多边形填充算法的基本原理和方法,掌握有序边表法和扫描线种子填充算法的原理,采用C++进行算法的设计。

四、实验内容(一)完成一个图形生成算法的仿真环境,在一个窗口区域中画出坐标系和坐标网格,其中每个坐标网格模拟显示器上的一个像素点。

实验步骤如下:(1)在VS中打开实验的的工程。

(2)在工程中增加一个菜单项:打开linemenu.rc资源在下面增加一个多边形填充的选项。

操作界面图见图1所示。

图1 菜单资源图对新增的菜单选项设置ID值见图2所示。

图2 ID定义界面图(3)在resource.h文件中增加ID_FILL的定义图3 ID定义界面图(4)在circle.cpp文件中增加一个多边形填充的处理switch(message){case WM_COMMAND:hdc=GetDC(hwnd);if(LOWORD(wParam) == ID_BACK){hnewpen=CreatePen(PS_SOLID,1,RGB(0,255,255));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawBackground(hdc);hnewpen=CreatePen(PS_SOLID,2,RGB(0,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawAB(hdc);}else if(LOWORD(wParam)==ID_MID){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DDACircle(hdc,1,5,20,RGB(0,255,255));}else if(LOWORD(wParam) == ID_BRE){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);p[0].SetX(0);p[0].SetY(0);p[1].SetX(5);p[1].SetY(8);p[2].SetX(1);p[2].SetY(10);p[3].SetX(0);p[3].SetY(0);ScanFill(hdc,p,RGB(0,255,255));}SelectObject(hdc,holdpen);DeleteObject(hnewpen);ReleaseDC(hwnd,hdc);break;(二)设计微分画线算法和中点画线算法程序,并进行调试。

实验1 opengl基本图形绘制

实验1 opengl基本图形绘制

实验一、直线的扫描转换系别:计算机学院专业班级: 10信科2姓名:学号实验日期: 2013-3-27 实验报告日期:2013-3-27一、实验目的:理解直线的不同生成算法,并用程序实现。

二、实验环境:1熟悉VC6.0开发平台;2熟悉OpenGL开发库;三、实验内容:1.使用OpenGL中的基本画点函数,分别使用DDA算法、中点算法、Bresenham算法画直线。

要求为每一种算法分别建立对应的函数,函数参数为直线段的端点坐标。

四、实验报告内容1、程序源码;void MidpointMethod(Point point1,Point point2){int x ,y,d,times1,times2,stepX,stepY; //k表示斜率int a,b,c; //a,b ,c分别为直线方程 aX+bY+c=0的参数int i;float k;x=point1.x; y=point1.y;times1=abs(point1.x-point2.x);//循环次数times2=abs(point2.y-point1.y);a=point2.y-point1.y; //求出直线方程 aX+bY+c=0的参数的参数ab=point1.x-point2.x; //求出直线方程 aX+bY+c=0的参数的参数bc=point1.x*(point1.y-point2.y)+point1.y*(point2.x-point1.x); //求出直线方程 aX+bY+c=0的参数的参数cstepX=b/abs(b)*(-1); //stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 stepY=a/abs(a); //stepY表示该直线在y轴上的延伸方向,stepY 值为1,表示直线像素点的纵坐标跳步的方向与Y轴一样,否则为-1k=((float)a)/((float)b)*(-1); //求出斜率kglPointSize(1.0f);glBegin(GL_POINTS);if((0<=k)&&(k<=1)) //斜率为0到1的情况{d=a+0.5*b; //初值for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d>=0) //判断y方向是否走步,stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 //{y+=stepY;d=d+a+b;}elsed=d+a;glVertex2i(x,y);}}else if((1<k)&&(k<=10000)) //斜率大于1的情况{d=b+0.5*a;for(i=0;i<times2;i++) //times表示循环要执行的次数{y+=stepY;if(d*stepY<=0) //判断中点是否在直线的上方,stepY表示该直线在y轴上的延伸方向,stepX值为1,表示直线像素点的纵坐标跳步的方向与x轴一样,否则为-1{x+=stepX;d=d+a+b;}else d=d+b;glVertex2i(x,y);}}else if((-1<=k)&&(k<0)) //斜率为-1到0的情况{d=a+0.5*b;for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d<=0){y+=stepY;d=d+a-b;}elsed=d+a;glVertex2i(x,y);}}else if((-10000<=k)&&(k<-1)) //斜率为小于-1的情况{d=a*0.5+b;for(i=0;i<=times2;i++){y=y+stepY;if(stepY*d>=0){x+=stepX;d=d-a+b;}elsed=d+b;glVertex2i(x,y);}}else //斜率无限大的情况{for(i=0;i<times2;i++){y+=1;glVertex2i(x,y);}}glEnd();}2、实验报告;报告中包含以下内容:①自己编写的绘图函数及其辅助函数。

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。

进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

进程已占用的CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK 个时间片后,将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。

进程每运行一个时间片,优先数减3。

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:i READY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include#include#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead); readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority; blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\"); queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0; readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL; blockQueHead.pre = blockQueHead.nxt = NULL; // 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority; readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\");printf("id: %d, pri: %d, alltime: %d\", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\第%d个时间片后:\", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\模拟进程调度算法结束2145115 刘成路\");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。

osg教程

osg教程

osg教程osg是一种开源的三维图形引擎,可以用于创建各种虚拟现实(VR)和增强现实(AR)应用程序。

它提供了一系列功能强大的工具和库,用于处理3D渲染、触摸输入、模型加载、光照效果等等。

osg的安装非常简单,只需将其添加到您的项目依赖中即可。

然后,您可以使用osg命令集创建和管理您的3D场景。

osg提供了一个多功能的视图器窗口,用于显示您的场景。

您可以使用该窗口的各种方法和属性来控制场景的呈现方式。

例如,您可以设置相机的位置和旋转,调整场景的光照效果和材质属性等等。

osg还支持多种文件格式的模型加载,包括OBJ、3DS、FBX 等等。

您可以使用osg的加载器来加载这些模型,并将其添加到您的场景中。

osg还提供了一系列的节点类,用于创建和管理3D对象。

您可以使用这些节点类来创建几何体、粒子效果、动画和碰撞检测等等。

osg还支持多种光照效果,包括点光源、方向光源、聚光灯等等。

您可以使用osg的光照类来创建和管理这些光源,并将它们应用于您的场景中。

osg还支持触摸输入,可以实现用户的交互操作。

您可以使用osg的事件处理器来处理用户的触摸动作,并根据用户的输入进行相应的操作。

osg还支持虚拟现实和增强现实技术。

您可以使用osg的VR和AR接口来创建和管理VR和AR应用程序,包括头显、手柄、虚拟物体等等。

osg是一个非常强大和灵活的三维图形引擎,非常适合创建各种虚拟现实和增强现实应用程序。

它提供了丰富的功能和工具,使您能够轻松地创建和管理3D场景。

无论您是初学者还是专业开发者,osg都可以满足您的需求,并帮助您实现您的创意。

osg由浅入深的好例子

osg由浅入深的好例子

osg由浅入深的好例子
OSG(OpenSceneGraph)是一个开源的三维图形库,它提供了一
系列强大的工具和功能,用于创建和渲染三维场景。

下面我将从浅
入深为你介绍一些关于OSG的好例子。

首先,从浅层来看,OSG可以用于创建简单的三维场景。

比如,你可以使用OSG来创建一个简单的立方体或球体,并将其渲染到屏
幕上。

这个例子可以帮助初学者了解如何使用OSG的基本功能来创
建和显示简单的三维对象。

其次,从中层来看,OSG可以用于创建更复杂的场景和效果。

比如,你可以使用OSG来创建一个包含多个对象的场景,并添加光照、阴影和纹理等效果。

这个例子可以帮助用户进一步了解如何使
用OSG的高级功能来创建更加真实和生动的三维场景。

最后,从深层来看,OSG还可以用于创建复杂的虚拟现实应用
和仿真系统。

比如,你可以使用OSG来构建一个虚拟的飞行模拟器
或医学仿真系统。

这个例子可以展示OSG在实际应用中的强大功能,以及其在高度复杂的应用中的灵活性和可扩展性。

总的来说,OSG提供了丰富的功能和工具,可以帮助用户从简
单的三维对象到复杂的虚拟现实应用,实现各种各样的三维图形渲
染需求。

通过这些不同层次的例子,可以全面了解OSG的强大之处,以及其在三维图形领域的广泛应用。

希望这些例子能够帮助你更好
地理解OSG的特点和功能。

Photoshop实验指导书

Photoshop实验指导书

Photoshop实验指导书综合实例一火焰字(1)新建一个图像,图像大小及分辨率等数如图1所示,待别注意要将背景要将背景层填充为黑色。

(2)选择文工具,将前景色设置为橙色,输入文字“书吧”,如图2所示。

(3)复制文字图层,单击图层缩略图,隐藏其备用。

选择菜单中的【图层】→【合并可见图层】命令,将可见图层合并为一层。

图1 新建文件图2 输入文字(4)选择菜单中的【虑镜】→【模糊】→【高斯模糊】命令,对文字部分进行适当虚化处理。

(5)下面用【风】虑镜将文字的火焰吹出来。

但因为【风】虑镜只能左右吹而不能上下吹,所以将图层像旋转90o。

选择菜单中的【图像】→【旋转画布】命令将画布向左旋转90o如图4所示。

(6)选择菜单中的【虑镜】→【风格化】→【风】命令,将文字火焰吹出来。

如果火焰吹出来。

如果火焰较短,可以反复重复执行此虑镜,如图4所示。

图4 风滤镜的效果(7)重新选择菜单中的【图像】→【旋转画布】命令,将画布向右旋转90o,使其重新旋转回来,如图5所示。

(8)火焰显得灰暗,需要调节火焰的对比度。

选择菜单中的【图像】→【调整】→【亮度/对比度】命令,完成对比度的调整,如图6所示。

图5旋转画布图6 调整图像对比度(9)选择菜单中的【图像】→【调整】→【曲线】命令,并注意将通道设为红色,调整曲线后,火焰便更加逼真了,如图7所示。

图7 调整火焰的对比度(10)选择菜单中的【虑镜】→【扭曲】→【波纹】命令,给火焰加入【波纹】虑镜,文字火焰出现了飘动的感觉,如图8所示。

图8 对火焰进行扭曲(11)显示先前隐藏备用的文字图层。

在图层控制面板中的单击“图层样式”图标按钮,为文字增加图层效果。

火焰字的最后效果如图9所示。

图9火焰字的最后效果综合实例二爱心银币具体操作步骤如下。

(1)新建一个图像文件,命名为“银币”,图像大小及分辨率如图1所示。

图1 新建文件(2)使用工具箱中的油漆桶工具,对整个图像区域填充灰色,如图2(a)所示。

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图

实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。

进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

进程已占用的CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。

进程每运行一个时间片,优先数减3。

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:iREADY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include<stdio.h>#include<stdlib.h>#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\n");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\n", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\n");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead);readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority;blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\n");queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0;readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL;blockQueHead.pre = blockQueHead.nxt = NULL;// 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\n");printf("id: %d, pri: %d, alltime: %d\n", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\n第%d个时间片后:\n", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\n模拟进程调度算法结束2145115 刘成路\n");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。

实验1__OpenGL基本图形绘制[整理版]

实验1__OpenGL基本图形绘制[整理版]

实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。

二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。

3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。

选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

天津理工大学计算机科学与技术学院实验报告2015 至 2016 学年第二学期源代码:#include <Windows.h>#include<osg/Geode>#include<osgDB/ReadFile>#include<osgUtil/SmoothingVisitor>#include<osgViewer/Viewer>#include <osg/Geometry>#include<osg/Matrixd>#include<osg/MatrixTransform>#include<osg/ShapeDrawable>#include<osgText/Text>#include <osgText/Font>#include <locale.h>void createContent1(osgText::Text& textObject,const char* string); osg::Geode* draw(){osg::ref_ptr<osg::Node> node = new osg::Node;osg::ref_ptr<osg::Group> group = new osg::Group;osg::ref_ptr<osg::Geode> geode = new osg::Geode;osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> color = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> normal =new osg::Vec3Array;point->push_back(osg::Vec3(0,0,0));point->push_back(osg::Vec3(0,3,0));color->push_back(osg::Vec3(0,0,0));color->push_back(osg::Vec3(0,0,0));point->push_back(osg::Vec3(-20,0,20));point->push_back(osg::Vec3(-15,0,20));point->push_back(osg::Vec3(-15,0,18));point->push_back(osg::Vec3(-20,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-14,0,20));point->push_back(osg::Vec3(-10,0,20));point->push_back(osg::Vec3(-10,0,18));point->push_back(osg::Vec3(-14,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-9,0,20));point->push_back(osg::Vec3(-6,0,20));point->push_back(osg::Vec3(-6,0,18));color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-5,0,20)); point->push_back(osg::Vec3(-3,0,21)); point->push_back(osg::Vec3(-1,0,20)); point->push_back(osg::Vec3(-1,0,19)); point->push_back(osg::Vec3(-3,0,18)); point->push_back(osg::Vec3(-5,0,19)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); color->push_back(osg::Vec3(0,0.7,0.5)); color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(0,0,20)); point->push_back(osg::Vec3(1,0,20)); point->push_back(osg::Vec3(1,0,18)); point->push_back(osg::Vec3(0,0,18)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-20,0,15)); point->push_back(osg::Vec3(-20,0,11)); point->push_back(osg::Vec3(-15,0,11)); point->push_back(osg::Vec3(-15,0,15)); point->push_back(osg::Vec3(-12,0,9)); point->push_back(osg::Vec3(-12,0,13)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); color->push_back(osg::Vec3(0,0.7,0.5)); color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(-11,0,15)); point->push_back(osg::Vec3(-11,0,11)); point->push_back(osg::Vec3(-9,0,15)); point->push_back(osg::Vec3(-9,0,11)); point->push_back(osg::Vec3(-7,0,13)); point->push_back(osg::Vec3(-7,0,9)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,0.7,0.5));color->push_back(osg::Vec3(1,1,1));point->push_back(osg::Vec3(-5,0,10));point->push_back(osg::Vec3(-1,0,15));point->push_back(osg::Vec3(1,0,10));point->push_back(osg::Vec3(-1,0,5));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-20,0,-1));point->push_back(osg::Vec3(-16,0,5));point->push_back(osg::Vec3(-14,0,-1));point->push_back(osg::Vec3(-16,0,-6));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-12,0,-1));point->push_back(osg::Vec3(-8,0,5));point->push_back(osg::Vec3(-6,0,-1));point->push_back(osg::Vec3(-8,0,-6));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));normal->push_back(osg::Vec3(0,-1,0));geometry->setVertexArray(point.get());geometry->setColorArray(color.get());geometry->setNormalArray(normal.get());geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::POINTS,0,2));geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::LINES,2,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,6,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,10,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::POLYGON,14,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_LOOP,20,4));geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::QUADS,24,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::QUAD_STRIP,30,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLES,36,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_STRIP,40,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_FAN,44,4));setlocale(LC_ALL,".936");// 配置地域化信息const char* titleString="zhengzhanwei";osg::ref_ptr<osgText::Text> text0 = new osgText::Text;osg::ref_ptr<osgText::Font> font = new osgText::Font();font = osgText::readFontFile("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFont(font.get());//text0->setFont("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFontResolution( 128, 128 );text0->setColor(osg::Vec4(255, 0, 0, 1));text0->setCharacterSize( .6f );text0->setPosition( osg::Vec3( 0.f, 0.f, 0.f ) );text0->setAxisAlignment( osgText::Text::XZ_PLANE );text0->setAlignment( osgText::Text::CENTER_TOP );createContent1(*text0,titleString);geode->addDrawable( text0.get() );geode->addDrawable(geometry);return geode.release();}void createContent1(osgText::Text& textObject,const char* string){int requiredSize=mbstowcs(NULL,string,0);//如果mbstowcs第一参数为NULL那么返回字符串的数目wchar_t* wText=new wchar_t[requiredSize+1];mbstowcs(wText,string,requiredSize+1);//由char转换成wchar类型textObject.setText(wText);delete wText;}int main(int argc,char ** argv){osgViewer::Viewer viewer;viewer.setSceneData(draw());return viewer.run();}。

相关文档
最新文档