计算机图形学基础
教程
人力资源管理pdf成真迷上我教程下载西门子数控教程protel99se入门教程fi6130z安装使用教程
实验报告_免费下载
湖北民族学院信息工程学院实验报告
(数字媒体技术专业用)
班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年10 月14 日9、10 节 实验地点:数媒实验室
课程名称:计算机图形学基础教程 实验类型:
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
型, 实验题目:直线与圆的绘制
一、实验目的
通过本次实验,熟练掌握DDA、中点、Bresenham直线绘制
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
和中点、Bresenham圆的画法,能够在vc环境下独立完成实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
,逐渐熟悉opengl的语法特点,提高程序基本绘图的能力。
二、实验环境(软件、硬件及条件)
Microsoft vc++6.0 多媒体计算机
三、实验内容
1.从DDA、中点、Bresenham画线法中任选一种,完成直线的绘制。 2.从中点、Bresenham画圆法中任选一种,完成圆的绘制。
四、实验方法与步骤
打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。
程序如下
bresenham画线法:
#include
#include
int bresenham(int x0,int y0,int x1,int y1,int color)
{
int x,y,dx,dy,e,i;
dx=x1-x0;
dy=y1-y0;
e=-dx;
y=y0;
for(x=x0;x<=x1;x++)
{
putpixel(x,y,color);
e+=2*dy;
if(e>=0)
{ y++;
e-=2*dx;
}
}
return 0;
}
int main()
{
initgraph(640,480);
bresenham(0,0,500,200,255);
while(!kbhit())
{
}
closegraph();
return 0;
}
Bresenham画圆法:
#include
#include
int circlepoints(int x,int y,int color)
{
putpixel(255+x,255+y,color);
putpixel(255+y,255+x,color);
putpixel(255-x,255+y,color);
putpixel(255+y,255-x,color);
putpixel(255-x,255-y,color);
putpixel(255-y,255-x,color);
putpixel(255+x,255-y,color);
putpixel(255-y,255+x,color);
return 0;
}
int bresenhamcircle(int r,int color)
{
int x,y,d;
x=0;
y=r;
d=3-2*r;
while(x<=y)
{
circlepoints(x,y,color);
if(d<0)
d+=4*x+6;
else
{
d=d+4*(x-y)+10;
y--;
}
x++;
}
return 0;
}
int main()
{
initgraph(640,480);
bresenhamcircle(100,255);
while(!kbhit())
{
}
closegraph();
return 0;
}
五、实验结果记录与分析
实验结果如下:
六、疑难问题报告
湖北民族学院信息工程学院实验报告
(数字媒体技术专业用)
班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年10 月29 日9、10 节 实验地点:数媒实验室
课程名称:计算机图形学基础教程 实验类型:设计型, 实验题目:多边形的填充算法和曲线的绘制
一、实验目的
通过本次实验,熟练掌握种子填充算法和多边形扫描线填充算法以及bezier曲线或者B样条曲线的基本绘制算法,能够独立在vc环境下实现任意多边形的填充和一般曲线的绘制,进一步熟悉opengl的语法结构和强大的绘图功能,增强多媒体底层程序绘图能力。
二、实验环境(软件、硬件及条件)
Microsoft vc++6.0 多媒体计算机
三、实验内容
1.选择种子填充算法或者多边形的扫描线算法完成多边形的填充。 2.选择bezier曲线或者B样条曲线算法完成曲线的绘制。
四、实验方法与步骤
打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑
程序,编译连接后执行即可。
程序如下:
多边形扫描线填充算法:
//sweep.h
#ifndef SWEEP_H
#define SWEEP_H
struct Edge {
int nxty;
int curx;
int dx, dy;
Edge *nxt;
};
void sweep(int p[][2], int n, void (*setPixel)(int, int));
#endif
//sweepline.cpp
#include
#include
#include
#include "sweep.h"
void myInit();
void setPixel(int x, int y); void myDisplay();
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition (100, 150);
glutCreateWindow("SweepLine");
glutDisplayFunc(&myDisplay);
myInit();
glutMainLoop();
return 0;
}
void setPixel(int x, int y) {
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void myInit() {
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0); }
void myDisplay() {
int i, j;
glClear(GL_COLOR_BUFFER_BIT);
int p[5][2];
p[0][0] = 100; p[0][1] = 300;
p[1][0] = 200; p[1][1] = 50;
p[2][0] = 300; p[2][1] = 100;
p[3][0] = 400; p[3][1] = 0;
p[4][0] = 350; p[4][1] = 470;
sweep(p, 5, setPixel);
glFlush();
}
//sweep.cpp
#include "sweep.h"
#include
using namespace std;
const int MAXN = 1024;
int cp[MAXN][2], n;
inline bool cmp(int i, int j) {
return cp[i][1] < cp[j][1] || (cp[i][1] == cp[j][1] && cp[i][0] < cp[j][0]);
}
Edge * e[MAXN], *h, *ph, *data; void insert(int ly, int px, int ind) {
int y1,y2,y, nxt, pre, flag=0;
nxt = (ind + 1) % n; pre = (ind - 1 + n) % n;
y = cp[ind][1]; y1 = cp[nxt][1]; y2 = cp[pre][1];
if (y1 > y2) swap(y1, y2);
if (y1 < y && y < y2) {
//需缩短一个单位
flag = 1;
}
h = e[ly]; ph=NULL;
while (h) {
if (h->dy > cp[ind][1] || (h->dy == cp[ind][1] && h->dx > cp[ind][0])) break;
ph = h;
h = h->nxt;
}
data = new Edge;
data->curx = px; data->nxty = cp[ind][1]; data->dx = cp[ind][0] - px; data->dy = cp[ind][1] -
ly; data->nxt = NULL;
if (flag) data->nxty--;
if (ph) {
data->nxt = ph->nxt;
ph->nxt = data;
} else {
data->nxt = e[ly];
e[ly] = data;
}
}
int ex[MAXN][MAXN], ne[MAXN]; inline int abs(int a) {
return a > 0 ? a : -a;
}
void makepoint(int line, Edge *h) {
int dx = h->dx, dy = h->dy, cnt=0;
int x, y, flag=1;
if ((h->dx)*(h->dy)<0) flag=0;
for (y=line, x=h->curx; y<=h->nxty; y++) {
ex[y][ne[y]++] = x;
cnt += 2*abs(dx);
while (cnt>=2*abs(dy)) {
cnt -= 2*abs(dy);
if (flag) x++;
else x--;
}
}
}
void sweep(int p[][2], int nn, void (*setPixel)(int, int)) {
//对所有点按y坐标递增排序,y坐标相等的按x坐标递增排序
n = nn;
int i, j, k, ind, nxt, pre;
int *num = new int[n]; //点索引;
for (i=0; i p[ind][1]) insert(p[ind][1], p[ind][0], nxt);
if (p[pre][1] > p[ind][1]) insert(p[ind][1], p[ind][0], pre);
}
//处理active edge list
memset(ne, 0, sizeof(ne));
for (i=0; inxt;
}
sort(ex[i], ex[i]+ne[i]);
for (j=0; j
#include
GLfloat ctrlpoints[4][3]={{-4.0,-4.0,0.0},{-2.0,4.0,0.0},{2.0,-4.0,0.0},{4.0,4.0,0.0}};
void init(void)
{
glClearColor(1.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,&ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3); }
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,0.0);
glBegin(GL_LINE_STRIP);
for(i=0;i<=30;i++)
glEvalCoord1f((GLfloat)i/30.0);
glEnd();
glPointSize(5.0);
glBegin(GL_POINTS);
for(i=0;i<4;i++)
glVertex3fv(&ctrlpoints[i][0]);
glEnd();
glFlush();
}
void reshape(int w,int h) {
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-5.0,5.0,-5.0*(GLfloat)h/(GLfloat)w,5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h,5.0*(GLfloat)w/(GLfloat)h,-5.0,5.0,-5.0,5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key,int x,int y)
{
switch(key)
{
case 27:
exit(0);
break;
}
}
int main(int argc,char*argv[]) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
五、实验结果记录与分析
六、疑难问题报告
湖北民族学院信息工程学院实验报告
(数字媒体技术专业用)
班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年11 月26 日9、10 节 实验地点:数媒实验室
课程名称:计算机图形学基础教程 实验类型:设计型, 实验题目:简易交互式绘图系统的制作
一、实验目的
运用前面所学的绘图知识,利用opengl基于MFC或者直接在MFC上调用函数构建一个简单的绘图系统,完成直线、圆、多边形、椭圆、bezier曲线等的绘制以及三维图形的简单运动与变幻以提高综合绘图能力和程序框架建构能力。
二、实验环境(软件、硬件及条件)
Microsoft vc++6.0 多媒体计算机
三、实验内容
在vc环境中,利用opengl基于MFC或者直接在MFC上调用函数构建一个简单的绘图系统,完成直线、圆、多边形、椭圆、bezier曲线等的绘制以及三维图形的简单运动与变幻。自定义菜单栏和工具栏,颜色可选,设计一个漂亮美观的绘图界面,并运行程序实现画图功能。 四、实验方法与步骤
1.新建一个工程,选择MFC AppWizard[exe],并命名,确定后应用程序类型选择单文档,然后都点击下一步(默认的设置),完成后点击
确定,一个基本的mfc程序框架就建立成功了。
2.在工作空间ResourceView中双击Menu,打开IDR_MAINFRAME,自定义或修改菜单选项,并给自定义的菜单选项取一个名字。比如建立“绘图”菜单,在绘图菜单里面再建立“直线”、“多边形”“圆”等多个小菜单,如果菜单里面还要包含子菜单,就要将该菜单属性设置为“弹出”,最终子菜单不需要设置为“弹出”,但需要命一个名以便在程序中引用。例如“直线”在“绘图”菜单里属于最终子菜单,可以命名为“ID_LINE”,相应的矩形命名为“ID_RECT”,圆命名为“ID_CIRCLE”等等。
3.自定义工具栏。建立工具栏与自定义建立菜单类似,首先在工作空间ResourceView中双击Toolbar,可以直接在IDR_MAINFRAME上修改和增删工具,也可以新插入IDR_ToolBar。在工具栏中,自己选择图案颜色绘制画图工具图标,并命以名字,以便在程序中引用,命名方式与自定义菜单栏完全相同。并且工具栏和菜单栏的绘图功能可以相同。
4.将菜单栏、工具栏按钮与程序代码联系起来。运用mfc最大的好处就是它能够简化应用程序,而这正是mfc强大的向导功能所作用的。返回工作空间里的FileView,按快捷方式“ctrl+w”打开mfc向导,选中Message Maps,选择view视图类,在Object IDs里面选择上两步建立的菜单栏和工具栏按钮的名字,在Message里面选择Command命令消息,点击AddFunction,则将相应的消息函数添加到视图类里面去了。我们可以在view.h和view.cpp中找到相应函数的踪影。比
如,直线ID_LINE的消息函数就为OnLine(),矩形ID_RECT的消息函数就为OnRect()等等。
5.根据绘图功能,编写消息函数代码。在FileView中打开Source File选中里边的视图类实现文件view.cpp,找到需要编写的消息函数。例如,写画直线的消息函数就可以找到OnLine函数,修改其函数内容为:void CMy2bView::OnLine()
{ Invalidate();
UpdateWindow();
CClientDC dc(this);
CPen pen;
pen.CreatePen(PS_SOLID,w,m_nColor);
dc.SelectObject(&pen);
dc.MoveTo(500+rand()%20,100+rand()%20);
dc.LineTo(600+rand()%20,300+rand()%20);
// TODO: Add your command handler code here
}
画矩形就找到OnRect函数,修改其函数内容为:
void CMy2bView::OnRect()
{
Invalidate();
UpdateWindow();
CClientDC dc(this);
CPen pen;
CBrush brush;
pen.CreatePen(PS_SOLID,w,m_nColor);
brush.CreateSolidBrush(m_fColor);
dc.SelectObject(&pen);
dc.SelectObject(&brush);
dc.Rectangle(500+rand()%20,300+rand()%20,700+rand()%20,400+rand()%20);
// TODO: Add your command handler code here
}
画bezier曲线就找到OnBezier函数,修改其函数内容为: void CMy2bView::OnBezier()
{
Invalidate();
UpdateWindow();
CClientDC dc(this);
POINT points[7];
points[0].x=300+rand()%50;points[0].y=100+rand()%50;
points[1].x=400+rand()%50;points[1].y=200+rand()%50;
points[2].x=500+rand()%50;points[2].y=200+rand()%50;
points[3].x=600+rand()%50;points[3].y=300+rand()%50;
points[4].x=700+rand()%50;points[4].y=400+rand()%50;
points[5].x=500+rand()%50;points[5].y=400+rand()%50;
points[6].x=400+rand()%50;points[6].y=400+rand()%50;
CPen pen;
CBrush brush;
pen.CreatePen(PS_SOLID,w,m_nColor);
brush.CreateSolidBrush(m_fColor);
dc.SelectObject(&pen);
dc.SelectObject(&brush);
dc. PolyBezier(points,7);
// TODO: Add your command handler code here
}
画一个椭圆的消息函数为:
void CMy2bView::OnEllipse()
{
Invalidate();
UpdateWindow();
CClientDC dc(this);
CPen pen;
CBrush brush;
pen.CreatePen(PS_SOLID,w,m_nColor);
brush.CreateSolidBrush(m_fColor);
dc.SelectObject(&pen);
dc.SelectObject(&brush);
dc.Ellipse(500+rand()%20,100+rand()%20,600+rand()%20,300+rand()%20);
// TODO: Add your command handler code here
}
画一个多边形比如说十二边形:
void CMy2bView::OnN10()
{
Invalidate();
UpdateWindow();
CClientDC dc(this);
CPen pen;
CBrush brush;
pen.CreatePen(PS_SOLID,w,m_nColor);
brush.CreateSolidBrush(m_fColor);
dc.SelectObject(&pen);
dc.SelectObject(&brush);
POINT points[12];
points[0].x=500+rand()%50;points[0].y=100+rand()%50;
points[1].x=600+rand()%50;points[1].y=100+rand()%50;
points[2].x=700+rand()%50;points[2].y=200+rand()%50;
points[3].x=650+rand()%50;points[3].y=300+rand()%50;
points[4].x=700+rand()%50;points[4].y=400+rand()%50;
points[5].x=650+rand()%50;points[5].y=500+rand()%50;
points[6].x=500+rand()%50;points[6].y=500+rand()%50;
points[7].x=400+rand()%50;points[7].y=400+rand()%50;
points[8].x=300+rand()%50;points[8].y=300+rand()%50;
points[9].x=200+rand()%50;points[9].y=250+rand()%50;
points[10].x=150+rand()%50;points[10].y=200+rand()%50;
points[11].x=100+rand()%50;points[11].y=100+rand()%50;
dc.Polygon(points, 12);
// TODO: Add your command handler code here
}
其他图形的代码可以类似添加,这里就不再细说。
线条或图形的边界颜色设置函数代码为:
void CMy2bView::OnColor()
{
CColorDialog Color;
if(Color.DoModal() == IDOK)
m_nColor=Color.GetColor();
// TODO: Add your command handler code here
}
图形的填充函数代码为:
void CMy2bView::OnFillcolor()
{
CColorDialog FillColor;
if(FillColor.DoModal() == IDOK)
m_fColor=FillColor.GetColor();
// TODO: Add your command handler code here
}
其他的如背景颜色设置函数可以类似,这里也不再细说 6.编译连接运行程序,进行画图操作,并保存MFC工程文件。 五、实验结果记录与分析
绘图系统界面如图:
六、疑难问题报告