图形学c语言sdfPPT课件

上传人:cl****1 文档编号:578643202 上传时间:2024-08-24 格式:PPT 页数:58 大小:316.50KB
返回 下载 相关 举报
图形学c语言sdfPPT课件_第1页
第1页 / 共58页
图形学c语言sdfPPT课件_第2页
第2页 / 共58页
图形学c语言sdfPPT课件_第3页
第3页 / 共58页
图形学c语言sdfPPT课件_第4页
第4页 / 共58页
图形学c语言sdfPPT课件_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《图形学c语言sdfPPT课件》由会员分享,可在线阅读,更多相关《图形学c语言sdfPPT课件(58页珍藏版)》请在金锄头文库上搜索。

1、计算机图形学计算机图形学计算机图形学计算机图形学C语言图形程序设计基础语言图形程序设计基础1第三章第三章C语言图形程序设计基础语言图形程序设计基础3.1屏幕显示模式和坐标系屏幕显示模式和坐标系1.文本模式:文本模式:DEF在屏模上只能显示文本的显示模式在屏模上只能显示文本的显示模式历史原因Turbo C的默认的显示模式是文本模式的默认的显示模式是文本模式。2.图形模式和点坐标图形模式和点坐标图形模式:图形模式:DEF在屏幕上显示图形的方式,称为图形模式。在屏幕上显示图形的方式,称为图形模式。点坐标:点坐标:屏幕是由像素点组成的,在图形模式下,屏屏幕是由像素点组成的,在图形模式下,屏幕上每个像素

