module ChunkyPNG::Canvas::Drawing

def polygon(path, stroke_color = ChunkyPNG::Color::BLACK, fill_color = ChunkyPNG::Color::TRANSPARENT)

Returns:
  • (ChunkyPNG::Canvas) - Itself, with the polygon drawn.

Parameters:
  • fill_color (Integer) -- The fill color to use for this polygon.
  • stroke_color (Integer) -- The stroke color to use for this polygon.
  • The (Array, String) -- control point vector. Accepts everything {ChunkyPNG.Vector} accepts.
def polygon(path, stroke_color = ChunkyPNG::Color::BLACK, fill_color = ChunkyPNG::Color::TRANSPARENT)
  
  vector = ChunkyPNG::Vector(*path)
  raise ArgumentError, "A polygon requires at least 3 points" if path.length < 3
  stroke_color = ChunkyPNG::Color.parse(stroke_color)
  fill_color   = ChunkyPNG::Color.parse(fill_color)
  # Fill
  unless fill_color == ChunkyPNG::Color::TRANSPARENT
    vector.y_range.each do |y|
      intersections = []
      vector.edges.each do |p1, p2|
        if (p1.y < y && p2.y >= y) || (p2.y < y && p1.y >= y)
          intersections << (p1.x + (y - p1.y).to_f / (p2.y - p1.y) * (p2.x - p1.x)).round
        end
      end
      intersections.sort!
      0.step(intersections.length - 1, 2) do |i|
        intersections[i].upto(intersections[i + 1]) do |x|
          compose_pixel(x, y, fill_color)
        end
      end
    end
  end
  
  # Stroke
  vector.each_edge do |(from_x, from_y), (to_x, to_y)|
    line(from_x, from_y, to_x, to_y, stroke_color, false)
  end
  return self
end