Ели из семи треугольников

Издалека ель — это силуэт, и для силуэта достаточно семи треугольников. Сложнее сделать так, чтобы лес не выглядел забором.

Еловый лес в тумане: три плана силуэтов, ближние деревья тёмные, дальние почти растворяются
Лес в тумане, seed 51–53. Высота деревьев от 12 до 62 % кадра, расстояние между стволами растёт к переднему плану.

Каждый ярус — равнобедренный треугольник. Вершины всех ярусов лежат на одной оси, а ширина растёт сверху вниз от четверти до полной ширины основания. Ярусы перекрываются, и в силуэте появляются характерные ступеньки.

for t in range(7):
    f = t / 7
    y0 = top - h * (1 - f)
    y1 = y0 + h * 0.32
    hw = base_w * (0.25 + 0.75 * f) * rng.uniform(0.8, 1.1) / 2
    draw.polygon([(x, y0), (x - hw, y1), (x + hw, y1)], fill=255)

Случайность нужна в трёх местах: высота дерева, ширина каждого яруса и шаг до следующего дерева. С постоянным шагом получается забор. Со слишком большим разбросом высоты лес похож на расчёску. Для дальнего плана хорошо работает шаг от 6 до 22 пикселей, для ближнего — от 60 до 180.

Деревья ставятся на линию профиля своего слоя и красятся тем же цветом, что и слой, с той же долей дымки. Тогда они не отрываются от земли и не выглядят наклеенными.

Зимнее поле: снежная равнина, вдали узкая полоса леса
Зимнее поле, seed 91–93. Та же функция с очень мелкими деревьями: на таком масштабе лес читается как неровная полоса.

Маску деревьев я рисую через ImageDraw в отдельный слой, размываю на 0,8 пикселя и только потом накладываю. Без размытия края треугольников остаются лесенкой, и на увеличении это сразу видно.