图形学实验报告
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/28388ae8700abb68a982fb4a.png)
学院:计算机学院实验课程:计算机图形学实验项目:制作一个绘图界面开课时间:2015 ~2016年度第1学期指导老师:杨晋吉专业:计算机科学与技术(师范)华南师范大学教务处一、实验目的利用计算机编程语言绘制图形,主要实现了以下内容:(1)画线(2)画圆(3)画多边形(矩形和圆角矩形)(4)填充(5)变换(平移、旋转、比例变换)二、实验环境Windows 8.0 操作系统,NetBean6.5,Java语言三、实验过程(1)窗口界面功能JFrame类JToolBar类工具栏MouseAdapter类鼠标位置显示JPanel类画图区域JLabel类标签栏(2)菜单栏可实现功能(3)画画区域内可实现功能菜单栏 Help 帮助 Stroke 粗细File (文件) Color 颜色 New (更新) Save (保存)Load (下载)Exit (退出)四、各功能实现算法及截图1)Pencil类-随笔画算法:class Pencil extends drawings//随笔画类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:2)Line类-画直线算法:class Line extends drawings //直线类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);System.out.println(" Line ");}}截图:3)Rect类-画矩形算法:class Rect extends drawings//矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:4)RoundRect类-画圆角矩形算法:class RoundRect extends drawings//圆角矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2),50, 35);System.out.println(" RoundRect ");}}截图:5)Oval类-画椭圆算法:class Oval extends drawings//椭圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:6)Circle类-画圆算法:class Circle extends drawings//圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));}}截图:7)橡皮擦算法:class Rubber extends drawings//橡皮擦类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(255, 255, 255));g2d.setStroke(new BasicStroke(stroke + 4,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:8)填充算法:int tu[][] ;public void setColor(int x, int y,Graphics2D g2d){Color newColor = new Color(R,G,B);g2d.setPaint(newColor);g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x, y, x, y);tu[x][y] = get(newColor);System.out.println("tu"+tu[x][y]);// g2d.drawLine(x, y, x+1, y);//g2d.drawLine(x, y, x, y+1);// g2d.drawLine(x, y, x+1, y+1);}public void floodFill8(int x, int y,int newColor,int oldColor,Graphics2D g2d,Point s){int haColor = getpixel(x,y,s);if( tu[x][y] == newColor)haColor =newColor;if(x >= 0 && x < 1024 && y >= 0 && y < 980 && (haColor == oldColor) && haColor != newColor){System.out.println("进来了");System.out.println("S x "+x+" y "+y+" "+newColor);setColor(x, y, g2d);floodFill8(x + 1, y,newColor, oldColor, g2d,s);floodFill8(x - 1, y,newColor, oldColor, g2d,s);floodFill8(x, y + 1, newColor, oldColor, g2d,s);floodFill8(x, y - 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y - 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y - 1, newColor, oldColor, g2d,s);}}int getpixel(int x,int y,Point a){//获得当前坐标颜色信息Robot rb = null; //java.awt.image包中的类,可以用来抓取屏幕,即截屏。
计算机图形学实验报告4
![计算机图形学实验报告4](https://img.taocdn.com/s3/m/869a166df011f18583d049649b6648d7c1c7082c.png)
计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。
二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。
三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。
通过设置线条颜色、填充颜色等属性,增强图形的表现力。
2、图形的几何变换实现图形的平移、旋转和缩放操作。
观察不同变换参数对图形的影响。
3、三维图形的生成构建简单的三维模型,如立方体、球体等。
应用光照和材质效果,使三维图形更加逼真。
四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。
然后,定义绘图窗口的大小和坐标范围。
接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。
最后,设置图形的颜色和填充属性,使图形更加美观。
2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。
对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。
对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。
3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。
然后,设置光照的位置、颜色和强度等参数。
接着,为模型添加材质属性,如颜色、反射率等。
最后,使用渲染函数将三维模型显示在屏幕上。
五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。
例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。
2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。
在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。
3、三维图形的生成生成的三维模型具有一定的立体感和真实感。
图形学试验内容及报告模板
![图形学试验内容及报告模板](https://img.taocdn.com/s3/m/2ddcc008fad6195f312ba63a.png)
实验内容一:1.实现图形的生成算法,实现直线、圆、椭圆的生成算法,对各种算法进行效率及效果的分析和比较,学有余力的同学可在对现有算法理解的基础上,能自行设计二维图形的生成算法并编程实现。
2.实现填充算法,能搞实现矩形、多边形、圆、椭圆的填充。
3.实现裁剪算法,理解并实现直线和多边性裁剪,对各种直线裁剪算法进行效率及效果的分析和比较。
4.实现图形的坐标变换,实现二维图形的基本变换,包括平移、旋转、比例、对称变换。
5.实现简单的三次Bezier曲线。
实验指导:第一步:进一步了解《计算机图形学》课程的知识结构体系,绘制整个课程的知识结构逻辑示意图,类似于:(图一)第二步:根据所绘制的知识结构图,设计DOS菜单,要利用多级菜单实现各种功能。
比如,主界面是大项,诸如二维线画图元、二维填充图元、二维裁剪等,子菜单使这些大项中的一些功能或者小项。
#includegraphics.h……Void DDACircle()Void m_zhongzitianchong()…….main(){int r=100;int a=0;int b=1;int d=1;int s=1;int x1,y1,x2,y2,x3,y3,x,y,h;int color=1,color2=1;int gdriver,gmode;gdriver=DETECT;gmode=0;initgraph( &gdriver,&gmode," ");setcolor(1);while(b){ printf("what do you want to paint\n0...... for cirle\n1...... for a line\n2...... for rectangle\n3...... for trigon\nyou choose:");scanf("%d",&a);printf("%d",a);switch(a){case 0 :{ cleardevice();printf("\nplease input (r,x1,y1,color):");scanf("%d %d %d %d",&r,&x1,&y1,&color);DDACircle(r,x1,y1,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1 ,2or3 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 forshuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_cirlepinyi(&x1,&y1,h);DDACircle(r,x1,y1,color);break;case 2:m_cirlefangda(&r);DDACircle(r,x1,y1,color);break;case 3:printf(" please input your like color:");scanf("%d",&color2);m_zhongzitianchong(x1,y1,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;}case 1 :{cleardevice();printf("\nplease input (x1,y1,x2,y2,color):");scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&color);dda_line(x1, y1, x2, y2,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1 or 2 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_pingyi(&x1,&y1,&x2,&y2,h);dda_line(x1, y1, x2, y2,color);break;case 2:m_fangda(&x1,&y1,&x2,&y2);dda_line(x1, y1, x2, y2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;}case 2:cleardevice();printf("\nplease input (x1,y1,x2,y2,color):");scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&color);m_rectangle(x1,y1,x2,y2,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1,2or3 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_pingyi(&x1,&y1,&x2,&y2,h);m_rectangle(x1, y1, x2, y2,color);break;case 2:m_fangda(&x1,&y1,&x2,&y2);m_rectangle(x1, y1, x2, y2,color);break;case 3:printf(" please input your like color:");scanf("%d",&color2);x=(x1+x2)/2;y=(y1+y2)/2;m_zhongzitianchong(x,y,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;case 3:cleardevice();printf("\nplease input (x1,y1,x2,y2,x3,y3,color):");scanf("%d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&color);m_trigon(x1,y1,x2,y2,x3,y3,color);printf("\n Do you want to pinyi?if you want to please choose 1 else 0\n1 or 0 you choose:");while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1,3 or 2 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_trigonpinyi(&x1,&y1,&x2,&y2,&x3,&y3,s);m_trigon(x1,y1,x2,y2,x3,y3,color);break;case 2:m_trigonfangda(&x1,&y1,&x2,&y2,&x3,&y3);m_trigon(x1,y1,x2,y2,x3,y3,color);case 3:printf(" please input your like color:");scanf("%d",&color2);x=(x1+x2+x3)/3;y=(y1+y2+y3)/3;m_zhongzitianchong(x,y,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0you choose:");scanf("%d",&b);}}}实验内容二:自由选题做一个小程序或小游戏,开发工具不限,要求必须用到几何变换(平移、旋转、比例)所学内容。
计算机图形学第五次实验报告
![计算机图形学第五次实验报告](https://img.taocdn.com/s3/m/2beecac3294ac850ad02de80d4d8d15abe2300dd.png)
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/df00589151e2524de518964bcf84b9d528ea2c3b.png)
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/ff3dbdf268dc5022aaea998fcc22bcd127ff4258.png)
图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。
通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。
实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。
我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。
通过改变像素的颜色值,我们可以创建出各种各样的图像效果。
实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。
我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。
这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。
实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。
我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。
通过这些技术,我们可以创建出更加复杂和精细的图像。
实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。
我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。
通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。
实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。
我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。
通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。
实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。
我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。
通过这些技术,我们可以创建出逼真的三维场景和动画效果。
总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。
我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。
图形学实验报告2
![图形学实验报告2](https://img.taocdn.com/s3/m/656ac061a417866fb84a8e59.png)
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView drawing
三、实验要求:
实验前须规划程序界面和按钮的相关事件的编写代码。实验时进行代码的调试。
四、实验代码
1,图形的变换
// TransformView.cpp : implementation of the CTransformView class
//
#include "stdafx.h"
#include "Transform.h"
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
for(i=1; i<3; i++)
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码
《计算机图形学》实验报告
![《计算机图形学》实验报告](https://img.taocdn.com/s3/m/54c38d9d59f5f61fb7360b4c2e3f5727a5e924d2.png)
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
图形学 实验报告
![图形学 实验报告](https://img.taocdn.com/s3/m/384874735627a5e9856a561252d380eb62942301.png)
图形学实验报告一、实验介绍图形学是计算机科学中的一个重要领域,主要研究计算机图形的生成、显示和处理。
本次实验旨在通过学习图形学的基本概念和算法,深入理解计算机图形的原理与应用。
二、实验内容本次实验主要包含以下内容:1. 图形学的基本概念和历史发展2. 图形学中常用的几何变换和投影算法3. 光栅化算法及其在图形渲染中的应用4. 着色和光照模型的原理及实现方法5. 三维场景建模与渲染技术三、实验步骤和结果1. 图形学的基本概念和历史发展首先我们了解了图形学的基本概念和历史发展。
图形学起源于20世纪60年代,当时主要用于计算机辅助设计(CAD)和计算机辅助制造(CAM)领域。
随着计算机技术的不断发展,图形学逐渐应用于计算机图形的显示和处理领域。
2. 几何变换和投影算法接下来我们学习了图形学中常用的几何变换和投影算法。
几何变换包括平移、旋转和缩放等操作,通过改变图形的位置、角度和尺寸,实现对图形的变换和组合。
投影算法主要用于将三维空间中的图形投影到二维屏幕上,实现透视效果。
3. 光栅化算法及其应用在图形渲染中,光栅化算法是非常常用的技术。
光栅化算法将连续的几何图形转化为离散的像素,实现图形在屏幕上的显示。
常见的光栅化算法包括扫描线算法和边界填充算法。
4. 着色和光照模型的原理与实现为了实现真实感的图形渲染,着色和光照模型是不可或缺的。
着色模型描述了在光照条件下物体表面的颜色,常见的着色模型包括平面着色模型和高洛德着色模型。
光照模型则描述了光线在物体表面的反射和折射过程,常见的光照模型包括冯氏光照模型和布林-菲菲尔德模型。
5. 三维场景建模与渲染技术最后我们学习了三维场景建模与渲染技术。
三维场景建模主要包括建立三维模型和场景的几何结构信息。
三维渲染技术则是将建模得到的三维场景转换为可显示的二维图像。
四、实验总结通过本次实验的学习,我们深入了解了图形学的基本概念和算法。
图形学在计算机图形的生成、显示和处理中具有重要应用,对于计算机科学专业学生来说,学习图形学是必不可少的。
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/4033a652804d2b160b4ec02d.png)
院系:数学与统计学学院专业:信息与计算机科学年级: 2011 级课程名称:计算机图形学组号:(1)组组员:陈怡璠 (11151016)陆海燕(11151013)王内(11151007)指导教师:孙阳光2014年06月25日年级2011级学号11151016 11151013 11151007 专业信息与计算科学姓名陈怡璠陆海燕王内实验时间2014年5月28日实验地点9#206实验名称直线的扫描转换实验类型设计型综合型创新型√实验目的或要求1.实验目的1)理解在显示器上画图与在纸上画图的本质区别;2)掌握直线的光栅扫描转换过程;3)掌握不同算法绘制直线的思路和优缺点。
2. 实验要求1)能编写、调试通过相应直线扫描转换算法,用算法绘制直线。
2)将像素网格表现出来,建立网格坐标系;3)用橡皮筋的形式输入参数;4)鼠标移动时,显示鼠标当前位置;5)显示判别式的计算过程和下一点的选择策略;6)记录生成点的坐标,建议用表的形式;7)图形生成过程可以重复进行。
实验原理1.直线的中点算法算法的主要思想:讨论斜率k∈[1,+∞)上的直线段的中点算法。
对直线01p p,左下方的端点为p(x,y),右上方的端点为1p(1x,1y)。
直线段的方程为:y mx B=+⇔yy x B xy yx xBx∆=+⇔∆=∆+∆∆(,)0F x y xy yx xB⇔=∆-∆-∆=(1.2)现在假定已求得像素(,,i r ix y),则得:,,11(,]22i i r i rx x x∈-+由于直线的斜率k∈[1,+∞),故m=1/k∈(0,1],则:1,,13(,]22i i r i rx x x+∈-+在直线1iy y=+上,区间,,13(,]22i r i rx x-+内存在两个像素NE和E。
根据取整原则,当(1.4)(1.3)(1.1)实验原理11(,)i ix y++在中点M11(,)2i ix y++右方时,取像素NE,否则取像素E,即,11,,1()()01()()0i r ii ri r ix E F Mxxx NE F Mx+++⎧⇔≤=⎨+⇔>⎩ii点当(,y+1)在左方时点当(,y+1)在右方时若取2()id F M=,则上式变为,1,,()01(0i r ii ri r ix E dxx NE d+⎧≤=⎨+>⎩点当点)当计算id的递推公式如下:,11,12[(2)()]0122(,2)122[(2)(1)]2i i rii i iii i rx y y x xB dd F x ydx y y x xB++⎧∆+-∆+-∆⎪≤⎪=++=⎨>⎪∆+-∆++-∆⎪⎩=202()0i ii id x dd x y d+∆≤⎧⎨+∆-∆>⎩算法的初始条件为:⎪⎩⎪⎨⎧=∆-∆=++=),(),(2)1,21(2,0,0yxyxyxyxFdyr相应的程序示例:public function drawLine(pixelDrawer:Function,x:int,y:int,1x:int,1y:int):void{var dx:Number =1x -x;var dy:Number =1y -y;var x:Number;var y:Number;if ((dx == 0) && (dy == 0) ){pixelDrawer(x,y);return;}else if ( dx==0 )(1.6)(1.8)(1.7)(1.5)实验原理{var step:Number = dy / Math.abs(dy);for (y=0y; y!=1y; y+=step )pixelDrawer(x, y );}else if ( dy==0 ){step = dx / Math.abs(dx);for (x=x; x!=1x; x+=step )pixelDrawer( x,y );}Var stepX :Number = dx / Math.abs(dx);var stepY:Number = dy / Math.abs(dy);x =x, y =y;pixelDrawer( x, y );var k:Number = dy / dx;if ( Math.abs(k)<1.0 ){var a:Number = -Math.abs(dy);var b:Number = Math.abs(dx);var d:Number = 2 * a + b;var d1:Number = 2 * a;var d2:Number = 2 * (a + b);while ( x!=1x ){if ( d<0 ) { x += stepX; y += stepY; d += d2; }else { x += stepX; d += d1; }pixelDrawer( x, y );}}else{a = -Math.abs(dx);b = Math.abs(dy);d = 2 * a + b, d1 = 2 * a, d2 = 2 * (a + b);while ( y!=1y )实验原理{if ( d<0 ) { x += stepX; y += stepY; d += d2; }else { y += stepY; d += d1; }pixelDrawer( x, y );}}pixelDrawer(1x,1y );}2.直线的数值微分法算法的主要思想已知待扫描转换的直线为p(x,y),1p(1x,1y),又△1xxx-=,△1yyy-=,则设k=1/m=/x y∆∆(即k∈(0,1])。
图形学实验报告范文
![图形学实验报告范文](https://img.taocdn.com/s3/m/8cdbfadf29ea81c758f5f61fb7360b4c2e3f2a38.png)
图形学实验报告范文计算机图形学实验报告书姓名:班级:学号:中南大学软件学院二0一一年六月一.实验的任务、性质与目的计算机图形学是软件工程专业的一门专业技术课程。
计算机图形学应用于生产、工程、文化和艺术等领域,该课程对于培养和提高学生的算法设计和实现能力具有非常重要的意义。
该课程以培养学生算法设计与实现的能力为目标,通过课堂教学和实验,使学生了解、掌握计算机图形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境。
二.基本原理实验主要基于如下知识和内容:1.实验环境配置、基本图元绘制;2.绘制抛物线和正弦曲线;3.图形变换;4.颜色和光照,绘制旋转抛物面;5.显示列表;6.纹理映射;7.复杂图形绘制,绘制Bezier曲线,Hermite曲线;8.复杂图形绘制,绘制Bezier曲面。
三.实验选题与基本要求1、实验环境配置、基本图元绘制配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。
2、绘制抛物线和正弦曲线计算抛物线和正弦曲线,将结果存放在一个数组中,再用OpenGL函数绘制相应的图形。
3、图形变换要求学会投影、视口变换、旋转、平移和缩放的编程方法,用一个实例完成上述要求。
4颜色和光照要求学会光源设置、材质设置和法向量设置,用一个实例(如旋转抛物面)完成上述要求。
5、显示列表要求学会用显示列表输出文字和图形,用一个实例完成上述要求。
6、纹理映射要求学会将纹理图像映射到物体表面,用一个实例完成上述要求。
7、复杂图形绘制要求学会Bezier曲线和Hermite曲线的绘制方法。
8、复杂图形绘制绘制Bezier曲面,要求设置光源、材质和法向量,并进行纹理映射,用键盘控制是否进行纹理映射。
四.实验内容和步骤1、实验环境配置、基本图元绘制配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。
图形学实验报告1
![图形学实验报告1](https://img.taocdn.com/s3/m/05b862699b6648d7c1c74670.png)
if(d<=0)
{
x++;
d+=delta2;
}
else
{
x++;
y--;
d+=delta1;
}
pDC->SetPixel(x,y,color);
}
}
if(k >1)
{
d=2*b+a;delta1=2*b;delta2=2*(a+b);
while(y < y1)
{
if(d<=0)
{
y++;
d+=delta1;
}
pDC->SetPixel(x,y,color);
}
}
(2)运行结果:
五.实验心得及建议:
在这次的图形学实验中,使我了解了图形界面的编程基础。对直线生成算法有了初步认识,对中点画线有了较为深的了解,为以后的图形学学习打下基础。
}
else
{
x++;y++;
d+=delta2;
}
pDC->SetPixel(x,y,color);
}
}
if(k <-1)
{
d=a-2*b;delta1=-2*b;delta2=2*(a-b);
while(y >y1)
{
if(d >0)
{
y--;
d+=delta1;
}
else
{
x++;y--;
d+=delta2;
三、算法设计与分析:
中点画线算法:
(1)输入直线的起点坐标P0(x0,y0)和终点坐标P1(x1,y1).
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/5a26f368cec789eb172ded630b1c59eef8c79a38.png)
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
图形学画圆实验报告
![图形学画圆实验报告](https://img.taocdn.com/s3/m/b3d344ef524de518964b7d13.png)
4.2.3程序实现与上机实习(二)一、实验目的编写圆和椭圆的扫描转换算法程序,验证算法的正确性。
二、实验任务1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;2.添加鼠标程序,实现交互式画圆;3.编写中点画椭圆法的扫描转换程序;4.添加鼠标程序,实现交互式画椭圆;三、实验内容1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。
通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为x’=x+x0y’=y+y0即p’1(x0 +x, y+y0)其它7个对称点分别是:p’2(x0+y,y+x0), p’3 (x0+y,y0-x),p’4 (x0+x,y0-y),p’5 (x0-x,y0-y),p’6 (x0-y,y0-x),p’7 (x0-y,y0+x),p’8 (x0-x,y0+y)算法程序如下:{int x,y;float d;x=0;y=r;d=1.25-r;CirPot(x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}(x0+R,y0)else{d+=2*(x-y)+5;x++; y--;}CirPot(x0,y0,x,y,color);} /* while*/} /* MidpointCiecle */int CirPot(int x0,int y0,int x,int y,int color){Setpixel((x0+x),(y0+y));Setpixel((x0+y),(y0+x));Setpixel((x0+y),(y0-x));Setpixel((x0+x),(y0-y));Setpixel((x0-x),(y0-y));Setpixel((x0-y),(y0-x));Setpixel((x0-y),(y0+x));Setpixel((x0-x),(y0+y));}程序实现步骤:(1)建立MidPointCircle工程文件;(2)右击CMidPointCircleView类,建立成员函数void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color)int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color)(3) 编写成员函数代码,程序如下:void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {int x,y;float d;x=0;y=r;d=1.25-r;CirPot(pDC,x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}else{d+=2*(x-y)+5;x++; y--;}CirPot(pDC,x0,y0,x,y,color);} /* while*/}int CMidPointCircleView::CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) {pDC->SetPixel((x0+x),(y0+y),color);pDC->SetPixel((x0+y),(y0+x),color);pDC->SetPixel((x0+y),(y0-x),color);pDC->SetPixel((x0+x),(y0-y),color);pDC->SetPixel((x0-x),(y0-y),color);pDC->SetPixel((x0-y),(y0-x),color);pDC->SetPixel((x0-y),(y0+x),color);pDC->SetPixel((x0-x),(y0+y),color);return 0;}(4)编写OnDraw(CDC* pDC)函数,程序如下:void CMidPointCircleView::OnDraw(CDC* pDC){CMidPointCircleDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereMidpointCircle(pDC,100, 100, 10, RGB(255,0,0));MidpointCircle(pDC,500, 300, 60, RGB(255,255,0));}(6)编译、运行程序,查看结果。
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/b840c05250e2524de5187ee3.png)
图形学实验报告计算机图形学实验指导书学号:1441901105姓名:谢卉实验一:图形的几何变换实验学时:4学时实验类型:验证实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。
如可能也可进行裁剪设计。
二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。
建议采用VC++实现OpenGL程序设计。
三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Tx y’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
其交互方式可先定义键值,然后操作功能键使其移动。
2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。
则有:x’=x*s y’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。
一般情况下,参考点在图形的左下角或中心。
设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx 和Sy必须大于零)。
3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。
旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/6ddf6e04ff4733687e21af45b307e87100f6f85d.png)
实验内容:通 过实验掌握光 照模型的原理 和实现方法, 了解不同光照 模型对物体表 面光照效果的
影响。
纹理映射
定义:将纹理图像映射到三维物 体表面的过程
方法:根据物体表面的几何形状, 将纹理图像按照一定的规则和算 法进行拉伸、扭曲和拼接等操作, 最终覆盖在物体表面
添加标题
添加标题
添加标题
添加标题
提高编程能力
熟练使用相关编程语言和工 具
掌握计算机图形学的基本原 理和算法
学会分析和解决图形学中的 问题
提高编程技巧和解决问题的 能力
02
实验内容
图形渲染流程
加载场景和模型 设置相机和光源 几何着色器处理顶点数据 光栅化着色器生成像素数据
OpenGL基本操作
创建窗口:使用OpenGL创建 窗口,设置渲染上下文
熟悉图形渲染流程
了解图形渲染的 基本原理和流程
掌握图形渲染的 关键技术和技巧
熟悉图形渲染的 应用场景和优势
Hale Waihona Puke 掌握图形渲染的 未来发展方向和 趋势
掌握OpenGL的使用
学习OpenGL的基本概念和原理 掌握OpenGL的编程接口和开发流程 理解OpenGL在计算机图形学中的应用和优势 学会使用OpenGL进行基本的图形渲染和交互操作
目的:增加物体的表面细节和真 实感
应用:游戏开发、电影制作、虚 拟现实等领域
03
实验过程
实验环境搭建
安装操作系统: 选择适合的操
作系统,如 Windows或
Linux
安装开发工具: 安装所需的集
成开发环境 (IDE)和编
译器
安装图形库: 安装OpenGL、
DirectX或其 他的图形库
计算机图形学实验报告三
![计算机图形学实验报告三](https://img.taocdn.com/s3/m/29c4bbb77e21af45b207a866.png)
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/fafefaaebb0d4a7302768e9951e79b896802683b.png)
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/5542608c964bcf84b9d57ba6.png)
山东建筑大学测绘地理信息学院实验报告(2016—2017学年第一学期)课程:计算机图形学专业:地理信息科学班级:地信141学生姓名:王俊凝学号:20140113010指实验一直线生成算法设计一、实验目的掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。
二、实验任务在TurboC环境下开发出绘制直线和圆的程序。
三、实验仪器设备计算机。
四、实验方法与步骤1 运行TurboC编程环境。
2 编写Bresenham直线绘制算法的函数并进行测试。
3 编写中点圆绘制算法的函数并进行测试。
4 增加函数参数,实现直线颜色的设置。
提示:1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。
2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。
这样,在向函数传入参数时,可使用两个点类型来传参。
定义方法为:typedef struct{int x;int y;}pt2;此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。
3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。
4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。
五、注意事项1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。
2 程序提交.c源文件,函数前和关键代码中增加注释。
程序模板#include <stdio.h>#include <graphics.h>typedef struct{int x;int y;}pt2;/*declare your drawing functions.*/void drawline(pt2 startpt,pt2 endpt,int color);void drawcircle(pt2 centerpt,int radius,int color);void circlePlotPoints(pt2 centerpt,int x,int y,int color);int main(){int color,radius;pt2 startpt,endpt,centerpt;/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, "C:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing.");getchar();/*invoke your drawing functions one by one.*/ startpt.x=10;startpt.y=10;endpt.x=300;endpt.y=250;color=4;drawline(startpt,endpt,color);centerpt.x=200;centerpt.y=180;radius=145;color=8;drawcircle(centerpt,radius,color);/*end drawing.*/printf("Drawing is done, press enter to exit."); getchar();/*close graphics driver.*/closegraph();}/** draw line* startpt: the start point of the line* endpt: the end point of the line* color: the color of the line*/void drawline(pt2 startpt,pt2 endpt,int color){int dx=abs(startpt.x-endpt.x), dy=abs(startpt.y-endpt.y);int p=2*dy-dx;int twoDy=2*dy,twoDyDx=2*(dy-dx);int x,y,xEnd;if(startpt.x>endpt.x){x=endpt.x;y=endpt.y;xEnd=startpt.x;}else{x=startpt.x;y=startpt.y;xEnd=endpt.x;}putpixel(x,y,color);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyDx;}putpixel(x,y,color);}}/** draw circle* centerpt: the center of the circle* radius: the radius of the circle* color: the color of the circle*/void drawcircle(pt2 centerpt,int radius,int color) {int x=0;int y=radius;int p=1-radius;circlePlotPoints(centerpt,x,y,color);while(x<y){x++;if(p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circlePlotPoints(centerpt,x,y,color);}}void circlePlotPoints(pt2 centerpt,int x,int y,int color) {putpixel(centerpt.x+x,centerpt.y+y,color);putpixel(centerpt.x-x,centerpt.y+y,color);putpixel(centerpt.x+x,centerpt.y-y,color);putpixel(centerpt.x-x,centerpt.y-y,color);putpixel(centerpt.x+y,centerpt.y+x,color);putpixel(centerpt.x-y,centerpt.y+x,color);putpixel(centerpt.x+y,centerpt.y-x,color);putpixel(centerpt.x-y,centerpt.y-x,color);}运行结果实验二多边形区域填充算法设计一、实验目的掌握多边形图形元素的填充算法,利用编程语言C实现多边形的区域填充算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东建筑大学测绘地理信息学院实验报告(2016—2017学年第一学期)课程:计算机图形学专业:地理信息科学班级:地信141学生姓名:王俊凝学号:010指实验一直线生成算法设计一、实验目的掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。
二、实验任务在TurboC环境下开发出绘制直线和圆的程序。
三、实验仪器设备计算机。
四、实验方法与步骤1 运行TurboC编程环境。
2 编写Bresenham直线绘制算法的函数并进行测试。
3 编写中点圆绘制算法的函数并进行测试。
4 增加函数参数,实现直线颜色的设置。
提示:1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。
2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。
这样,在向函数传入参数时,可使用两个点类型来传参。
定义方法为:typedef struct{int x;int y;}pt2;此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。
3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。
4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。
五、注意事项1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。
2 程序提交.c源文件,函数前和关键代码中增加注释。
程序模板#include <>#include <>typedef struct{int x;int y;}pt2;/*declare your drawing functions.*/void drawline(pt2 startpt,pt2 endpt,int color);void drawcircle(pt2 centerpt,int radius,int color);void circlePlotPoints(pt2 centerpt,int x,int y,int color);int main(){int color,radius;pt2 startpt,endpt,centerpt;/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, "C:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing."); getchar();/*invoke your drawing functions one by one.*/ =10;=10;=300;=250;color=4;drawline(startpt,endpt,color);=200;=180;radius=145;color=8;drawcircle(centerpt,radius,color);/*end drawing.*/printf("Drawing is done, press enter to exit."); getchar();/*close graphics driver.*/closegraph();}/** draw line* startpt: the start point of the line* endpt: the end point of the line* color: the color of the line*/void drawline(pt2 startpt,pt2 endpt,int color) {int dx=abs dy=abs int p=2*dy-dx;int twoDy=2*dy,twoDyDx=2*(dy-dx);int x,y,xEnd;if>{x=;y=;xEnd=;}else{x=;y=;xEnd=;}putpixel(x,y,color);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyDx;}putpixel(x,y,color);}}/** draw circle* centerpt: the center of the circle* radius: the radius of the circle* color: the color of the circle*/void drawcircle(pt2 centerpt,int radius,int color) {int x=0;int y=radius;int p=1-radius;circlePlotPoints(centerpt,x,y,color);while(x<y){x++;if(p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circlePlotPoints(centerpt,x,y,color);}}void circlePlotPoints(pt2 centerpt,int x,int y,int color) {putpixel+x,+y,color);putpixel,+y,color);putpixel+x,,color);putpixel,,color);putpixel+y,+x,color);putpixel,+x,color);putpixel+y,,color);putpixel,,color);}运行结果实验二多边形区域填充算法设计一、实验目的掌握多边形图形元素的填充算法,利用编程语言C实现多边形的区域填充算法。
二、实验任务在TurboC环境下开发出多边形区域填充的程序。
三、实验仪器设备计算机。
四、实验方法与步骤1 运行TurboC编程环境。
2 编写基于四连通区域的种子填充算法。
3 编写基于八连通区域的种子填充算法。
4 对填充函数进行测试。
提示:1. 编程中需要使用数据结构中的栈,可利用C语言线编写一个对应的数据结构,然后在填充函数中进行使用。
以下过程是对四连通区域填充过程的分解,可作为算法实现的参考。
2. 可将两种填充算法分别设计一个函数,例如RegionFill4(…)、RegionFill8(…),函数中间是作为参数输入的区域。
3. 区域的表示可以采用一维数组形式,数组类型是点类型(实验一中定义的结构体),依次将构成多边形的每个顶点的坐标创建点变量,并保存到一个一维数组中进行参数传递。
4. 在main函数中来生成一定的区域,并生成表示区域的一维数组,然后通过调用填充算法函数,完成区域填充。
#include <>#include <>void boundaryFill4(int x,int y,int fill,int boundary){int current;current=getpixel(x,y);if((current!=boundary)&&(current!=fill)){putpixel(x,y,fill);boundaryFill4(x+1,y,fill,boundary);boundaryFill4(x-1,y,fill,boundary);boundaryFill4(x,y+1,fill,boundary);boundaryFill4(x,y-1,fill,boundary);}}int main(){/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, "C:\\TC20\\BGI");moveto(0,0);lineto(120,100);lineto(50,80);lineto(0,0);boundaryFill4(50,78,2,15);/*end drawing.*/printf("Drawing is done, press enter to exit.");getchar();/*close graphics driver.*/closegraph();}运行结果五、注意事项1 代码要求正确运行,填充颜色设置为函数的参数,实现可配置。
2 程序提交.c源文件,函数前和关键代码中增加注释。
实验三图形变换算法设计一、实验目的掌握图形变换的类型和算法,利用编程语言C,实现二维图形的平移、缩放、旋转和仿射变换算法。
二、实验任务在TurboC环境下开发出二维图形的平移、缩放、旋转和仿射变换算法。
三、实验仪器设备计算机。
四、实验方法与步骤1 运行TurboC编程环境。
2 编写二维图形的平移算法。
3 编写二维图形的固定缩放算法。
4 编写二维图形的固定点旋转算法。
5 编写二维图形的固定点缩放算法。
6 编写二维图形的复合变换算法,实现图形的平移、旋转和缩放算法。
7 编写二维图形的仿射变换算法。
提示:1. 针对每种变换算法,编写一个函数,并设计相应的参数。
参数可以使用实验一编写的点类型来构造。
2. 为更好地体现变换效果,在试验一编写的直线绘制算法基础上,再编写一个绘制多边形的算法函数,该函数只是将传入的多边形顶点依次进行直线绘制即可完成。
2. 在main函数中,通过组合调用以上函数,实现对二维多边形图形的几何变换。
查看方法可以设定为:首先调用多边形绘制算法函数,生成初始图形,然后通过调用变换函数,得到变换后的起点和终点坐标,最后再调用多边形绘制算法,查看变换后的图形样式。
3. 为使图形比较更为明显,可在多边形绘制参数中增加颜色值,并分别以不同颜色绘制变换前、后的多边形。
4. 对图形进行多次变换,依次查看每种几何变换的特点。
#include <>#include <>#include <>#define WINDOW_HEIGHT 300typedef struct tEdge{int yUpper;float xIntersect,dxPerScan;struct tEdge *next;}Edge;typedef struct{int x;int y;}dcPt;/*declare your drawing functions.*/void insertEdge(Edge *list,Edge *edge){Edge *p,*q=list;p=q->next;while(p!=NULL){if(edge->xIntersect<p->xIntersect)p=NULL;else{q=p;p=p->next;}}edge->next=q->next;q->next=edge;}int yNext(int k,int cnt,dcPt *pts){int j;if ((k+1)>(cnt-1))j=0;elsej=k+1;while(pts[k].y==pts[j].y)if((j+1)>(cnt-1))j=0;elsej++;return(pts[j].y);}void makeEdgeRec(dcPt lower,dcPt upper,int yComp,Edge *edge,Edge *edges[]){edge->dxPerScan=(float) e dge->xIntersect=;if<yComp)edge->yUpper=;elseedge->yUpper=;insertEdge(edges[],edge);}void buildEdgeList(int cnt,dcPt *pts,Edge *edges[] ){Edge *edge;dcPt v1,v2;int i,yPrev=pts[cnt-2].y;=pts[cnt-1].x;=pts[cnt-1].y;for(i=0;i<cnt;i++){v2=pts[i];if!={edge=(Edge*)malloc(sizeof(Edge));if <makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);elsemakeEdgeRec(v2,v1,yPrev,edge,edges);}yPrev=;v1=v2;}}void buildActiveList(int scan,Edge *active,Edge *edges[]) {Edge *p,*q;p=edges[scan]->next;while(p){q=p->next;insertEdge(active,p);p=q;}}void fillScan(int scan,Edge *active){Edge *p1,*p2;int i;p1=active->next;while(p1){p2=p1->next;for(i=p1->xIntersect;i<p2->xIntersect;i++)putpixel((int )i,scan,5);p1=p2->next;}}void deleteAfter(Edge *q){Edge *p=q->next;q->next=p->next;free(p);}void updateActiveList(int scan,Edge *active){Edge *q=active,*p=active->next;while(p){if (scan>=p->yUpper){p=p->next;deleteAfter(q);}else{p->xIntersect=p->xIntersect+p->dxPerScan;q=p;p=p->next;}}}void resortActiveList(Edge * active){Edge *q,*p=active->next;active->next=NULL;while(p){q=p->next;insertEdge(active,p);p=q;}}void scanFill(int cnt,dcPt *pts){Edge *edges[WINDOW_HEIGHT],*active;int i,scan;for(i=0;i<WINDOW_HEIGHT;i++){edges[i]=(Edge *)malloc(sizeof(Edge));edges[i]->next=NULL;}buildEdgeList(cnt,pts,edges);active=(Edge *)malloc(sizeof(Edge));active->next=NULL;for(scan=0;scan<WINDOW_HEIGHT;scan++) {buildActiveList(scan,active,edges);if (active->next){fillScan(scan,active);updateActiveList(scan,active);resortActiveList(active);}}}int main(){int cnt=5;dcPt *pts = (dcPt *)malloc(4*sizeof(dcPt));/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, "C:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing."); getchar();/*invoke your drawing functions one by one.*/pts[0].x = 60;pts[0].y = 60;pts[1].x = 180;pts[1].y =165;pts[2].x = 220;pts[2].y = 200;pts[3].x = 90;pts[3].y = 90;pts[4].x = 120;pts[4].y = 100;scanFill(cnt,pts);/*end drawing.*/printf("Drawing is done, press enter to exit."); getchar();/*close graphics driver.*/closegraph();}运行结果五、注意事项1 代码要求正确运行,样条控制点参数实现可配置。