Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Created July 29, 2015 16:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoshCheek/8e4f47e0d0bfc1cf7637 to your computer and use it in GitHub Desktop.
Save JoshCheek/8e4f47e0d0bfc1cf7637 to your computer and use it in GitHub Desktop.
Estimate pi from an image of a circle
# solution for http://www.reddit.com/r/dailyprogrammer/comments/3f0hzk/20150729_challenge_225_intermediate_estimating_pi/
require 'set'
require 'chunky_png'
# load the image from the data segment
raw_png = DATA.read.delete("\n").unpack('m0').first
image = ChunkyPNG::Image.from_blob(raw_png)
# extract the colours
colours = image.pixels.uniq
raise "Expected 2 colours, got #{colours.inspect}" unless colours.length == 2
black, white = colours.sort
# for each black pixel, record it's x value
xs = image.height.times.flat_map do |y|
image.width.times.select { |x| image[x, y] == black }
end
# calculate pi
area = xs.length
diameter = xs.max - xs.min
radius = diameter / 2.0
pi = area / (radius**2) # a = πr², solved for π
puts pi
# >> 3.148117086055024
__END__
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment