zoukankan      html  css  js  c++  java
  • 边缘填充算法

    #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 DDA(int x0,int y0,int x1,int y1)//用于绘制直线
    {
        int dx,dy,eps1,k;
        float x,y,xIncre,yIncre;
        int p,q;
        dx=x1-x0;
        dy=y1-y0;
        x=x0;
        y=y0;
        if(abs(dx)>abs(dy))
        eps1=abs(dx);
        else
        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);
            if(getpixel(p,q)==BLUE)  //背景色为蓝色,填充色为红色
            putpixel(p,q,RED);
            else
            putpixel(p,q,BLUE);
            x+=xIncre;
            y+=yIncre;
        }
    }
    void sol1()//绘制该多边形的外轮廓
    {
        int i;
        int x0,y0,x1,y1;
        setbkcolor(BLUE);
        cleardevice();
        setcolor(RED);
        for(i=0;i<n;i++)
        {
            x0=point[i].x;
            y0=point[i].y;
            x1=point[i+1].x;
            y1=point[i+1].y;
            line(x0,y0,x1,y1);
        }
    }
    void sol2()//边缘填充算法
    {
        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++)
        {
            x0=point[i].x;
            y0=point[i].y;
            x1=point[i+1].x;
            y1=point[i+1].y;
            if(y0>y1) //保证(x0,y0)在(x1,y1)的下面
            {
                temp=y0;
                y0=y1;
                y1=temp;
                temp=x0;
                x0=x1;
                x1=temp;
            }
            dx=x1-x0;
            dy=y1-y0;
            x=x0;
            y=y0;
            //注意这里和DDA算法不同,yIncre=1
            //if(abs(dx)>abs(dy))
            //eps1=abs(dx);
            //else
            eps1=abs(dy);
            xIncre=(float)dx/(float)eps1;
            yIncre=(float)dy/(float)eps1;
            flag=1;
            for(k=0;k<=eps1;k++)
            {
                p=(int)(x+0.5);
                q=(int)(y+0.5);
                //每条直线的上端点不处理,避免交点处处理两次,没达到填充的效果
                if(k!=0)
                DDA(p,q,right,q);
                x+=xIncre;
                y+=yIncre;
            }
        }
    }
    int main()
    {

        init();
        initgraph(500,500);
        sol1();
        sol2();
        getch();
        closegraph();
        return 0;
    }

    修改版

    #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 sol1()//绘制该多边形的外轮廓
    {
        int i;
        setbkcolor(BLUE);  
        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 sol2()//边缘填充算法
    {
        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)==BLUE)
                        putpixel(j,q,RED);
                      //否则就填充蓝色
                      else
                          putpixel(j,q,BLUE);
                  }
                  x+=xIncre;
                  y+=yIncre;
               }
            }
        }
    }
    int main()
    {

        init();
        initgraph(1400,800);
        sol1();
        sol2();
        getch();
        closegraph();
        return 0;
    }
    /*
    10 10
    700 10
    700 500
    600 400
    400 600
    300 200
    200 300
    */

  • 相关阅读:
    介绍一款jquery ui组件gijgo(含tree树状结构、grid表格),特点:简易、文档全清晰易懂、示例代码
    【未完待续】API接口
    表单中Readonly和Disabled的区别:readonly在get和post可传值到后端,disabled不可
    Newtonsoft.Json 转换DateTime类型为字符串时,串内部会有一个T。解决方案
    一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值
    js return falsee.preventDefault() 以及session
    bootstrape学习
    Redis的PHP操作手册
    PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
    大型网站架构演化
  • 原文地址:https://www.cnblogs.com/u013533289/p/4995541.html
Copyright © 2011-2022 走看看