Я пытаюсь создать фон для симуляции трассировки лучей.В настоящий момент я настроил его так, что, когда луч попадает на объект, он возвращает яркость.Камера посылает лучи на каждый пиксель сцены.Функция get_luminance имеет параметр, соответствующий позиции на экране, в которую она попала.
Например, у меня уже есть объект, который меняет цвета в зависимости от того, в каком квадранте он находится. Поэтому, если позиция имеет оба положительных или обоих отрицательных значения, она будет окрашена в ярко-красный цвет, например (1,1) или(-1, -1).Если позиция имеет только одну из них, она будет окрашена в более темный красный цвет, например (-1, 1) или (1, -1).Вот логика для этого:
relative_direction = in_position - self.origin
if sum(1 if i > 0 else 0 for i in relative_direction) % 2 == 0:
return Spectrum(0, 255, 0)
return Spectrum(0, 128, 0)
Теперь я хочу применить аналогичную логику для определения типа шахматной доски для фона.Я не совсем уверен, как это сделать.Я бы предположил, что там будет какая-то модульная арифметика, где каждый, скажем, 8 пикселей будет менять цвета, но кроме того, я не совсем уверен, как действовать.
Вот грубое изображениеиз того, что я хочу сделать, с цветами, чередующимися каждые 2 пикселя: https://i.stack.imgur.com/7EMfZ.png
РЕДАКТИРОВАТЬ: я пытался что-то вроде этого:
relative_direction = out_position - self.origin
print(relative_direction)
if round(relative_direction[0]/10000) + round(relative_direction[1]/10000) % 2 == 0:
return Spectrum(0, 255, 0)
return Spectrum(255, 255, 0)
Логика здесь заключается в том, что индексы вкаждая координата должна складываться как четная или нечетная.Дополнения, которые складываются, чтобы быть даже, будут окрашены в зеленый, иначе желтый.(если вам интересно, почему я делю на 10000, то это потому, что координаты имеют величину до 50000 единиц). Однако, это просто создает это изображение:
https://i.stack.imgur.com/3mpM5.png
Есть некоторая ошибка, потому что я отказался от дельта-т для моей трассировки лучей, которая объясняет, почему они не являются идеальными квадратами, но в любом случае, я не понимаю, почему паттерн не распространяется за середину ... Очень странно.
РЕДАКТИРОВАТЬ: Оказывается, все, что мне нужно было сделать, это напечатать все выражение в операторе if.Фигуры.