Answer
t.me/python_tesstОтвет:
progress: 1/200
progress: 2/200
progress: 3/200
progress: 4/200
progress: 5/200
….
progress: 197/200
progress: 198/200
progress: 199/200
progress: 200/200
Объяснение:
Допустим, камера расположена в точке (x = 0, y = 0, z = 1), а экран является частью плоскости, образованной осями x и y. Теперь мы можем написать скелет нашего кода.
- Камера — это просто точка, имеющая три координаты;
- С другой стороны, экран определяется четырьмя числами (или двумя точками): слева, сверху, справа, снизу. Он находится в диапазоне от -1 до 1 в направлении x и от -1/ratio до 1/ratio в направлении y, где ratio — ширина изображения, деленная на его высоту. Это вытекает из того, что мы хотим, чтобы экран имел такое же соотношение сторон, что и фактическое изображение. При такой настройке экрана будет получено соотношение сторон (ширина к высоте): 2 /(2/ratio) = ratio, которое и является соотношением сторон желаемого изображения 300x200;
- Цикл состоит из разделения экрана на точки в направлениях x и y, затем вычисляется цвет текущего пикселя;
- Полученный код создаст — как и ожидалось на данном этапе — черное изображение.
Код:
import numpy as np import matplotlib.pyplot as plt def normalize(vector): return vector / np.linalg.norm(vector) width = 300 height = 200 camera = np.array([0, 0, 1]) ratio = float(width) / height screen = (-1, 1 / ratio, 1, -1 / ratio) # слева, сверху, справа, снизу image = np.zeros((height, width, 3)) for i, y in enumerate(np.linspace(screen[1], screen[3], height)): for j, x in enumerate(np.linspace(screen[0], screen[2], width)): pixel = np.array([x, y, 0]) origin = camera direction = normalize(pixel - origin) # image[i, j] = ... print("progress: %d/%d" % (i + 1, height)) plt.imsave('image.png', image)