计算机图形学利用C语言图形函数绘图

时间:2024.4.21

计算机图形学 课程实验

实验题目利用C语言图形函数绘图

                    

                   

                

指导教师                 

                 

@实验说明

试验目的: 掌握TurboC语言图形函数的使用和学会绘制一般图形。

试验地点: 教九楼401  数学系机房

实验要求(Direction):1. 每个学生单独完成;2.开发语言为TurboC或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。

@实验内容

:实验题一

1.1实验题目

用如下图1所示,图中最大正n边形的外接圆半径为R,旋转该正n边形,每次旋转角度,旋转后的的n边形顶点落在前一个正六边形的边上,共旋转N次,请上机编程绘制N+1个外接圆半径逐渐缩小且旋转的正n边形。要求:(1) n、R、N、要求可以人为自由控制输入;(2)N+1个正六边形的中心(即外接圆的圆心)在显示屏幕中心。

1.2实验目的和意义

1. 了解如何利用C语言和图形函数进行绘图;

2. 熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;

3.通过对Turbo C进行图形程序设计的基本方法的学习,能绘制出简单的图形;

4. 通过绘制N+1个正n边形,了解图形系统初始化、图形系统关闭和图形模式的控制

并熟练运用图形坐标的设置,包括定点、读取光标、读取xy轴的最大值以及图形

颜色的设置。

1.3程序制作步骤(包括算法思想、算法流程图等)

1.自动搜索显示器类型和显示模式,初始化图形系统,通过printfscanf语句控制半径r、边数n、多边形的个数k、边的每次旋转角度d,的自由输入;

2.给定一内接圆半径r,由圆内接多边形的算法公式:

x[i]=r*cos((i+1) *2.0*pi/n)+320.0

y[i]=240.0-r*sin(2.0*pi/n *(i+1)) 

确定出多边形N的各个顶点坐标,然后利用划线函数line(),连接相邻两点,即形成一个正多边形。

3.根据边与角的关系,以及线段定比分点公式,可知旋转后的多边形的各个顶点的坐标。公式如下:

                 x[i]=(x[i]+x[i+1]/(k+1))  

                 y [i]=(y[i]+y[i+1]/(k+1))

                 k=360/(n*d)  n为多边形的边数,d为多边形旋转的度数)                                                           

然后与第二步相同,利用划线函数line(),连接形成又一个旋转过的正多边形,这样就形成了所要绘制的图形;

4.关闭图形系统。

1.4主程序

/*----- 多边形的逐次旋转------*/

#include <stdio.h>

#include "conio.h"

#include "math.h"

#include <graphics.h>

#include "stdlib.h"

#include "time.h"

#define pi 3.1415926

#define ARRAY_LEN 128

void main()

{

  int graphdriver = DETECT,graphmode;           /*自动搜索显示器类型和显示模式*/

  int r = 0;

  int i = 0;

  int j = 0;

  int n = 0;

  int k = 0;

  int d = 0;

  float x = 0;

  float y = 0;

  float q = 0;

  int a[ARRAY_LEN] = {0};

  int b[ARRAY_LEN] = {0};

  char str1[ARRAY_LEN] = {0};

  char str2[ARRAY_LEN] = {0};

  printf("请输入正接圆的半径r:");

  scanf("%d",&r);

  printf("\n请输入多边形的边数n:");

  scanf("%d",&n);

  printf("\n请输入多边形的个数k:");

  scanf("%d",&k);

  printf("\n请输入每次的旋转角度d:");

  scanf("%d",&d);

  initgraph(&graphdriver,&graphmode,"D:\\TC");    /*初始化图形系统*/

  printf("\n\n        注意:maxx=%d,maxy=%d\n",getmaxx(),getmaxy());

  printf("\n        r=%d, n=%d, k=%d, d=%d",r,n,k,d);

  x = (getmaxx()+1)/2.0;

  y = (getmaxy()+1)/2.0;

  q = 360/n;                    /*角增量*/

  q = q*pi/180;          /*将角增量化为弧度*/

  for(i=0;i<n;++i)           /*计算初始正n角形顶点坐标*/

  {

         a[i+1]=(int)((int)x+r*cos((i)*q));

         b[i+1]=(int)((int)y-r*sin((i)*q));

  }

  a[n+1]=a[1];

  b[n+1]=b[1];   /*闭合正n角形,以便连续画线*/

  /*--------k个正多角形-----------*/

  for(i=1;i<k+1;++i)

  {

         for(j=1;j<n+1;++j)       /*画一个正多角形*/

         {

                line(a[j],b[j],a[j+1],b[j+1]);

         }

      for(j=1;j<n+1;++j)       /*计算下一个正多边形顶点坐标*/

         {

                a[j]=(int)(a[j]+(a[j+1]-a[j])/d);

                b[j]=(int)(b[j]+(b[j+1]-b[j])/d);

         }

         a[n+1]=a[1];

         b[n+1]=b[1];

  }

  getch();

  printf("\n\n");

  closegraph();

}

