计算机图形学-基本图素的生成算法和图形填充

实验目的

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


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值