zoukankan      html  css  js  c++  java
  • 图形填充之栅栏填充算法

    编译器: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 }

    结果:

  • 相关阅读:
    HOT Scene!
    Windows Live Beta ONLINE!
    Shanda EZ Mini
    HDR Lighting & Bloom Lighting
    将整张网页存成png图片
    What's NEW in C++/CLI Language
    [快讯] Visual Studio 2005和SQL Server 2005来了!
    [原创] 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
    使用模版列来控制在一个GridView中某些列有热连接,某些列无热连接
    七种武器——.NET工程师求职面试必杀技
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/6896741.html
Copyright © 2011-2022 走看看