1.5运行结果图

1.5.1输入n边形信息运行结果截图

1.5.2 n边形运行结果截图

:实验题二

2.1实验题目

请绘制一个图:屏幕中央有一个半径为R1=160的大圆和一个同心的且半径为R2=120的小圆,同时在大圆和小圆中间均匀分布着12个与大圆和小圆相切的圆。如下图2所示:

要求:(1) 分别用12种不同的颜色填充模式填充12个小圆;(2)用自定义模式填充中间小圆,且用漫延填充方法填充;(3) 用自定义模式填充中间小圆时,填充模式图案自己设计。例如,用字母A 、字母B、字母C填充图案可设计为:

             

2.2实验目的和意义

1.会运用画圆函数circle(),图形填充函数包括:setfillstyle()setfillpattern()以及floodfill()来填充圆;

2.学会用自定义模式填充指定圆,并且用漫延填充方法填充;

3.学会用自定义图案来填充指定圆。

2.3程序制作步骤(包括算法思想、算法流程图等)

1.输入所要求环绕的小圆的个数n,设置画笔颜色,利用circle()画半径为160的大圆,然后画半径为120的小圆并按照输入的模式m选择相应的填充模式。

2.利用圆内接多边形的算法,算出环绕小圆的各个圆心坐标,公式如下:

        x[i]=r*cos( (i+1) * 2.0*pi/n)+200.0            

        y[i]=200.0-r*sin( (i+1) * 2.0*pi/n)              

 20为半径画环绕的n个小圆,并用不同的颜色填充。

2.4主程序

   #include "stdio.h"

#include "conio.h"

#include "math.h"

#include "graphics.h"

#define pi 3.14159265

#define ARRAY_LEN 50

void main()

{

       int graphdriver=DETECT,graphmode;      /*自动搜索显示器类型和显示模式*/

       double x[ARRAY_LEN] = {0};

       double y[ARRAY_LEN] = {0};

       int i = 0;

       int j = 0;//循环变量

       int n = 0;//圆的个数

       double r = 0;//半径

       double theta = 0;//角度

       double sin(double);

       double cos(double);

       char p1[8]={(char)0x00,(char)0x3c,(char)0x20,(char)0x20,

              (char)0x38,(char)0x20,(char)0x20,(char)0x20};//填充F

       r=160.0;

       printf("请输入圆的个数:");

       scanf("%d",&n);

       initgraph(&graphdriver,&graphmode,"D:\\TC");    /*初始化图形系统*/

       theta=2.0*pi/n;//计算角度

       setcolor(3);

       circle(200,200,200);

       setcolor(6);

       setfillstyle(12,0);

       setfillpattern(p1,9);

       circle(200,200,120);//画圆

       floodfill(200,200,6);

       while(!kbhit())

       {

              for(j=2;j<=n;j++)

                     for(i=0;i<=n;i++)

                     {

                            x[i]=r*cos(theta*(i+j))+200.0;//计算圆心位置

                            y[i]=200.0-r*sin(theta*(i+j));

                            setcolor(i);

                            circle((int)x[i],(int)y[i],(int)40);

                            setfillstyle(SOLID_FILL,i);      

                            floodfill((int)x[i],(int)y[i],i);    

                     }

                     delay(100);//延迟时间

                     cleardevice();

                     setcolor(3);

                     circle(200,200,200);

                     setcolor(6);

                     setfillstyle(12,0);//设置填充格式

            setfillpattern(p1,9);

            circle(200,200,120);

            floodfill(200,200,6);//

       }  

       getch();

       closegraph();

}

2.5运行结果图

2.5.1圆个数为14时的F填充

:实验题三

3.1实验题目

自选题目:

(1)请编写一动画:绘制上述实验2中的图形,并要求:

ü  1.让图案中的12个小圆按顺时针或逆时针方向不停地旋转;

ü  2.半径为R2=120的小圆用黑色和实填充模式填充,并在小圆内绘制一些闪 

烁的星星(可参考课本P81 例3.27)。或者用不同的颜色和填充模式不停

地填充小圆,产生动画效果。

(2)请编写一动画:实现实验1中的图形由大到小(由小到大)旋转的动态过程。

