View Source Vivid.SLPFA (vivid v0.4.4)

Scanline Polygon Filling Algorithm, as per https://hackernoon.com/computer-graphics-scan-line-polygon-fill-algorithm-3cb47283df6#.20fac9f40

This algorithm only fills the inside of a polygon, leaving you free to to compose it with the original polygon if you want to use different border and fill colours, for example.

Summary

Functions

Fills the inside area of a polygon using the Scanline Polygon Filling Algorithm.

Functions

@spec fill(Vivid.Polygon.t()) :: MapSet.t()

Fills the inside area of a polygon using the Scanline Polygon Filling Algorithm.

Examples

The original polygon.

iex> use Vivid
...> frame = Frame.init(16, 16, RGBA.black)
...> polygon = Polygon.init([Point.init(1, 1), Point.init(4, 1), Point.init(4, 7), Point.init(11, 7), Point.init(11, 1), Point.init(14, 1), Point.init(14, 14), Point.init(1, 14)])
...> Frame.push(frame, polygon, RGBA.white)
...>   |> to_string
"                \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @            @ \n" <>
" @            @ \n" <>
" @            @ \n" <>
" @            @ \n" <>
" @            @ \n" <>
" @            @ \n" <>
" @  @@@@@@@@  @ \n" <>
" @  @      @  @ \n" <>
" @  @      @  @ \n" <>
" @  @      @  @ \n" <>
" @  @      @  @ \n" <>
" @  @      @  @ \n" <>
" @@@@      @@@@ \n" <>
"                \n"

The filled area of the polygon

iex> use Vivid
...> frame = Frame.init(16, 16, RGBA.black)
...> polygon = Polygon.init([Point.init(1, 1), Point.init(4, 1), Point.init(4, 7), Point.init(11, 7), Point.init(11, 1), Point.init(14, 1), Point.init(14, 14), Point.init(1, 14)]) |> Vivid.SLPFA.fill |> Group.init
...> Frame.push(frame, polygon, RGBA.white)
...>   |> to_string
"                \n" <>
"                \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@@@@@@@@@@@  \n" <>
"  @@        @@  \n" <>
"  @@        @@  \n" <>
"  @@        @@  \n" <>
"  @@        @@  \n" <>
"  @@        @@  \n" <>
"  @@        @@  \n" <>
"                \n"

The polygon and the fill combined.

iex> use Vivid
...> frame = Frame.init(16, 16, RGBA.black)
...> polygon = Polygon.init([Point.init(1, 1), Point.init(4, 1), Point.init(4, 7), Point.init(11, 7), Point.init(11, 1), Point.init(14, 1), Point.init(14, 14), Point.init(1, 14)])
...> inside = polygon |> Vivid.SLPFA.fill |> Group.init
...> Frame.push(frame, polygon, RGBA.white)
...>   |> Frame.push(inside, RGBA.white)
...>   |> to_string
"                \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@@@@@@@@@@@ \n" <>
" @@@@      @@@@ \n" <>
" @@@@      @@@@ \n" <>
" @@@@      @@@@ \n" <>
" @@@@      @@@@ \n" <>
" @@@@      @@@@ \n" <>
" @@@@      @@@@ \n" <>
"                \n"