实验目的
1、 通过实验,进一步理解和掌握DDA和中点Bresenham算法;
2、 掌握填充算法的基本原理;
实验环境
计算机、Turbo C或其他C语言程序设计环境
实验内容
1.用数值微分法(DDA法)或中点Bresenham算法绘制任意一条直线;(由键盘输入直线的两端点坐标)
2.任意画一个多边形,并用边(缘)填充算法进行填充。(多边形的顶点坐标存放在数组中,坐标值由键盘输入)
用中点(Bresenham)算法实现椭圆或圆的绘制。
首先给一个直线生成算法,其中DDA算法自己手动设置了端点坐标,中点Bresenham实现用户手动输入端点坐标。
#include <stdio.h>
#include <graphics.h>
void MidBresenhamLine(int x0,int y0,int x1,int y1,int color)
{
int dx,dy,d,UpIncre,DownIncre,x,y;
if(x0 > x1)
{
x = x1;
x1 = x0;
x0 = x;
y = y1;
y1 = y0;
y0 = y;
}
x = x0;
y = y0;
dx = x1 - x0;
dy = y1 - y0;
d = dx - 2 * dy;
UpIncre = 2 * dx - 2 * dy;
DownIncre = -2 * dy;
while(x <= x1)
{
putpixel(x,y,color);
x++;
if(d < 0)
{
y++;
d += UpIncre;
}
else
d += DownIncre;
}
}
void DDALine(int x0,int y0,int x1,int y1,int color)
{
int dx,dy,epsl,k;
float xIncre,yIncre,x,y;
dx = x1 - x0;
dy = y1 - y0;
x = x0;
y = y0;
if(abs(dx) > abs(dy))
epsl = abs(dx);
else
epsl = abs(dy);
xIncre = (float)dx / (float)(epsl);
yIncre = (float)dy / (float)(epsl);
for(k = 0; k < epsl; k++)
{
putpixel((int)(x + 0.5),(int)(y + 0.5),color);
x += xIncre;
y += yIncre;
}
}
int main()
{
int gdriver,gmode;
int q,w,e,r;
printf("q,w,e,r\n");
scanf("%d %d %d %d",&q,&w,&e,&r);
gdriver = DETECT;
initgraph(&gdriver,&gmode,"");
MidBresenhamLine(q,w,e,r,GREEN);
DDALine(10,20,120,200,RED);
getch();
closegraph();
}
接下来是一个填充算法
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int n;
void fill(int *p,unsigned int color)
{
int i,j,l,xmax=0;
for(i=0;i<2*n;i+=2)
{
if(p[i]>xmax)
xmax = p[i];
}
for(i=0;i<2*n;i+=2)
{
int x0 = p[i];
int y0 = p[i+1];
int x1 = p[i+2];
int y1 = p[i+3];
if(x0==x1)
{
for(;j<=l;j++)
{
int x = x0;
for(;x<=xmax;x++)
{
if(getpixel(x,j)==BLACK)
putpixel(x,j,color);
else if(getpixel(x,j)==color)
putpixel(x,j,BLACK);
}
}
continue;
}
double k = (double)(y0-y1)/(double)(x0-x1);
if(k==0) continue;
double b = (double)(y0-x0*k);
j = y0;
l = y1;
if(y1<y0)
{
j = y1;
l = y0;
}
for(;j<=l;j++)
{
int x =(int)((j-b)/k);
for(;x<=xmax;x++)
{
if(getpixel(x,j)==BLACK)
putpixel(x,j,color);
else if(getpixel(x,j)==color)
putpixel(x,j,BLACK);
}
}
}
}
int main()
{
scanf("%d",&n);
n = 3;
int *p;
p = new int[2*(n+1)];
for(int i = 0;i<2*n;i+=2)
{
scanf("%d%d",&p[i],&p[i+1]);//ÊäÈë¶à±ßÐζ¥µã
}
p[i] = p[0];
p[i+1] = p[1];
int gd,gm;
gd = DETECT;
initgraph(&gd,&gm,"");
setcolor(RED);
setbkcolor(BLUE);
drawpoly(n+1,p);
fill(p,RED);
getch();
closegraph();
return 0;
}
在我的另一篇文章中有更加酷炫的填充算法。
http://blog.csdn.net/fitz1318/article/details/53648081