Graphics—边缘填充算法

/*
多边形的区域填充:边缘填充算法

边缘填充算法的基本思想是,逐边向右求补。可以按任意顺序处理多边形的每条边,在处理每条边时,首先求出该边与扫描线的交点

,然后将每一条扫描线上交点右方的所有像素取补,多边形的所有边处理完毕之后,填充即完成
*/
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
#define N 100000
#define Min -99999999
int n;         //点的个数
int right;     //图像的右边界

struct point   //点的坐标
{
    int x;
    int y;
}point[N];

void init()  //初始化,点的坐标
{
    int i;
    printf("请输入点的个数: ");
    scanf("%d",&n);
    right=Min;
    for(i=0;i<n;i++)
    {
        scanf("%d %d",&point[i].x,&point[i].y);
        if(point[i].x>right)  //得到右边界
			right=point[i].x;
    }
    point[n].x=point[0].x;    //首尾相连,构成封闭图形
    point[n].y=point[0].y;
}

void display()          //绘制该多边形的轮廓
{
    int i;
    setbkcolor(WHITE);  
    cleardevice();
    setcolor(RED);
    
    for(i=0;i<n;i++)    //画边界线
        line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);
}
void fill()            //边缘填充算法
{
    int x0,y0,x1,y1,i;
    int dx,dy,eps1,k;
    int p,q;
    int flag;
    int temp;
    float x,y,xIncre,yIncre;
    for(i=0;i<n;i++)
    {
        //如果线段是水平线或者是右边边界,只画线,不做处理
        if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x))
            line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);
        else
		{
            //初始化各个参数
            x=point[i+1].x;
            y=point[i+1].y;
            dx=point[i].x-point[i+1].x;
            dy=point[i].y-point[i+1].y;

            //扫描线的范围
            eps1=abs(dy);

            xIncre=(float)dx/(float)eps1;
            yIncre=(float)dy/(float)eps1;
            //找线段上的点
            for(k=0;k<=eps1;k++)
            {
				p=(int)(x+0.5);
				q=(int)(y+0.5);
                //扫描线上取补
				for(int j=p;j<=right;j++)
			    {
                  //如果当前点为白色,就填充红色
					if(getpixel(j,q)==WHITE)
						putpixel(j,q,RED);
                  //否则就填充白色
					else
						putpixel(j,q,WHITE);
				}
				x+=xIncre;
				y+=yIncre;
			}
        }
    }
}
int main()
{

    init();
    initgraph(800,700);
    display();
    fill();
    getch();
    closegraph();
    return 0;
}
/*
100 100
700 100
700 500
600 400
400 600
300 200
200 300
*/

运行结果:

//边缘填充算法
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
#define N 100000
#define Min -99999999

int right;     //图像的右边界

struct point   //点的坐标
{
    int x;
    int y;
}point[N];

void init()   //初始化
{
    int i;
    right=Min;
	point[0].x=100;
	point[0].y=100;
	point[1].x=700;
	point[1].y=100;
	point[2].x=700;
	point[2].y=500;
	point[3].x=600;
	point[3].y=400;
	point[4].x=400;
	point[4].y=600;
	point[5].x=300;
	point[5].y=200;
	point[6].x=200;
	point[6].y=300;
    for(i=0;i<7;i++)
    {
        if(point[i].x>right)  //得到右边界
			right=point[i].x;
    }
    point[7].x=point[0].x;    //首尾相连,构成封闭图形
    point[7].y=point[0].y;
}

void display()          //绘制该多边形的轮廓
{
    int i;
    setbkcolor(WHITE);  
    cleardevice();
    setcolor(RED);
    
    for(i=0;i<7;i++)   
        line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);
}
void fill()            //边缘填充算法
{
    int x0,y0,x1,y1,i;
    int dx,dy,eps1,k;
    int p,q;
    int flag;
    int temp;
    float x,y,xIncre,yIncre;

    for(i=0;i<7;i++)
    {
        if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x))
            line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);
        else
		{
            x=point[i+1].x;
            y=point[i+1].y;
            dx=point[i].x-point[i+1].x;
            dy=point[i].y-point[i+1].y;
            eps1=abs(dy);

            xIncre=(float)dx/(float)eps1;
            yIncre=(float)dy/(float)eps1;
            for(k=0;k<=eps1;k++)
            {
				p=(int)(x+0.5);
				q=(int)(y+0.5);
                
				for(int j=p;j<=right;j++)
			    {
					if(getpixel(j,q)==WHITE)
						putpixel(j,q,RED);
					else
						putpixel(j,q,WHITE);
				}
				x+=xIncre;
				y+=yIncre;
			}
        }

    }
}
int main()
{
    init();
    initgraph(750,650);
    display();
    fill();
    getch();
    closegraph();
    return 0;
}


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中点边缘填充算法是一种用于填充封闭区域的算法,下面是使用中点边缘填充算法画六边形的步骤: 1. 首先确定六边形的中心点坐标和半径 2. 以六边形中心点为圆心,半径为六边形的边长,画一个正六边形的外接圆 3. 初始化扫描线的起点,扫描线从六边形外接圆的顶点开始扫描 4. 每次将扫描线向下移动一行,并从左右两端开始向内填充颜色,直到遇到边缘 5. 判断填充的像素点是否在六边形内部,如果是,则继续填充,否则停止填充 6. 重复步骤4和5,直到扫描线扫描完整个六边形 以下是使用Python代码实现中点边缘填充算法画六边形的示例: ```python import matplotlib.pyplot as plt def draw_hexagon(center, radius, color): x0, y0 = center x, y = radius, 0 p = 3 - 2 * radius points = [] while x >= y: points.append((x + x0, y + y0)) points.append((-x + x0, y + y0)) points.append((x + x0, -y + y0)) points.append((-x + x0, -y + y0)) points.append((y + x0, x + y0)) points.append((-y + x0, x + y0)) points.append((y + x0, -x + y0)) points.append((-y + x0, -x + y0)) y += 1 if p > 0: x -= 1 p += 4 * (y - x) + 10 else: p += 4 * y + 6 for y in range(y0 - radius, y0 + radius+1): intersections = [] for x in range(x0 - radius, x0 + radius+1): if (x,y) in points and x != x0 - radius: if len(intersections) == 1: plt.plot(list(range(intersections[0]+1, intersections[1])), [y]* (intersections[1]-intersections[0]-1), color=color) intersections = [] else: intersections.append(x) elif len(intersections) == 1 and (x == x0 + radius or x == x0 - radius): plt.plot(list(range(intersections[0]+1, x)), [y]* (x - intersections[0]-1), color=color) intersections = [] ``` 使用示例: ```python draw_hexagon((0,0), 5, 'red') plt.axis('equal') plt.show() ``` 效果如下: ![六边形](https://img-blog.csdnimg.cn/20211008144153713.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值