计算机图形学实验报告
姓 名:
学 号:
班 级: 计算机班
实验点:
实验时间:
实验
1 实验目求
理解直线生成原理掌握典型直线生成算法掌握步处理分析实验数力
编程实现DDA算法Bresenham中点算法定起点终点直线分调DDA算法Bresenham中点算法进行批量绘制记录两种算法绘制时间利excel等数分析软件试验结果编制成表格绘制折线图较两种算法性
2 实验环境工具
开发环境:Visual C++ 60
实验台:Experiment_Frame_One(制台)
3 实验结果
31 程序流程图
开始
(1)DDA算法
计算kb
K<1
x
否
结束
xx+1yy+k
绘点
yy+1xx+1k
绘点
(2)Mid_Bresenham算法
开始
计算dxdy
dx>dy
Ddy2*dx
Ddx2*dy
否
y
结束
绘点
绘点
D<0
D<0
否
xx+1D D + 2*dy 2*dx
yy+1
D D 2*dx
yy+1
yy+1D D + 2*dx 2*dy
xx+1
D D 2*dy
xx+1
否
32 程序代码
算法实现
绘制素函数DrawPixel(x y)
(1) DDA算法
void CExperiment_Frame_OneViewDDA(int X0 int Y0 int X1 int Y1)
{
请实现DDA算法
float k b
float d
k float(Y1 Y0)float(X1 X0)
b float(X1*Y0 X0*Y1)float(X1 X0)
if(fabs(k)< 1)
{
if(X0 > X1)
{
int temp X0
X0 X1
X1 temp
}
int x
float y
x (int)X0
y (float)Y0
while(x < X1)
{
DrawPixel(x round(y))
x ++
y y + k
}
}
else
{
if(Y0 > Y1)
{
int temp Y0
Y0 Y1
Y1 temp
}
float x
int y
x (float)X0
y (int)Y0
while(y < Y1)
{
DrawPixel(round(x) y)
y ++
x x + 1k
}
}
return
}
(2) Mid_Bresenham算法
void CExperiment_Frame_OneViewMid_Bresenham(int X0 int Y0 int X1 int Y1)
{
请实现Mid_Bresenham算法
int D
int dx dy
int x y
dx X1 X0
dy Y1 Y0
x X0
y Y0
if(dx > dy)
{
D dx 2*dy
while(x < X1)
{
DrawPixel(x y)
if(D < 0)
{
y y +1
D D + 2*dx 2*dy
}
else
{
D D 2*dy
}
x++
}
}
else
{
D dy 2*dx
while(y < Y1)
{
DrawPixel(x y)
if(D < 0)
{
x x +1
D D + 2*dy 2*dx
}
else
{
D D 2*dx
}
y++
}
}
return
}
33 运行结果
(1)DDA算法
(2)Mid_Bresenham算法
34 运行结果分析
DDA算法直观实现简单涉浮点数运算利硬件实现Mid_Bresenham算法DDA算法简单两种算法实现生成直线会
4 实验心
通实验学掌握两种直线扫描转换算法方法优点实现结果需通较确定种方法更优更符合正确结果
实验二
1 实验目求
理解边形扫描转换原理掌握典型边形扫描转换算法掌握步处理分析实验数力
编程实现基X扫描线转换算法(必做)
2 实验环境工具
开发环境:Visual C++ 60
实验台:Polygon_Conversion(制台)
3 实验结果
31 程序流程图
X扫描线转换算法
开始
计算xmaxymax
绘点
扫描线线段否交点
x排序
根公式求交点记录
交点否线段第顶点
判断类型顶点记录交点
否
32 程序代码
*********************************************************************
功:X扫描线转换算法
参数说明:
vertices[][2]顶点列表
VertexNum 顶点数目
备注:
DrawPixel(int x int y) 绘制素点(x y)
**********************************************************************
void CPolygon_ConversionViewX_Scan_Line_Conersion(int Vertices[][2] int VertexNum)
{
int ymax ymincount
float k
ymaxVertices[0][1]
yminVertices[0][1]
for(int p 0 p < VertexNum p++){ 求y高点低点
if(Vertices[p][1] > ymax) ymaxVertices[p][1]
if(Vertices[p][1] < ymin) yminVertices[p][1]
}
int Xn[100] i ymax2 ymin2 temp
for( i ymin i < ymax i++){ 求交点
count0
for( int j 0 j < VertexNum j++)
{
if(j (VertexNum1) ){ 点第点线段
if(Vertices[j][1] > Vertices[0][1]){ 线段y值值
ymax2Vertices[j][1]
ymin2Vertices[0][1]
}
else{
ymax2Vertices[0][1]
ymin2Vertices[j][1]
}
if((i
k (float) ( (float)(Vertices[j][0]Vertices[0][0]) (float)(Vertices[j][1]Vertices[0][1]) )
Xn[count](int) ( (k * (float)i k *(float) Vertices[0][1] + (float)Vertices[0][0]) + 05)
count++
}
else if( i Vertices[j][1] ){ 扫描线线段顶点算前顶点
if( (Vertices[j1][1] > i) && (Vertices[0][1] > i)){
Xn[count]Vertices[j][0]
count++
Xn[count]Vertices[j][0]
count++
}
else if( ((Vertices[j1][1] < i) && (Vertices[0][1] > i)) || ((Vertices[j1][1] > i) && (Vertices[0][1] < i)) ) {
Xn[count]Vertices[j][0]
count++
}
}
}
else{ 线段交点
if(Vertices[j][1] > Vertices[j+1][1]){
ymax2Vertices[j][1]
ymin2Vertices[j+1][1]
}
else{
ymax2Vertices[j+1][1]
ymin2Vertices[j][1]
}
if((i
k (float) ( (float) (Vertices[j][0]Vertices[j+1][0]) (float) (Vertices[j][1]Vertices[j+1][1]) )
Xn[count](int) ( (k *(float) i k * (float)Vertices[j+1][1] + Vertices[j+1][0]) + 05)
count++
}
else if( i Vertices[j][1] ){ 扫描线线段顶点算前顶点
if(j 0){ 交点第点
if( (Vertices[j1][1] > i) && (Vertices[j+1][1] > i)){
Xn[count]Vertices[j][0]
count++
Xn[count]Vertices[j][0]
count++
}
else if( ((Vertices[j1][1] < i) && (Vertices[j+1][1] > i)) || ((Vertices[j1][1] > i) && (Vertices[j+1][1] < i)) ){
Xn[count]Vertices[j][0]
count++
}
else{}
}
else { 交点第点
if( (Vertices[VertexNum1][1] > i) && (Vertices[j+1][1] > i)){
Xn[count]Vertices[j][0]
count++
Xn[count]Vertices[j][0]
count++
}
else if( ((Vertices[VertexNum1][1] < i) && (Vertices[j+1][1] > i)) || ((Vertices[VertexNum1][1] > i) && (Vertices[j+1][1] < i)) ) {
Xn[count]Vertices[j][0]
count++
}
}
}
}
}
for( int m 0 m < count1 m++ ){ 交点x坐标排序
for( int n m+1 n < count n++ ){
if( Xn[m] > Xn[n] ){
tempXn[m]
Xn[m]Xn[n]
Xn[n]temp
}
}
}
for( int a 0 a < count a+2 ){ 绘制素点
for( int b Xn[a] b < Xn[a+1] b++){
DrawPixel(b i)
}
}
}
return
}
33 运行结果
34 运行结果分析
运行结果实现意边形区域填充
4 实验心
通实验学掌握X扫描线转换算法实现区域填充编写算法程中断改进算法学帮助解决困难改进效边表算法没编写实现程序断改进中断优化中学许知识
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档