• 图形填充之栅栏填充算法


    编译器:VS2013

    该算法相对边缘填充算法莱说,效率较高来说,选取一个顶点的横坐标为栅栏,将直线和栅栏之间进行填充,如果颜色为背景色,则填充填充色,否则则填充背景色

    代码:

     1 // 栅栏填充算法.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<stdio.h>
     6 #include"graphics.h"
     7 #include<stdlib.h>
     8 
     9 //函数声明
    10 void fencefill(int a[], int x,int n);//栅栏填充算法实现
    11 void putcolor(int Xmin, int Xmax, int k);//着色函数
    12 
    13 int main()
    14 {
    15     int gdriver = DETECT, gmove, x,y,n;
    16 
    17     printf("please input the number of point
    ");
    18     scanf_s("%d", &n);
    19     int *a=(int *)malloc((n+2)*sizeof(int));//动态分配内存
    20 
    21     for (y = 0; y < n + 2; y++)
    22         scanf_s("%d", &a[y]);
    23 
    24     x = a[n];//选取a[n]为栅栏
    25 
    26     initgraph(&gdriver, &gmove, "");
    27 
    28     setcolor(YELLOW);
    29     drawpoly(n/2+1, a);//画出多边形
    30     fencefill(a, x,n);//栅栏填充算法实现
    31     drawpoly(n/2+1, a);//再处理一次边界
    32 
    33     //因栅栏被处理两次,所以再次填充栅栏一列
    34     for (y = a[n+1]+1; getpixel(x, y) != YELLOW; y++)
    35         putpixel(x, y, YELLOW);
    36 
    37     system("pause");
    38 
    39     closegraph();
    40 
    41     return 0;
    42 }
    43 
    44 //栅栏填充算法实现
    45 void fencefill(int a[], int x,int n)
    46 {
    47     int i, y, Xmin, Xmax, Ymax, Ymin,xi;
    48 
    49     //循环数组a
    50     for (i = 0; i < n; i = i + 2)
    51     {
    52         //判断纵坐标大小
    53         Ymax = (a[i + 1] > a[i + 3]) ? a[i + 1] : a[i + 3];
    54         Ymin = (a[i + 1] <= a[i + 3]) ? a[i + 1] : a[i + 3];
    55 
    56         //行处理
    57         for (y = Ymin; y < Ymax; y++)
    58         {
    59             //利用直线关系求得y=k时x对应的坐标
    60             xi = (y - a[i + 1])*(a[i + 2] - a[i]) / (a[i + 3] - a[i + 1]) + a[i];
    61 
    62             //求x与栅栏大小关系
    63             Xmax = (xi > x) ? xi : x;
    64             Xmin = (xi <= x) ? xi : x;
    65             
    66             putcolor(Xmin, Xmax, y);//着色函数
    67         }
    68     }
    69 
    70 }
    71 
    72 //着色函数
    73 void putcolor(int Xmin, int Xmax, int y)
    74 {
    75     while (Xmin <= Xmax)
    76     {
    77         if (getpixel(Xmin, y) == YELLOW)
    78             putpixel(Xmin, y, BLACK);
    79         else
    80             putpixel(Xmin, y, YELLOW);
    81 
    82         Xmin++;
    83     }
    84 }

    结果:

  • 相关阅读:
    C#基于接口的编程
    在window组件服务中建立WCF宿主
    给WWF传递参数
    创建singleton模式的工作流引擎
    WCF消息交换模式之Duplex
    SqlServer中查询出多条记录变成一个记录(行变列)
    WCF三种消息交互模式MEP
    Asp.net实现在线截图!
    WWF之跟踪服务WorkFlowTrack
    hdu 2604 Queuing (Matrix)
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/6896741.html
Copyright © 2020-2023  润新知