class TrianglePattern::Pattern
Public Class Methods
new(width, height, cell_size, variance, seed, colors, svg = TrianglePattern::SvgImage.new)
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 3 def initialize(width, height, cell_size, variance, seed, colors, svg = TrianglePattern::SvgImage.new) @svg = svg @width = width @height = height @points = TrianglePattern::Grid.new(@width, @height, cell_size, variance, seed).generate_grid d = Delaunator::Triangulator.new(@points.flatten) d.triangulate @delauny_indicies = d.triangles @colors = colors @triangles = generate_triangles end
Public Instance Methods
to_base64()
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 19 def to_base64 Base64.strict_encode64(to_svg) end
to_svg()
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 15 def to_svg image.to_s end
Private Instance Methods
_map(num, in_range, out_range)
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 85 def _map(num, in_range, out_range) (num - in_range[0] ) * ( out_range[1] - out_range[0] ) / ( in_range[1] - in_range[0] ).to_f + out_range[0] end
build_color_gradient()
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 54 def build_color_gradient gradient_palette = [] @colors.each_with_index do |color, index| step = if index == 0 index elsif index == @colors.length - 1 1 else (index / @colors.length.to_f).round(2) end gradient_palette << Gradient::Point.new(step, Color::RGB.from_html(color), 1.0) end map = Gradient::Map.new(gradient_palette) return map end
centroid(d)
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 70 def centroid(d) return { x: (d[0][0] + d[1][0] + d[2][0])/3.to_f, y: (d[0][1] + d[1][1] + d[2][1])/3.to_f } end
clamp(num, interval)
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 89 def clamp (num, interval) [[num, interval[0]].max, interval[1]].min end
generate_triangles()
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 25 def generate_triangles triangles = [] triangle_count = @delauny_indicies.length / 3 gradient_map = build_color_gradient color_index = 0 (0..@delauny_indicies.length-1).step(3) do |i| vertices = [@points[@delauny_indicies[i]], @points[@delauny_indicies[i + 1]], @points[@delauny_indicies[i + 2]]] centroid = centroid(vertices) x_col = gradient_map.at(norm('x', centroid[:x])) y_col = gradient_map.at(norm('y', centroid[:y])) t_col = Gradient::Map.new(Gradient::Point.new(0, x_col.color, 1.0), Gradient::Point.new(1, y_col.color, 1.0)) color_point = t_col.at(0.5) triangle_color = color_point.color.html triangles << [triangle_color, vertices] color_index += 1 end triangles end
image()
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 44 def image @svg.height = @height @svg.width = @width @triangles.each do |triangle| polygon = triangle[1].flatten.insert(0, "M").insert(3, "L").insert(6, "L").insert(-1, "Z").join(' ') @svg.path(polygon, { stroke: triangle[0], fill: triangle[0] }) end @svg end
norm(axis, value)
click to toggle source
# File lib/triangle_pattern/pattern.rb, line 77 def norm(axis, value) dimension = axis == 'x' ? @width : @height return clamp( _map(value, [0, dimension], [0, 1]), [0, 1] ) end