(3)编写一个描述一俩自行车在一公路上由左向右行驶的程序,运行效果图大致如图三所示。(可参考课本P74 例3.21

(4)试着自行设计一个动画或美术图案,并且上机编程实现。

(5)构造一种类似广告片效果,一幅或者多幅图形图像逐个显示出来,并配以文字说明,颜色变化等。

要求:对于实验3中的5个小题,选择其中一个上机编程实现即可。

3.2实验目的和意义

1. 描述一辆自行车在一公路上由右向左行驶;

2. 熟练掌握画圆函数circle(),以及画线函数line(),自定义填充函数setfillstyle()等一些简单的绘图函数。

3.3程序制作步骤(包括算法思想、算法流程图等)

1.自动搜索显示器类型和显示模式,初始化图形系统并设置背景颜色以及画笔颜色;

2.用画圆函数circle()以及画线函数line()绘制自行车的基本轮廓;

3.绘制处于运动状态的自行车车轮的轴线以及动态画面;

4.绘制最后处于静止状态的自行车车轮的轴线;

5.关闭图形系统。

3.4主程序

#include<stdlib.h>

#include"graphics.h"

#include<conio.h>

#include<stdio.h>

void main()

{

       void *w = NULL;

       int driver=DETECT;

       int mode=0;

       int i = 0;

       int j = 0;

       int start = 0;

       int end = 0;

       initgraph(&driver,&mode," ");//初始化图形系统

       cleardevice();//清除屏幕和图形缓冲区

       setbkcolor(9);//用指定的颜色值来设置当前的背景色

       setcolor(13);//设置前景颜色

       start=0;

       end=180;

       circle(387,290,37);

       circle(525,290,37);

       line(404,217,398,230);

       line(436,217,429,230);

       line(398,230,429,230);

       line(413,230,387,290);

       line(387,290,525,290);

       line(408,243,484,243);

       line(387,290,484,243);

       line(484,243,525,290);

       line(444,290,484,243);

       line(444,290,446,279);

       line(444,290,443,300);

       line(438,277,444,278);

       line(435,300,451,301);

       line(484,243,487,233);

       line(472,233,502,233);   //自行车基本轮廓的绘制

       w=malloc(imagesize(350,200,562,327));//动态申请空间

       getimage(350,200,562,327,w);//保存图像函数

      

       for(i=350,j=0; i>0 ;i--,j--)

       {

              setfillstyle(EMPTY_FILL,0);//设置填充模式和颜色

              pieslice(387+j,290,start,end,37);//绘制并填充一个扇形

              pieslice(525+j,290,start,end,37);

              start+=40;

              end+=40;

              delay(5);            //处于运动状态的自行车车轮的轴线的绘制

        putimage(i-1,200,w,COPY_PUT);//输出图像函数

              line(2,327,562,327);

              delay(10);           //自行车行驶动画的实现

       }

       for(i=0;i<10;i++)

       {

              pieslice(37,290,start,end,37);//绘制并填充一个扇形

              pieslice(175,290,start,end,37);//绘制并填充一个扇形

              start+=40;

              end+=40;

       }      //处于静止状态的自行车车轮的轴线的绘制

       getch();

       restorecrtmode();//将屏幕模式恢复为先前的initgraph设置

       closegraph();

}

3.5运行结果图

3.5.1自行车在起点

3.5.1自行车在中间

3.5.1自行车在中点

@参考文献

[1] 王汝传,黄海平,林巧民.计算机图形学教程(第二版).北京:人民邮电出版社,2009

[2]谭浩强. C语言程序设计[M]. 北京:清华大学出版社,2005.

@本次实验总结或体会

   通过本次试验我看到了在计算机图形学这门课中有意义的一面,增加了我学习这门课的兴趣;但同时我也认识到了自身在语言掌握中的不足和有待加强的地方;在以后的学习中要更加努力、要多动手、多学习。

@教师评分

                                                                          

                                                                           

                                                                          

                                                                          

                                                                          

                                                                           


第二篇:C语言图形编程(三、绘图函数-02)1


四、图形和图像函数(一) 像素函数56. putpiel() 画像素点函数57. getpixel()返回像素色函数(二) 直线和线型函数58. line() 画线函数59. lineto() 画线函数60. linerel() 相对画线函数61. setlinestyle() 设置线型函数62. getlinesettings() 获取线型设置函数63. setwritemode() 设置画线模式函数(三)、多边形函数64. rectangle() 画矩形函数65. bar() 画条函数66. bar3d() 画条块函数67. drawpoly() 画多边形函数(四)、 圆、弧和曲线函数68. getaspectratio()获取纵横比函数69. circle()画圆函数70. arc() 画圆弧函数71. ellipse()画椭圆弧函数72. fillellipse() 画椭圆区函数73. pieslice() 画扇区函数74. sector() 画椭圆扇区函数75. getarccoords()获取圆弧坐标函数(五)、 填充函数76. setfillstyle() 设置填充图样和颜色函数77. setfillpattern() 设置用户图样函数78. floodfill() 填充闭域函数79. fillpoly() 填充多边形函数80. getfillsettings() 获取填充设置函数81. getfillpattern() 获取用户图样设置函数(六)、图像函数82. imagesize() 图像存储大小函数83. getimage() 保存图像函数84. putimage() 输出图像函数四、图形和图像函数对许多图形应用程序,直线和曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。(一) 像素函数56. putpixel() 画像素点函数功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。用法: 函数调用方式为void putpixel(int x,int y,int color);说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。此函数相应的头文件是graphics.h返回值: 无例: 在屏幕上(6,8)处画一个红色像素点:putpixel(6,8,RED);57. getpixel()返回像素色函数功能: 函数getpixel()返回像素点颜色值

更多相关推荐:
计算机图形学学习心得体会

计算机图形学学习心得体会计算机科学与技术与技术班学号1计算机图形学计算机图形学ComputerGraphics简称CG狭义上是一种研究基于物理定律经验方法以及认知原理使用各种数学算法处理二维或三维图形数据生成可...

计算机图形学学习体会

让设计成为现实我对计算机图形学的认识10049410级景观一班苏莞琴计算机图形学包含的主要内容计算机图形学ComputerGraphic是人类设计手法不断演进的产物这门学科主要研究通过计算机处理用几何数据和数学...

计算机图形学感想

计算机图形学感想小学期的导论课里老师们从偏微分方程代数学组合概率论非线性方程组解法计算数学简介几何学最优化运筹学和计算机图形学八个方面为切入点给我们讲解了数学的一些分支上的知识老师的讲解拓宽了我们的知识面增加了...

计算机图形学学习的心得体会

对计算机图形学课程学习的心得体会通过一个学期的学习,了解了什么是计算机图形学、什么是图形API、为什么需要计算机图形学以及计算机图形学在各个领域的应用。计算机图形学是一种使用数学算法将二维或三维图形转化为计算机…

计算机图形学学习体会

计算题图形学课程学习体会计算机图形学是研究用计算机生成处理和显示图形的一门学科他的重要性体现在人们越来越强烈的需要和谐的人机交互环境UI已经成为软件的重要组成部分以图形的方式表示抽象的概念和数据已经成为信息领域...

计算机图形学心得体会

计算机图形学心得体会姓名:学号:20xx03284班级:计科11202序号:31院系:计算机科学学院通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图…

计算机图形学 总结

第一章绪论计算机图形学的基本概念计算机图形学是研究怎样用数字计算机生成处理和显示图形的一门学科图形计算机图形学的研究对象构成图形的要素几何要素几何属性点线面体非几何要素视觉属性明暗灰度色彩纹理透明性线型线宽表示...

1-27 王锟 计算机图形学

课程设计报告题目图像处理ImageProcessing课程计算机图形学班级12信息与计算科学1班姓名王锟学号20xx0810010127学校华东交通大学学院理学院指导老师蒋先刚目录目录1概述2一设计需求321设...

计算机图形学 图形变换

实验五图形变换一实验目的1掌握图形变换的基本方法2初步掌握映射菜单消息和捕获键盘消息的方法二实验内容及要求123以三角形为例使用VisualC实现二维图形的平移旋转和缩放功能每人单独完成实验按要求撰写实验报告写...

计算机图形学实验报告

武汉工业学院数学与计算机学院计算机图形学专业班级学号姓名指导老师实验报告20xx年5月25日第二章直线生成算法21实验原理211中点Bresenham算法22实验内容请使用中点Bresenham算法来生成直线实...

计算机图形学实验报告

实验报告课程名称计算机图形学学院信息科学与工程学院专业数字媒体技术班级20xx级姓名李义学号20xx010520xx20xx年12月19日山东科技大学教务处制目录实验一环境设置3实验二直线的生成算法4实验三圆的...

计算机图形学大作业

大连民族学院计算机图形学期末论文学院计算机科学与工程专业计算机科学与技术班级学号姓名成绩一问题描述11基本要求了解计算机图形学中的基本原理和方法并能利用程序设计语言实现12实验内容1利用程序设计语言进行二维及三...

计算机图形学学习心得(45篇)