2、的显示位置用点坐标来描述。幕上每个像素的显示位置用点坐标来描述。2例:例:一个分辨率为一个分辨率为800*600的分辨率的显示的分辨率的显示屏(屏(800列,列,600行行)(0,0)Max xMax y799599(10,4)(0,0)在图形模式下在图形模式下,以屏幕的左上角为坐标原点以屏幕的左上角为坐标原点(0,0)水水平方向为平方向为x轴,垂直方向为轴,垂直方向为y轴轴33.图形系统的初始化图形系统的初始化一个简单的图形程序一个简单的图形程序#include “graphics.h” / 图形函数库图形函数库#include “stdio.h” /标准输入输出函数库标准输入输出函数库#i

3、nclude “conio.h” /控制台输入输出控制台输入输出main() int gdriver,gmode; detectgraph(&gdriver,&gmode) ; if(gdriver0) exit(1) ; initgraph(&gdriver,&gmode,C:TURBOC2) ;初始化图初始化图形系统形系统4 bar3d(100,200,300,400,10,1) ; getch(); closegraph(); 如何实现图形模式初始化?如何实现图形模式初始化? initgraph(int *gdriver,int *gmode,char *path) 作用:作用:初始化图

4、形系统,从磁盘装入一个初始化图形系统,从磁盘装入一个 图形驱动程序并设置图形显示模式。图形驱动程序并设置图形显示模式。图形图形程序程序关闭图关闭图形系统形系统5Void far detectgraph(int *gdriver,int *gmode)作用:作用:硬件检测,该函数用来检测图形适配器的类型。硬件检测,该函数用来检测图形适配器的类型。关闭图形系统关闭图形系统Void far closegraph()作用:作用:关闭图形系统,释放图形驱动程序所占关闭图形系统,释放图形驱动程序所占的内存空间,使系统返回到文本模式。的内存空间,使系统返回到文本模式。63.2常用绘图函数简介常用绘图函数简介

5、1.图形视口函数图形视口函数-setviewport(left,top,right,bottom,clip)Clip:如果如果clip=1则超出视口的图形自动剪裁则超出视口的图形自动剪裁例:例: setviewport(100,100,300,300,1)-clearviewport()作用:清除图形视口中的图形作用:清除图形视口中的图形-getviewsetting(struct * info)作用:返回当前视口的绝对坐标及剪裁标志。作用:返回当前视口的绝对坐标及剪裁标志。问题:问题:info该如何定义?该如何定义?7main()运行viewport.cviewport.c struct v

6、iewporttype info; int gdriver=DETECT ,gmode; initgraph(&gdriver,&gmode,C:tc3BGI); setcolor(4);/红色红色 setviewport(100,100,200,200,1);/将参数将参数clip=0结果如何?结果如何? circle(60,60,60); getviewsettings(&info); rectangle(0,0,info.right-info.left,info.bottom- info.top); getch(); clearviewport(); getch(); closegrap

7、h(); 问题问题1:程序运行结果?如果该为程序运行结果?如果该为circle(50,50,20)结果如结果如何?如果将何?如果将circle(60,60,60)前移一行结果?前移一行结果?82屏幕位置函数屏幕位置函数-getmaxx() 作用:作用:返回当前图形模式下最大返回当前图形模式下最大x坐标坐标-getmaxy()作用:返回当前图形模式下最大作用:返回当前图形模式下最大x坐标坐标Getx()作用:作用:返回图形模式下当前位置的返回图形模式下当前位置的x坐标坐标Gety()作用:作用:返回图形模式下当前位置的返回图形模式下当前位置的x坐标坐标9- moveto(int x ,int y

8、)作用:作用:将当前位置移到将当前位置移到(x,y)例:例:moveto(10,20) - moverel(int deltax,int deltay)作用:作用:相对移动函数相对移动函数说明:说明:deltax和和deltay。表示相对移动位。表示相对移动位置置问题:刚才使用问题:刚才使用moveto(10,20)将光标定将光标定位在(位在(10,20)上,即)上,即CP=(10,20)。如果。如果现在现在调用调用 moverel(-5,10)光标将在何处光标将在何处?10 3.直线和线型函数直线和线型函数-line(int x1,int y1,int x2,int y2)作用作用:-在指定

9、的两点之间画直线在指定的两点之间画直线说明:当前光标依然在说明:当前光标依然在(x1,y1)lineto(int x,int y)-作用:作用:从当前光标位置到(从当前光标位置到(x,y)之间画一条直)之间画一条直线线-linerel(int deltax,int deltay)作用:作用:从当前坐标以相对增量方式画直线从当前坐标以相对增量方式画直线问题问题2:如果如果 CP(10,20) ; linerel(70,80)应在哪两点之间画直线?11阅读程序,写出程序运行结果阅读程序,写出程序运行结果例:例:#include graphics.h#include stdio.hmain() in

10、t cp_x, cp_y; int gdriver=DETECT ,gmode; initgraph(&gdriver,&gmode,C:TURBOC2); moveto(5,10); line(5,10,100,50); cp_x=getx(); cp_y=gety(); 12printf(the cp_x cp_y are %d %d,cp_x,cp_y); printf(n) ; /回车回车getch() ; moveto(100,50); lineto(100,100); cp_x=getx(); cp_y=gety(); printf(the cp_x cp_y is %d %d,c

11、p_x,cp_y) ;/ getch(); linerel(50,50); getch();13-setlinestyle(int style, int pattern ,int width) 作用:作用:设置线型特征(设置线型特征(P65P65) stylestyle参数:参数:用来定义所画直线的类型用来定义所画直线的类型 Width Width参数:参数:用来指定所画直线的粗细用来指定所画直线的粗细 patternpattern参数:参数:只有只有style=4style=4( (用户自定义用户自定义) )可用可用来表示用户字定义的线型。一般情况来表示用户字定义的线型。一般情况patter

12、n=0pattern=0 例:例:Setlinestyle(DOTTEN-LINE , 0 , 1)14线性代码说明线性代码说明线宽 代码代码 代码名代码名 说明说明0SOLID-LINE实线实线1DOTTEN-LINE点线点线2CENTER-LINE中心线中心线3DASHED-LINE虚线虚线4USERBIT-LINE 用户定义的线用户定义的线符号常量符号常量值值含义含义NORM_WIDTH11像素宽像素宽THICK_WIDTH33个像素宽个像素宽15例:例:setlinestyle(SOLID-LINE , 0, 1)setlinestyle(4 , 0xAAAA, 1) 1100 110

13、0 1100 1100 1111 1111 1111 1111 pattern参数参数是是16位二进制码,位二进制码,1:有像素用前景:有像素用前景色点显示;色点显示;0:没有像素用背景色点表示。:没有像素用背景色点表示。16void draw_line()int i;for(i=0;i4;i+) setlinestyle(i,0,NORM_WIDTH); line(40,10*(i+1),100,10*(i+1); setlinestyle(i,0,THICK_WIDTH); line(40,10*(i+1),100,10*(i+1); setlinestyle(4,0x99cc,THICK

14、_WIDTH);line(40,50,100,50) ;setlinestyle (4,0xABCD,THICK_WIDTH);line(40,60,100,60) ;17-Setwritemode(int mode)作用:设置画线的输出模式作用:设置画线的输出模式mode=COPY_PUT(0)新画的线将覆盖屏幕上原有的图像新画的线将覆盖屏幕上原有的图像mode=XOR_PUT(1)新画的线与旧线作异或,然后再向屏幕新画的线与旧线作异或,然后再向屏幕输出输出18例:例:Midx=getmaxx()/2Midy=getmay()/2Setwritemode(XOR_PUT)Line(0,mid

15、y,midx,midy)Line(midx/2,midy,midx*3/2,midy)Setwritemode(COPY_PUT)Line(0,midy/2,midx,midy/2);Line(midx/2,midy/2,midx*3/2,midy/2)19程序设计:程序设计:利用利用C语言设计一程序实现下图所示的二语言设计一程序实现下图所示的二维平面时钟的绘制。维平面时钟的绘制。20设计出一个时针分针设计出一个时针分针能够协调旋转的的时钟能够协调旋转的的时钟new_clock-Setwritemode(int mode)作用:设置画线的输出模式作用:设置画线的输出模式如果如果mode=COP

16、Y_PUT(0)新画的线将覆盖屏幕上原有的图像新画的线将覆盖屏幕上原有的图像 mode=XOR_PUT(1)新画的线与旧线作异或,然后再向屏幕输出新画的线与旧线作异或,然后再向屏幕输出21 setwritemode(XOR_PUT); /* 设置写模式为异或设置写模式为异或 */ th1=0, th2=0, while(!kbhit() /*判断是否按下某键判断是否按下某键*/ setcolor(RED) ; line(x,y,x+0.8*radius*cos(th1),y-0.8*radius*sin(th1);( (分针分针) ) setcolor(BLUE); line(x,y,x+0.

17、6*radius*cos(th2),y-0.6*radius*sin(th2) );(时针时针) delay(1000); setcolor(RED) ; line(x,y,x+ 0.8*radius*cos(th1), y-0.8*radius*sin(th1) ) ; setcolor(BLUE); line(x,y,x+0.6*radius*cos(th2), y-0.6*radius*sin(th2) ) ; th1 += 2*PI/(60*60); th2+-= 2*PI/(12*60*60);if (th1=0) th1+=2*PI;if (th2=0) th2+=2*PI;22例

18、例:抛物线的绘制抛物线的绘制1.数学模型的分析数学模型的分析标准方程:标准方程:Y=X2/(4p) 曲线以曲线以F(0,p)为焦点为焦点,曲线以曲线以Y轴为轴为对称轴,其对称轴,其X的取值范围是任意的。的取值范围是任意的。23由此,可将上式离散化由此,可将上式离散化Xi=i*dxYi=xi2/(4p)其中:其中:i=-m,-(m-1),0,1,m; dx:曲线沿曲线沿x方向的等距离。方向的等距离。242.图形绘制范围图形绘制范围X的定义域为整个定义域的定义域为整个定义域实际上实际上X的取值范围的取值范围后图形区域大小限制后图形区域大小限制设图形区域:设图形区域:长长X=L,高:高:Y=H(0,

19、0)Y=X2/(4p)25曲线曲线1 1的的X X的取值范围的取值范围 x1=x=x2 x1 =-L/2, x2=L/2曲线曲线2 x的范围的范围 X1=X=X2X1=-sqrt(H/2 *4p) X2=sqrt(H/2*4p)Y=X2/(4p)H26问题:问题:如何判断是那如何判断是那种抛物线呢种抛物线呢? X=sqr(2p*H)27(1)将将x1,x2 进行进行n等分等分 (n为偶数为偶数) (2)每等分的大小为每等分的大小为dx dx= |x2-x1|/n m=n/2(3)已知离散点的中点是)已知离散点的中点是(0,0)点则点则 离散点依次是离散点依次是 -m,-(m-1), ,0,1,

20、2,(m-1),m 12x1 y128For(i= -m ;iL/2X=L/2 dx=2x/n, m=n/2For(i=-m ;i=m;i+)x=i*dx y=x*x/(4*p)i=-mLineto(Xc+x,Yc-y)Moveto(Xc+x,Yc-y)画坐标系画坐标系YYNN31圆弧类函数圆弧类函数-arc(int x,int y,int startangle,int endangle,int radius)作用:作用:画圆弧画圆弧例:例:arc(100,100,0,360,50) arc(100,100,0,180,30)circle(int x,int y,int radius)作用:作

21、用:画圆画圆-ellipse(int x,int y,int start,int end ,int xradius,int yradius)作用:作用:画椭圆画椭圆 说明:说明:以以(x,y)为圆心,长半轴为为圆心,长半轴为xradius ,短半轴为短半轴为yradius 起始角度为起始角度为start ,终止角度为终止角度为end32-Pieslice(int x,int y int startangle,int endangle,int radius)作用:作用:画扇形画扇形例:例:void draw_slice int start,end; start=0,end=45; For (i=

22、0 ;i 8;i+) setfillstyle(SOLID_FILL,i); pieslice(260,200,start,end,100); start+=45; end+=45; Getch(); 335多边形类函数多边形类函数rectangle(int left,int top,int right,int bottom)作用:作用:画矩形画矩形例例: rectangle(200,100,500,400)drawpoly(int numpoints, int *polypoints)作用:作用:画多边形画多边形说明:说明:用当前画笔颜色画一个多边形,多边形的点数用当前画笔颜色画一个多边形,

23、多边形的点数为为numpoints,*polypoints指向一个整型数组,共有指向一个整型数组,共有numpoints*2个整数个整数,每一对整数给出了一个多边形每一对整数给出了一个多边形顶点(顶点(x,y)的坐标。)的坐标。例:int matrix10=10,20,20,60,30,50,20,40,15,20Drawpoly(5,matrix)34注意:注意:划封闭的多边形,定点数目必须等于划封闭的多边形,定点数目必须等于n+1且最后一点的坐标必须等于第一个点的坐标且最后一点的坐标必须等于第一个点的坐标例:例: main() static int polypoints18 =100,10

24、0,200,100,200,200,100,200 Static int polypoints210= =100,100,200,100,200,200,100,200,100,100 drawpoly(4,polypoints1); Drawpoly(5,polypoints2);356图形颜色的设置图形颜色的设置void far setbkcolor(int color)-设置当前背景颜色设置当前背景颜色 (p60表表3.3)例:例: setbkcolor(BLACK)void far setcolor(int color)-设置当前画笔颜色设置当前画笔颜色 例例:setcolor(GRE

25、EN)36例:在浅红色的背景色画布上画一黄色的圆。例:在浅红色的背景色画布上画一黄色的圆。#include “graphics.h”#include “conio.h”void main( ) int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode, “c:TC” ); setbkcolor(LIGHTRED); setcolor(YELLOW); circle(100,100,50); getch(); closegraph() ; 37387图形的填充图形的填充柱状统计图、圆饼图SOLID_FILL39-Setfillstyle ( int

26、pattern, int color)作用:作用:设置当前的填充模式和填充颜色设置当前的填充模式和填充颜色p(67) 填充模式代号填充模式代号符号值含义图样EMPTY_FILL0用背景色填充SOLID_FILL1实线填充LINE_FILL2用线“ ” 填充LTSLASH_FILL3用斜杠填充SLASH_FILL4用粗斜杠填充40例例:setfillstyle(4,RED) Bar(100,200,150,300)(100,200)(150,300)41-Floodfill(int x,int y,int border)作用:作用:蔓延填充,以(蔓延填充,以(x,y)为填充起点,)为填充起点,b

27、order指定填充区域边界所使用的颜色指定填充区域边界所使用的颜色例:例:setcolor(4) ; circle (100,100,80); setfillstyle(SLASHFILL,2) floodfill(100,100,4) 42/(周二上到这里周二上到这里)8填充类画图函数填充类画图函数:Bar(int left,int top,int right,int bottom)作用:画出一个指定左上上角和右下角画出一个指定左上上角和右下角的实心条形。的实心条形。Bar3d(int left,int top,int right,int bottom,int depth,int topfl

28、ag)作用作用:画一三维矩形条,使用画一三维矩形条,使用setfillstyle()设置填充颜色和填充模式。设置填充颜色和填充模式。Depth 给出矩形给出矩形条的深度。条的深度。Topflag=0时不加顶盖,非零时加时不加顶盖,非零时加一顶盖一顶盖43例:例:setfillstyle(SOLID_FILL,GREEN);Bar(60,80,220,160)Setfillstyle(SOLID_FILL,RED);Bar3d(260,180,360,240,20,1)44-fillpoly(int numpoints, int *polypoints)作用:作用:画一顶点数为画一顶点数为num

29、points的多边的多边形,多边形的顶点坐标存放在数组形,多边形的顶点坐标存放在数组polypoints中,用中,用Setfillstyle ()设置填充模式设置填充模式45图形模式下文本的处理图形模式下文本的处理469.图形模式下文本的处理图形模式下文本的处理-outtext(char*textstring)作用:将当前位置上输出一字符串,作用:将当前位置上输出一字符串,参数参数textstring为文本字符串为文本字符串例:例:outtext(“hello wellcom to study CG”)-outtexxy(int x,int y,char *textstring)作用:作用:在

30、指定位置在指定位置(x,y)输出一字符串输出一字符串例:例:outtext(100,150, “I am a teacher”)47-Settextstyle(int font ,int direction,int charize)作用:作用:设置文本当前字体,文本显示方向设置文本当前字体,文本显示方向以及字符的大小。以及字符的大小。说明说明font:文本字体参数;:文本字体参数; direction: 文本显示方向参数文本显示方向参数 charize: 字体大小参数(字体大小参数(1-10)例:例:main() int driver =DETECT,mode; initgraph(&driv

31、er,&mode,c:turboc); outtextxy(100,100,normal) ; settextstyle(GOTHIC_FONT,HORIZ_DIR,5); outtextxy(100,200,gothic); getch(); closegraph(); 48程序设计:程序设计:画出下图的饼状图画出下图的饼状图p_new_pie某公司上半年产品销售状况是:计算机某公司上半年产品销售状况是:计算机50%、打印机、打印机20%、绘图机、绘图机10%图形扫描仪图形扫描仪5%、打印纸、打印纸10%、硬、硬盘销售盘销售5%。试画出下图所示的饼状图。试画出下图所示的饼状图。分析:分析:P

32、ercent5Text5Fillstyle549输入圆饼半径输入圆饼半径Radius和圆心(和圆心(x,y)求出百分之一的圆弧对应的夹角求出百分之一的圆弧对应的夹角d=360/100设置一起始角度设置一起始角度stangle=0, 设置图标的起始位置设置图标的起始位置(top,left), 图例的宽度图例的宽度w和高度和高度hFor(i=0 ;in;i+)设置填充模式设置填充模式endangle=stangle+100*百分比百分比*d pieslice(x,y,stangle,endangle,radius) ;(饼图饼图)Rectangle(top,left,top+h,left+w);(

33、图例图例)stangle=endangletop=top+h标注百分比,填写文字标注百分比,填写文字程序结束程序结束饼图流程图:饼图流程图:pie5010象素函数象素函数-putpixel(int x,int y,int color)作用:作用:在图形模式下,屏幕上显示一个在图形模式下,屏幕上显示一个象素点象素点例:例:putpixel(6,8,RED)-getpixel(int x,int y)作用:作用:返回一个象素点色彩值返回一个象素点色彩值例:例:color=getpixel(8,6)5110图形存取处理图形存取处理原理:原理:把屏幕上某个区域的信息存入缓存区,然后把屏幕上某个区域的信

34、息存入缓存区,然后再另一个区域将图像重新显示。再另一个区域将图像重新显示。(这是图形动画的基础)(这是图形动画的基础)car-检测内存检测内存-imagesize(int x1,int y1,int x2,int y2);函数作用:函数作用:获得屏幕保存左上角为获得屏幕保存左上角为(x1,y1),右上角右上角为(为(x2,y2)的矩形屏幕区域所需的内存字节数。)的矩形屏幕区域所需的内存字节数。例:例: unsigned size; size=imagesize(520,220,630,270)52void * bitmapbitmap =malloc(size)作用:作用:分配存储图像的内存分

35、配存储图像的内存 -getimage(int x1,int y1,int x2,int y2,void *bitmap)作用:作用:将指定屏幕(将指定屏幕(x1,y1)和()和(x2,y2)区)区域的图形拷贝到内存中。屏幕区域保存在域的图形拷贝到内存中。屏幕区域保存在bitmap指定的数组中指定的数组中53例:例:unsigned size; /屏幕区域的大小屏幕区域的大小 size=imagesize(10,10,100,100) ;/获得屏幕区域的大小并且将获得屏幕区域的大小并且将 获得的值放入变量获得的值放入变量size中中 w=malloc(size);/分配大小为分配大小为size的

36、内存空间,指针的内存空间,指针w指向该数组指向该数组 getimage(10,10,100,100,w); /获取屏幕上左上角为获取屏幕上左上角为(10,10)和右上角为和右上角为(100,100)的屏幕区域,的屏幕区域,并将其保存在数组并将其保存在数组w中中54-putimage(int x,int y, void *bitmap, int op)作用:作用:将使用将使用getimage函数保存起来的图形重新送回到屏函数保存起来的图形重新送回到屏幕上制定的位置。幕上制定的位置。(x,y)指定图形显示位置的左上角指定图形显示位置的左上角 bitmap 用来保存由用来保存由getimage()获

37、得的图形指针获得的图形指针Op 整型数图形复制到屏幕上的显示模式整型数图形复制到屏幕上的显示模式pthree_mode_CARCOPY_PUT0原样拷贝到屏幕原样拷贝到屏幕XOR_PUT1与屏幕像素异或后拷贝与屏幕像素异或后拷贝(可有效擦除图形)(可有效擦除图形)55一辆停止的车的程序代码一辆停止的车的程序代码void main() void *w;存放图片的变量存放图片的变量 int i; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); setbkcolor(GREEN) ; /*设置背景色*/ setcolor(4) ; /*设

38、置前景色*/ bar3d(520,245,550,260,8,1) ; bar3d(550,230,600,260,8,1) ; /*画车身*/ circle(535,260,8) ; circle(575,260,8) ; /*画车轮*/56w=malloc(imagesize(520,220,630,270); /*检测图形区域所占内存区检测图形区域所占内存区*/ getimage(520,220,630,270,w) ; /*将图形存入内存将图形存入内存 */ getch(); putimage(520,220,w,XOR_PUT) ; /*在原图形的位置异或显示图形,在原图的位置上异或显示图形就相在原图形的位置异或显示图形,在原图的位置上异或显示图形就相当于消除图像当于消除图像 putimage(200,350,w,COPY_PUT) ; /*将保存起来的图形在别的位置上复制显示将保存起来的图形在别的位置上复制显示 getch(); closegraph();57坐标转换12(Xc,Yc)(0,0) X+Y+X+Y+(x,y)X=Xc+XY=Yc-Y58

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号