| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7858 人关注过本帖, 1 人收藏
标题:[经验]计算机图形学实验报告
只看楼主 加入收藏
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏(1)
 问题点数:0 回复次数:14 
[经验]计算机图形学实验报告

计算机图形学试验

班级:应数0301

学号:1301030106

姓名:张祖锦

指导老师:陈明

目录

实验1 生成直线段的DDA算法·············································· 1

实验2 生成直线段的中点算法················································ 3

实验3 生成圆弧的中点算法···················································· 7

实验4 生成椭圆弧的中点算法·············································· 10

实验5 三点确定一圆····························································· 13

搜索更多相关主题的帖子: 计算机图形学 实验报告 FONT align 
2005-12-29 18:56
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

实验1 生成直线段的DDA算法

一. 算法思想

设过端点P1(x1 ,y1)P1(x2 ,y2)的直线段为L(P1 ,P2),则直线段L的斜率为 。要在显示器显示L,必须确定最佳逼近L的像素集合。如果|k|<=1,我们从L的起点P1的横坐标x1L的终点P2的横坐标x2步进,取步长h=1(个象素),用L的直线方程y=kx+b计算相应的y坐标,并取象素点(x, round(y))作为当前点的坐标。因为 ,所以,当Dx =1; yi+1 = yi + k。也就是说,当x每递增1y递增k(即直线斜率),否则换个思路,从y1步进,具体思路见程序。根据这个原理,我们可以写出DDA画线算法程序。

二. C源程序

#include<graphics.h>

#include<stdio.h>

/**********生成直线段的DDA算法**********/

void LineDDA(int x1,int y1,int x2,int y2,int color)

{

float x,y,dx,dy,k;

dx=x2-x1;

dy=y2-y1;

k=dy/dx;

if(k>=-1 && k<=1)

{

y=y1;

for(x=x1;x<=x2;x++)

{

putpixel((int)x,(int)(y+0.5),color);

y+=k;

}

}

else

{

k=1.0/k;

x=x1;

for(y=y1;y<=y2;y++)

{

putpixel((int)(x+0.5),(int)y,color);

x+=k;

}

}

}

/**********主函数**********/

void main( )

{

int graphdriver=DETECT,graphmode;

int x1,y1,x2,y2,color;

initgraph(&graphdriver,&graphmode,"\\tc");

printf("****************************************\n");

printf("* DDA Algorithm for Lining *\n");

printf("* Creator:Zhang Zujin *\n");

printf("* *\n");

printf("* Input:Two Pixels and Color Index *\n");

printf("* Output: The Line Related to Input*\n");

printf("****************************************\n\n");

printf("Please Input Two Pixels(x1,y1),(x2,y2):");

scanf("%d%d%d%d", &x1,&y1,&x2,&y2);

printf("Input Color Index[0,15]:");

scanf("%d",&color);

LineDDA(x1,y1,x2,y2,color);

outtextxy(x1,y1,"Start Point");

outtextxy(x2,y2,"End Point");

getch( );

closegraph( );

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 18:58
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

实验2 生成直线段的中点算法

一.算法思想

假定直线斜率k在0~1之间(k的其它取值可以类似处理),当前象素点为(xp,yp),则下一个象素点有两种可选择点P1xp+1,yp)或P2xp+1,yp+1)。若P1P2的中点(xp+1,yp+0.5)称为MQ为理想直线与x=xp+1垂线的交点。当MQ的下方时,则取P2应为下一个象素点;当MQ的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。

图1 中点画线法每步迭代涉及的象素和中点示意图

下面讨论中点画线法的实现。过点(x0,y0)、(x1, y1)的直线段L的方程式为F(x, y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0,欲判断中点MQ点的上方还是下方,只要把M代入Fxy),并判断它的符号即可。为此,我们构造判别式:

d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c

d<0时,ML(Q点)下方,取P2为下一个象素;

d>0时,ML(Q点)上方,取P1为下一个象素;

d=0时,选P1P2均可,约定取P1为下一个象素;

注意到dxp, yp的线性函数,可采用增量计算,提高运算效率。

若当前象素处于d³0情况,则取正右方象素P1(xp+1, yp),要判下一个象素位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量为a

d<0时,则取右上方象素P2(xp+1, yp+1)。要判断再下一象素,则要计算d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ,增量为ab。画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b F(x0, y0)=0,所以d0=a+0.5b

