Когда я пытаюсь отобразить пи в цветах с помощью 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, вам не нужно спрашивать об этом коде - часть для записи изображений должна справиться с любой строкой цифр. Вы можете даже обнаружить, что объединение примеров позволяет вам ответить на ваш собственный вопрос.

Другие вопросы по тегам