Когда я пытаюсь отобразить пи в цветах с помощью ChunkyPNG, я получаю много неожиданных результатов
Я пытаюсь вычислить пи и положить его в изображение в рубине. Он работает до строк 36 (где он не записывает pi [без десятичного разряда] в файл) и 63 (где он записывает только не совсем белый цвет в pi.png). Как примечание, программа, кажется, не делает правильное количество цифр числа пи ($looptimes
)
Вот мой рубиновый файл:
pi.rb
#get width and height of picture
p 'width of pi'
$w = gets.chomp.to_i
p 'height of pi'
$h = gets.chomp.to_i
$looptimes = $w*$h
#calculate pi
def pi
q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
dot = nil
$looptimes.times do
if 4*q+r-t < n*t
yield n
nr = 10*(r-n*t)
n = ((10*(3*q+r)) / t) - 10*n
q *= 10
r = nr
else
nr = (2*q+r) * l
nn = (q*(7*k+2)+r*l) / (t*l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
end
end
end
#create and write to file
File.new("pi.txt", 'w')
File.open("pi.txt", 'w') { |pitxt|
pitxt.write(pi {|digit| print digit; $stdout.flush})}
def read_file(file_name)
file = File.open(file_name, "r")
data = file.read
file.close
return data
end
pinumber = read_file("./pi.txt")
pinumber.to_s
require 'chunky_png'
#make picture
image = ChunkyPNG::Image.new($w,$h)
image.save('pi.png')
image = ChunkyPNG::Image.from_file('pi.png')
#draw pixels
for $pointw in 0...$w do
for $pointh in 0...$h do
for j in 0...$looptimes do
if pinumber[j] = '0'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(244,244,244)
image.save('pi.png')
elsif pinumber[j] = '1'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(231,47,39)
image.save('pi.png')
elsif pinumber[j] = '2'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(241,176,102)
image.save('pi.png')
elsif pinumber[j] = '3'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(255,228,15)
image.save('pi.png')
elsif pinumber[j] = '4'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(18,154,47)
image.save('pi.png')
elsif pinumber[j] = '5'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(126,188,209)
image.save('pi.png')
elsif pinumber[j] = '6'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(3,86,155)
image.save('pi.png')
elsif pinumber[j] = '7'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(46,20,141)
image.save('pi.png')
elsif pinumber[j] = '8'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(152,152,152)
image.save('pi.png')
elsif pinumber[j] = '9'
image[$pointw,$pointh] = ChunkyPNG::Color.rgb(10,10,10)
image.save('pi.png')
end
end
end
end
Пожалуйста, дайте мне знать, если у вас есть идеи.
Кроме того, есть ли более эффективные способы сделать это? Спасибо за вашу помощь!
1 ответ
write
Команда, как вы ее использовали, напишет возвращаемое значение pi
в файл. Возвращаемое значение из pi
это не строка цифр, а последнее значение, вычисленное внутри подпрограммы (которое всегда является последним назначением r
)
Самое близкое исправление (т. Е. Наименьшее количество, которое вам нужно изменить, чтобы заставить его работать) - вывести полученные значения в файл, который вы уже делаете с печатью в stdout:
File.open("pi.txt", 'w') do |pitxt|
pi do |digit|
print digit
$stdout.flush
pitxt.write digit
end
end
Это должно по крайней мере получить вам необходимые цифры в текстовом файле.
У вас есть еще несколько ошибок в вашем сценарии. Я предлагаю вам действовать медленнее (на самом деле я рекомендую вам удалить код для записи изображений, как есть, и сделать еще один шаг!) Не стесняйтесь задавать больше вопросов о SO по мере вашего прогресса. Для вашего следующего вопроса, вместо того, чтобы представлять весь сценарий и спрашивать "что с этим не так", попробуйте написать простой изолированный пример, который демонстрирует, что вы пытаетесь сделать, и содержит одну вещь, которую вы не можете заставить работать. Например, теперь у вас уже есть правильные цифры числа pi, вам не нужно спрашивать об этом коде - часть для записи изображений должна справиться с любой строкой цифр. Вы можете даже обнаружить, что объединение примеров позволяет вам ответить на ваш собственный вопрос.