由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。因此,我们可以用2d代替d来摆脱小数,写出仅包含整数运算的算法程序。

二.C源程序

#include<graphics.h>

#include<stdio.h>

/**********生成直线段的中点算法**********/

void MidPointLine(int x1,int y1,int x2,int y2,int color)

{

float x,y,dx,dy;

float k,d;

float IncrE,IncrNE;

dx=x2-x1;

dy=y2-y1;

k=dy/dx;

if(k>=-1 && k<=1)

{

d=dx-2*dy;

IncrE=-2*dy;

IncrNE=2*(dx-dy);

x=x1;y=y1;

putpixel(x,y,color);

while(x<x2)

{

if(d>0)

d+=IncrE;

else

{

d+=IncrNE;

y++;

}

x++;

putpixel((int)x,(int)y,color);

}

}

else

{

d=dy-2*dx;

IncrE=-2*dx;

IncrNE=2*(dy-dx);

x=x1;y=y1;

putpixel(x,y,color);

while(y<y2)

{

if(d>0)

d+=IncrE;

else

{

d+=IncrNE;

x++;

}

y++;

putpixel((int)x,(int)y,color);

}

}

}

/**********主函数**********/

void main( )

{

int graphdriver=DETECT,graphmode;

int x1,y1,x2,y2,color;

initgraph(&graphdriver,&graphmode,"\\tc");

printf("*************************************************\n");

printf("* Middle-Point Algorithm for Lining *\n");

printf("* Creator:Zhang Zujin *\n");

printf("* *\n");

printf("* Input:Two Pixels and Color Index *\n");

printf("* Output: The Line Related to Input *\n");

printf("*************************************************\n\n");

printf("Please Input Two Pixels(x1,y1),(x2,y2):");

scanf("%d%d%d%d", &x1,&y1,&x2,&y2);

printf("Input Color Index[0,15]:");

scanf("%d",&color);

MidPointLine(x1,y1,x2,y2,color);

outtextxy(x1,y1,"Start Point");

outtextxy(x2,y2,"End Point");

getch( );

closegraph( );

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 18:59
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

实验3 生成圆弧的中点算法

1. 算法思想

如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:

d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2

d<0,则应取P1为下一象素,而且再下一象素的判别式为:

d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3

d≥0,则应取P2为下一象素,而且下一象素的判别式为

d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5

我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

d0=F(1,R-0.5)=1.25-R

图2 当前象素与下一象素的候选者

为了进一步提高算法的效率,将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。

2. C源程序

#include<stdio.h>

#include<graphics.h>

int Center_x,Center_y,radius,color;

/**********显示圆弧的八个对称点**********/

void CirclePoints(int Center_x,int Center_y,int x,int y,int color)

{

putpixel(x+Center_x,y+Center_y,color);

putpixel(x+Center_x,-y+Center_y,color);

putpixel(y+Center_x,x+Center_y,color);

putpixel(y+Center_x,-x+Center_y,color);

putpixel(-x+Center_x,-y+Center_y,color);

putpixel(-x+Center_x,y+Center_y,color);

putpixel(-y+Center_x,-x+Center_y,color);

putpixel(-y+Center_x,x+Center_y,color);

}

/**********消除的乘法的中点算法**********/

void MidPointCircle(int Center_x,int Center_y,int radius,int color)

{

int x,y;

int d;

int DeltaE,DeltaSE;

x=0;

y=radius;

d=5-4*radius;

DeltaE=12;

DeltaSE=20-8*radius;

putpixel(Center_x,Center_y,color);

CirclePoints(Center_x,Center_y,x,y,color);

while(y>x)

{

if(d<=0)

{

d+=DeltaE;

DeltaSE+=8;

}

else

{

d+=DeltaSE;

DeltaSE+=16;

y--;

}

DeltaE+=8;

x++;

CirclePoints(Center_x,Center_y,x,y,color);

}

}

/**********主函数**********/

void main( )

{

int graphdriver=DETECT,graphmode;

initgraph(&graphdriver,&graphmode,"\\tc");

printf("************************************************************\n");

printf("* Middle-Point Algorithm for Circling *\n");

printf("* Creator:Zhang Zujin *\n");

printf("* *\n");

printf("* Input: Center and Radius of Circle and Color Index *\n");

printf("* Output: The Circle Related to Input *\n");

printf("************************************************************\n\n");

printf("Please Input Center Coordinate(x,y):");

scanf("%d%d",&Center_x,&Center_y);

printf("Please Input Radius:");

scanf("%d",&radius);

printf("Input Color Index[0,15]:");

scanf("%d",&color);

MidPointCircle(Center_x,Center_y,radius,color);

getch( );

closegraph( );

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 18:59
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

实验4 生成椭圆弧的中点算法

1. 算法思想

不敢多写,注意到圆弧是椭圆弧的特殊情况,故而可以很好的利用实验3的知识。只不过要注意到椭圆弧是四对称的,并且在画第一象限时要注意分情况,具体实现方法见C源程序。

2. C源程序

#include<stdio.h>

#include<math.h>

#include<graphics.h>

long a,b;

long color;

long Center_x,Center_y;

/**********绘椭圆弧上对称的四个要素**********/

void EllipsePoints(long Center_x,long Center_y,long x,long y,long color)

{

putpixel(Center_x+x,Center_y+y,color);

putpixel(Center_x+x,Center_y-y,color);

putpixel(Center_x-x,Center_y+y,color);

putpixel(Center_x-x,Center_y-y,color);

}

/**********绘椭圆弧主要程序**********/

void MidPointEllipse(longCenter_x,longCenter_y,longa,longb,longcolor)

/* 椭圆中心在(Center_x,Center_y),长半轴为a,短半轴为b */

{

long x,y,d,P_x,P_y,Square_a,Square_b;

Square_a=a*a;

Square_b=b*b;

P_x=(int)(0.5+(float)Square_a/sqrt((float)(Square_a+Square_b)));

P_y=(int)(0.5+(float)Square_b/sqrt((float)(Square_a+Square_b)));

/* 生成第一象限内的上半部分椭圆弧 */

x=0;

y=b;

d=4*(Square_b-b*Square_a)+Square_a;

EllipsePoints(Center_x,Center_y,x,y,color);

while(x<=P_x)

{

if(d<=0)

d+=4*Square_b*(2*x+3);

else

{

d+=4*Square_b*(2*x+3)-8*Square_a*(y-1);

y--;

}

x++;

EllipsePoints(Center_x,Center_y,x,y,color);

}

/* 生成第一象限内的上半部分椭圆弧 */

x=a;

y=0;

d=4*(Square_a-a*Square_b)+Square_b;

EllipsePoints(Center_x,Center_y,x,y,color);

while(y<P_y)

{

if(d<=0)

d+=4*Square_a*(2*y+3);

else

{

d+=4*Square_a*(2*y+3)-8*Square_b*(x-1);

x--;

}

y++;

EllipsePoints(Center_x,Center_y,x,y,color);

}

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 19:00
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

/**********主函数**********/

void main( )

{

int graphdriver=DETECT,graphmode;

initgraph(&graphdriver,&graphmode,"\\tc");

printf("*************************************************\n");

printf("* Mid-PolongAlgorithm for Ellipse *\n");

printf("* Creator:Zhang Zujin *\n");

printf("* *\n");

printf("* Input:Center Coordinate , and Color Index *\n");

printf("* Output: The Ellipse Related to Input *\n");

printf("*************************************************\n\n");

while(1)

{

printf("\n");

printf("Please Input Center Coordinate(x,y):");

scanf("%d%d",&Center_x,&Center_y);

printf("Input half major axis(a),half major axis(b):");

scanf("%d%d",&a,&b);

printf("Inpute Color Index(0,15):");

scanf("%d",&color);

MidPointEllipse(Center_x,Center_y,a,b,color);

}

getch( );

closegraph( );

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 19:00
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 
[分享]计算机图形学论文
MMHeQJJZ.rar (33.32 KB) [经验]计算机图形学实验报告



太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-29 19:03
我爱这里
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-6-27
收藏
得分:0 
厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!厉害!
2006-06-27 01:07
云中雾
Rank: 1
等 级:新手上路
威 望:1
帖 子:168
专家分:3
注 册:2005-12-30
收藏
得分:0 

可惜我不是学数学的.....


白色的忧郁让我白色的思念从洁白到苍白,从苍白到空白,比空白更空白,变成深白的坦白!
2006-06-28 21:51
canon787
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-6-28
收藏
得分:0 
好长啊`~~~看得都眼花了

Learning by heart
2006-06-29 00:05
快速回复:[经验]计算机图形学实验报告
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028423 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved