Вывод последовательности/массива «ёлочкой», «пирамидой» — пример решения (вложенные циклы)
Выведите его на экран «ёлочкой» последовательности чисел до $N$.
Например для $N=12$ вы должны получить:
1 2 3 4 5 6 7 8 9 10 11 12 .
Эту задачу можно решить используя два подхода:
- Просто перебрать (обойти) массив (а в данном случае просто последовательность) так как мы это делаем для вывода элементов в строчку, но в определённые моменты выводить между элементами знак переноса строки и таким образом получить ёлочку.
- Рассмотреть ёлочку как таблицу из нескольких строк (их может быть и очень много) в которой каждая следующая строка длиннее предыдущей на $1$, а первая по своей длине $=1$.
Решение с циклом одного уровня
В этом подходе мы просто перебираем все числа до $n$ в цикле for, в каждом витке выводя очередное значение + иногда перенося строку:
var n, i, j, k:integer; begin writeln('vvedite chislo N:'); readln(n); // получаем число, до которого будем выводить ёлочку k:=1; // число символов которые можно вывести не перенося строку j:=0; // сколько мы вывели с последего переноса строки for i:=1 to N do begin write(i, ' '); // просто выводим в ждом витке j := j + 1; // учтём, что мы вывели ещё один символ (для будущего переноса) if (j>=k) then // не пора ли переносить строку? begin writeln(); // перенос строки j:=0; // в новой строке ёлочки мы ещё ничего не вывели (сбрасываем счетчик) k:=k+1; // следубщий раз выведем на 1 символ больше до переноса строки end; end; readln(); end.
Решение через вложенные циклы
Здесь мы рассмотрим код, иллюстрирующий второй подход:
Рассмотреть ёлочку как таблицу из нескольких строк (их может быть и очень много) в которой каждая следующая строка длиннее предыдущей на $1$, на первая по своей длине $=1$.
Ясно, что в таблице может быть сколько угодно строк (внешний цикл) + нам потребуется выводить каждую строку посимвольно (внутренний цикл).
При этом внешний цикл просто запускает вывод очередной строки и ничего не знает о том как именно эти строки выводятся — его задача состоит просто в том, чтобы контролировать диапазон значений и заново запускать цикл вывода строки.
Очередной внутренний цикл вывода строки начинает свою работу с того значения $i$, на котором он остановился предыдущий раз. Поэтому мы инкрементируем $i$ в единственном месте — а именно сразу после вывода на экран очередного значения.
var n, i, j, k:integer; begin writeln('vvedite chislo N:'); readln(n); // получаем число, до которого будем выводить ёлочку i:=1; k:=1; while (i<=n) do // просто контролируем диапазон begin for j:=1 to k do // вывод очередной строки begin if (i<=n) then // если мы всё ещё в диапазоне begin write(i, ' '); // выводим очередное значение (с пробелом) i:=i+1; // готовим следующее end else break; // досрочный выход из цикла end; writeln(); // переносим строку k:=k+1; // следующая строка будет длиннее на 1 символ end; readln(); end.
Массив как источник данных
Безусловно, мы можем использовать в качестве источника данных для ёлочки и одномерный массив (в программе для инициализации его случайными числами используется процедура -- решим задачу первым способом без вложенных циклов с одним источником данных):
var n, i, j, k:integer; a: array [1..17] of integer; // процедура заполнит массив случайными числами procedure initRandArray(var a: array of integer); var min, max, i: integer; begin randomize(); // инициал. датчик случайных чисел (вызов стандартной процедуры) min := -5; // левая граница max := 10; // правая граница < обходим переданный массив и инициализируем массив случайными числами>for i:=low(a) to high(a) do a[i] := random(max + abs(min)) + min; end; begin // начало тела программы N := 17; // число элементов массива initRandArray(a); // передаём по ссылке для заполнения случаными числами k:=1; // число символов которые можно вывести не перенося строку j:=0; // сколько мы вывели с последего переноса строки for i:=1 to N do begin write(a[i], ' '); // выводим очередной элемент массива j := j + 1; // учтём, что мы вывели ещё один символ (для будущего переноса строки) if (j>=k) then // не пора ли переносить строку? begin writeln(); // перенос строки j:=0; // в новой строке ёлочки мы ещё ничего не вывели (сбрасываем счетчик) k:=k+1; // следубщий раз выведем на 1 символ больше до переноса строки end; end; readln(); end.
Key Words for FKN + antitotal forum (CS VSU):
- ёлочка
- вывод поледовательности ёлочкой пирамидой
- вложенные циклы
- примеры решений задач на вложенные циклы
- вложенные циклы ёлочка Паскаль
Рисуем ёлочку
Напишите функцию picture(file_name, width, height, sky_color, snow_color, trunk_color, needls_color, sun_color):
Параметр file_name задаёт имя файла будущей картинки (Все имена файлов имеют расширение .bmp).
Параметры width, height задают ширину и высоту в пикселях и всегда кратны 100.
Параметр sky_color задаёт цвет неба в форме кортежа из трёх целых чисел. Задайте значение по умолчанию #75BBFD
Параметр snow_color задаёт цвет снега в форме кортежа из трёх целых чисел. Задайте значение по умолчанию #FFFAFA
Параметр trunk_color задаёт цвет ствола в форме кортежа из трёх целых чисел. Задайте значение по умолчанию #A45A52
Параметр needls_color задаёт цвет хвои в форме кортежа из трёх целых чисел. Задайте значение по умолчанию #01796F
Параметр sun_color задаёт цвет солнца в форме кортежа из трёх целых чисел. Задайте значение по умолчанию #FFDB00
Параметры функции должны быть названы именно так, как указано в сигнатуре функции в условии
При вызове функции picture(’test.bmp’, 1000, 800) должно быть получено такое изображение
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Рисуем парусник
Время рисовать! Давайте с помощью функций библиотеки PIL нарисуем лодку с парусом. Напишите.

Рисуем дерево используя рекурсию
Здравствуйте, помогите, пожалуйста, исправить код. Версия Python 3.7.3, операционная система.

Выведите елочку
Летней ночью Макс и Эмилия жарят на костре картошку, играют на гитаре и переписываются с Алисой.

Задача про ёлочку
про ёлочку
Регистрация: 19.03.2020
Сообщений: 26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
from PIL import Image, ImageDraw def picture(file_name, width, height, sky_color='#75BBFD', snow_color='#FFFAFA', trunk_color='#A45A52', needls_color='#01796F', sun_color='#FFDB00'): im = Image.new("RGB", (width, height), sky_color) draw = ImageDraw.Draw(im) draw.rectangle(((0, int(height * 0.8)), (width, height)), snow_color) draw.ellipse(( (int(0.8 * width), -int(0.2 * height)), (int(1.2 * width), int(0.2 * height))), sun_color) draw.rectangle(((int(0.45 * width), int(height * 0.7)), (int(0.55 * width), int(height * 0.9))), trunk_color) draw.polygon(((int(0.50 * width), int(height * 0.10)), (int(0.60 * width), int(height * 0.30)), (int(0.55 * width), int(height * 0.30)), (int(0.65 * width), int(height * 0.50)), (int(0.60 * width), int(height * 0.50)), (int(0.70 * width), int(height * 0.70)), (int(0.30 * width), int(height * 0.70)), (int(0.40 * width), int(height * 0.50)), (int(0.35 * width), int(height * 0.50)), (int(0.45 * width), int(height * 0.30)), (int(0.40 * width), int(height * 0.30))), needls_color) im.save(file_name)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Выведите ёлочку из звёздочек
Вам требуется нарисовать на экране ёлочку высоты H. ВХОДНЫЕ ДАННЫЕ Вводится одно натуральное.
Сделать ёлочку из цифр через for
По данному натуральному 1 ≤ n ≤ 9 выведите ёлочку из цифр, i-я строчка состоит из чисел от i до 1 и.
Разработать рекурсивную функцию, которая выводит на экран елочку из звездочек
Разработать рекурсивную функцию, которая выводит на экран елочку из звездочек. Количество строк n.
Рисуем дерево
6. Напишите функцию, выводящую на экран построчно дерево, состоящее из символов “|” (ствол), “\”.
Рисуем прямоугольник
Вася решил познать азы ASCII-живописи и, как все начинающие художники, начал с рисования простых.

Нарисовать елочку
Завтра зачет, нужно сделать программу с помощью вложенный циклов вывести елочку х хх х хх ххх.
Нарисовать ёлочку
15. Необходимо срочно к Новому году нарисовать ёлочку. С клавиатуры вводится количество ярусов, и.
Задача на Python. Ёлочка. (функции)
Ёлочка
Маленький Петя делает новогоднюю открытку. Для этого ему надо нарисовать ёлочку. Однако Пете сложно самому справиться с этой задачей, помогите ему в этом.
Ёлочка состоит из n уровней. Первый (верхний) уровень состоит из двух строк, второй — из трех, ..n-й — из n+1 строк. Все строки заполнены одинаковым символом ∗, при этом длины строк составляют 1,2. i+1 на уровне i.
Например, 2-ой уровень ёлочки выглядит так:
Необходимо по введённому натуральному числу n нарисовать ёлочку из n уровней.
Необходимо оформить решение в виде функции для рисования ёлочки tree(n), которая будет вызывать функцию makeLevel(i) для рисования каждого уровня ёлочки при различных значениях i.
def tree(n):
#сюда нужно вставить код
n = int(input())
three (n)
PyOpenGL для начинающих и немного новогоднего настроения

Благодаря своей гибкости и простоте, язык Python позволяет легко и быстро писать целый ряд приложений и утилит. Мною данный язык, в основном, используется для написания небольших скриптов, облегчающих выполнение различных задач, связанных с системным администрированием. Как оказалось, Python можно использовать и для не совсем «традиционных» задач, например, для вывода 3D графики. Об этом и будет мой небольшой предновогодний пост.
В этой статье я постараюсь показать, насколько просто работать с OpenGL в Python. Рисовать на экране мы будем новогоднюю 3D елку. Елка будет довольно схематичная, поэтому, если вы ожидали от поста роскошную графику с шейдерами, можете дальше не читать, вам будет не интересно.
Для работы с «непитоновскими» библиотеками (например, OpenGL) необходимы модули, обеспечивающие возможность вызова функций библиотеки непосредственно из программы на языке Python. Библиотека PyOpenGL — модуль, позволяющий в программах на языке Python легко работать с функциями OpenGL, GLU и GLUT, а также с рядом расширений OpenGL.
- Интерпретатор языка Python (ссылка).
- Среда разработки PyCharm (ссылка) (или любая другая на ваш вкус, подойдет даже блокнот).
- Библиотека PyOpenGL (ссылка).
Для работы с 3D графикой (в частности, OpenGL) необходимо импортировать несколько модулей:
from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import *
Мы будем, насколько возможно, пользоваться функциями из модуля glut, чтобы не писать «лишний» код и не изобретать очередные велосипеды.
Инициализируем режим отображения с использованием двойной буферизации и цветов в формате RGB (двойная буферизация позволяет избежать мерцания во время перерисовки экрана):
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
Зададим начальный размер окна (ширина, высота):
glutInitWindowSize(300, 300)
Укажем начальное положение окна относительно левого верхнего угла экрана:
glutInitWindowPosition(50, 50)
Выполним инициализацию OpenGl:
glutInit(sys.argv)
Создадим окно с заголовком «Happy New Year!»:
glutCreateWindow(b"Happy New Year!")
Запустим основной цикл программы:
glutMainLoop()
Если запустить программу на выполнение, то мы увидим пустое окно с заголовком «Happy New Year!». Это замечательно, но не хватает главного — елки! Поэтому не будем останавливаться на достигнутом и пойдем дальше.
Перед тем как начать рисовать елку, необходимо провести ряд подготовительных мероприятий или, другими словами, выполнить инициализацию. Для этого создадим отдельную процедуру и не забудем вызвать её до запуска основного цикла программы. В нашей программе процедура инициализации выглядит следующим образом:
# Процедура инициализации def init(): global xrot # Величина вращения по оси x global yrot # Величина вращения по оси y global ambient # Рассеянное освещение global greencolor # Цвет елочных иголок global treecolor # Цвет елочного ствола global lightpos # Положение источника освещения xrot = 0.0 # Величина вращения по оси x = 0 yrot = 0.0 # Величина вращения по оси y = 0 ambient = (1.0, 1.0, 1.0, 1) # Первые три числа - цвет в формате RGB, а последнее - яркость greencolor = (0.2, 0.8, 0.0, 0.8) # Зеленый цвет для иголок treecolor = (0.9, 0.6, 0.3, 0.8) # Коричневый цвет для ствола lightpos = (1.0, 1.0, 1.0) # Положение источника освещения по осям xyz glClearColor(0.5, 0.5, 0.5, 1.0) # Серый цвет для первоначальной закраски gluOrtho2D(-1.0, 1.0, -1.0, 1.0) # Определяем границы рисования по горизонтали и вертикали glRotatef(-90, 1.0, 0.0, 0.0) # Сместимся по оси Х на 90 градусов glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient) # Определяем текущую модель освещения glEnable(GL_LIGHTING) # Включаем освещение glEnable(GL_LIGHT0) # Включаем один источник света glLightfv(GL_LIGHT0, GL_POSITION, lightpos) # Определяем положение источника света
Переменные xrot и yrot определяют угол вращения по осям x и y (это понадобится нам в дальнейшем для того, чтобы иметь возможность осмотреть елку со всех сторон). Массив ambient определяет параметры рассеянного освещения: цвет и яркость. Далее задаются две переменные (greencolor, treecolor), определяющие зеленый цвет для иголок и коричневый цвет для ствола.
Функцией glClearColor, определяется цвет, которым будет закрашиваться экран перед каждым новым циклом перерисовки. Функцией gluOrtho2D определяем границы рисования по горизонтали и вертикали. С использованием функции glRotatef смещаемся по оси X на 90 градусов, так нам будет лучше видно елку. Функцией glLightModelfv устанавливаем рассеянную модель освещения. Включаем освещение командой glEnable(GL_LIGHTING). Просто включить освещение недостаточно, нужно добавить хотя бы один источник освещения. Делаем это функцией glEnable(GL_LIGHT0). И, напоследок, отодвинем подальше только что созданный источник света:
glLightfv(GL_LIGHT0, GL_POSITION, lightpos)
На этом инициализацию OpenGL можно считать завершенной. Осталось только одно подготовительное мероприятие: нам нужно создать процедуру, обрабатывающую нажатия клавиш, и сообщить glut о необходимости её использовать (для этого перед запуском основного цикла программы выполним функцию glutSpecialFunc(specialkeys). Сама процедура specialkeys выглядит следующим образом:
# Процедура обработки специальных клавиш def specialkeys(key, x, y): global xrot global yrot # Обработчики для клавиш со стрелками if key == GLUT_KEY_UP: # Клавиша вверх xrot -= 2.0 # Уменьшаем угол вращения по оси X if key == GLUT_KEY_DOWN: # Клавиша вниз xrot += 2.0 # Увеличиваем угол вращения по оси X if key == GLUT_KEY_LEFT: # Клавиша влево yrot -= 2.0 # Уменьшаем угол вращения по оси Y if key == GLUT_KEY_RIGHT: # Клавиша вправо yrot += 2.0 # Увеличиваем угол вращения по оси Y glutPostRedisplay() # Вызываем процедуру перерисовки
В коде specialkeys в зависимости от того, какая стрелка на клавиатуре была нажата, мы либо уменьшаем, либо увеличиваем значения переменных xrot или yrot, а затем функцией glutPostRedisplay вызываем перерисовку экрана.
Все, теперь можно приступать к главному — рисованию елки! Как и в случае с функцией specialkeys сообщим glut о том, какую процедуру использовать для перерисовки экрана: glutDisplayFunc(draw). Сама процедура draw выглядит следующим образом:
# Процедура перерисовки def draw(): global xrot global yrot global lightpos global greencolor global treecolor glClear(GL_COLOR_BUFFER_BIT) # Очищаем экран и заливаем серым цветом glPushMatrix() # Сохраняем текущее положение "камеры" glRotatef(xrot, 1.0, 0.0, 0.0) # Вращаем по оси X на величину xrot glRotatef(yrot, 0.0, 1.0, 0.0) # Вращаем по оси Y на величину yrot glLightfv(GL_LIGHT0, GL_POSITION, lightpos) # Источник света вращаем вместе с елкой # Рисуем ствол елки # Устанавливаем материал: рисовать с 2 сторон, рассеянное освещение, коричневый цвет glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor) glTranslatef(0.0, 0.0, -0.7) # Сдвинемся по оси Z на -0.7 # Рисуем цилиндр с радиусом 0.1, высотой 0.2 # Последние два числа определяют количество полигонов glutSolidCylinder(0.1, 0.2, 20, 20) # Рисуем ветки елки # Устанавливаем материал: рисовать с 2 сторон, рассеянное освещение, зеленый цвет glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greencolor) glTranslatef(0.0, 0.0, 0.2) # Сдвинемся по оси Z на 0.2 # Рисуем нижние ветки (конус) с радиусом 0.5, высотой 0.5 # Последние два числа определяют количество полигонов glutSolidCone(0.5, 0.5, 20, 20) glTranslatef(0.0, 0.0, 0.3) # Сдвинемся по оси Z на -0.3 glutSolidCone(0.4, 0.4, 20, 20) # Конус с радиусом 0.4, высотой 0.4 glTranslatef(0.0, 0.0, 0.3) # Сдвинемся по оси Z на -0.3 glutSolidCone(0.3, 0.3, 20, 20) # Конус с радиусом 0.3, высотой 0.3 glPopMatrix() # Возвращаем сохраненное положение "камеры" glutSwapBuffers() # Выводим все нарисованное в памяти на экран
Функция glClear(GL_COLOR_BUFFER_BIT) используется для заливки экрана серым цветом. Пара функций glPushMatrix() и glPopMatrix() позволяет нам вращать только елку. Функция glLightfv(GL_LIGHT0, GL_POSITION, lightpos) «вращает» источник освещения вместе с елкой, благодаря этому, она остается «статично» освещенной. Функция glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color) устанавливает двусторонний режим рисования, рассеянное освещение и задает цвет, которым рисуется объект. Иголки мы рисуем с использованием функции glutSolidCone(0.5, 0.5, 20, 20), а ствол елки с использованием функции glutSolidCylinder(0.1, 0.2, 20, 20). Первые два параметра этих функции определяют радиус и высоту, а последние два — количество элементов, из которых состоят фигуры (полигонов). После того, как все части елки нарисованы в памяти видеокарты, вызовом функции glutSwapBuffers() выводим их на экран.
Весь код программы:
# Импортируем все необходимые библиотеки: from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * import sys # Объявляем все глобальные переменные global xrot # Величина вращения по оси x global yrot # Величина вращения по оси y global ambient # рассеянное освещение global greencolor # Цвет елочных иголок global treecolor # Цвет елочного стебля global lightpos # Положение источника освещения # Процедура инициализации def init(): global xrot # Величина вращения по оси x global yrot # Величина вращения по оси y global ambient # Рассеянное освещение global greencolor # Цвет елочных иголок global treecolor # Цвет елочного ствола global lightpos # Положение источника освещения xrot = 0.0 # Величина вращения по оси x = 0 yrot = 0.0 # Величина вращения по оси y = 0 ambient = (1.0, 1.0, 1.0, 1) # Первые три числа цвет в формате RGB, а последнее - яркость greencolor = (0.2, 0.8, 0.0, 0.8) # Зеленый цвет для иголок treecolor = (0.9, 0.6, 0.3, 0.8) # Коричневый цвет для ствола lightpos = (1.0, 1.0, 1.0) # Положение источника освещения по осям xyz glClearColor(0.5, 0.5, 0.5, 1.0) # Серый цвет для первоначальной закраски gluOrtho2D(-1.0, 1.0, -1.0, 1.0) # Определяем границы рисования по горизонтали и вертикали glRotatef(-90, 1.0, 0.0, 0.0) # Сместимся по оси Х на 90 градусов glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient) # Определяем текущую модель освещения glEnable(GL_LIGHTING) # Включаем освещение glEnable(GL_LIGHT0) # Включаем один источник света glLightfv(GL_LIGHT0, GL_POSITION, lightpos) # Определяем положение источника света # Процедура обработки специальных клавиш def specialkeys(key, x, y): global xrot global yrot # Обработчики для клавиш со стрелками if key == GLUT_KEY_UP: # Клавиша вверх xrot -= 2.0 # Уменьшаем угол вращения по оси Х if key == GLUT_KEY_DOWN: # Клавиша вниз xrot += 2.0 # Увеличиваем угол вращения по оси Х if key == GLUT_KEY_LEFT: # Клавиша влево yrot -= 2.0 # Уменьшаем угол вращения по оси Y if key == GLUT_KEY_RIGHT: # Клавиша вправо yrot += 2.0 # Увеличиваем угол вращения по оси Y glutPostRedisplay() # Вызываем процедуру перерисовки # Процедура перерисовки def draw(): global xrot global yrot global lightpos global greencolor global treecolor glClear(GL_COLOR_BUFFER_BIT) # Очищаем экран и заливаем серым цветом glPushMatrix() # Сохраняем текущее положение "камеры" glRotatef(xrot, 1.0, 0.0, 0.0) # Вращаем по оси X на величину xrot glRotatef(yrot, 0.0, 1.0, 0.0) # Вращаем по оси Y на величину yrot glLightfv(GL_LIGHT0, GL_POSITION, lightpos) # Источник света вращаем вместе с елкой # Рисуем ствол елки # Устанавливаем материал: рисовать с 2 сторон, рассеянное освещение, коричневый цвет glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor) glTranslatef(0.0, 0.0, -0.7) # Сдвинемся по оси Z на -0.7 # Рисуем цилиндр с радиусом 0.1, высотой 0.2 # Последние два числа определяют количество полигонов glutSolidCylinder(0.1, 0.2, 20, 20) # Рисуем ветки елки # Устанавливаем материал: рисовать с 2 сторон, рассеянное освещение, зеленый цвет glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greencolor) glTranslatef(0.0, 0.0, 0.2) # Сдвинемся по оси Z на 0.2 # Рисуем нижние ветки (конус) с радиусом 0.5, высотой 0.5 # Последние два числа определяют количество полигонов glutSolidCone(0.5, 0.5, 20, 20) glTranslatef(0.0, 0.0, 0.3) # Сдвинемся по оси Z на -0.3 glutSolidCone(0.4, 0.4, 20, 20) # Конус с радиусом 0.4, высотой 0.4 glTranslatef(0.0, 0.0, 0.3) # Сдвинемся по оси Z на -0.3 glutSolidCone(0.3, 0.3, 20, 20) # Конус с радиусом 0.3, высотой 0.3 glPopMatrix() # Возвращаем сохраненное положение "камеры" glutSwapBuffers() # Выводим все нарисованное в памяти на экран # Здесь начинается выполнение программы # Использовать двойную буферизацию и цвета в формате RGB (Красный, Зеленый, Синий) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) # Указываем начальный размер окна (ширина, высота) glutInitWindowSize(300, 300) # Указываем начальное положение окна относительно левого верхнего угла экрана glutInitWindowPosition(50, 50) # Инициализация OpenGl glutInit(sys.argv) # Создаем окно с заголовком "Happy New Year!" glutCreateWindow(b"Happy New Year!") # Определяем процедуру, отвечающую за перерисовку glutDisplayFunc(draw) # Определяем процедуру, отвечающую за обработку клавиш glutSpecialFunc(specialkeys) # Вызываем нашу функцию инициализации init() # Запускаем основной цикл glutMainLoop()
Результат выполнения программы(елка во всей красе):


и немного видео:
Используя рассмотренный в посте функционал вполне можно рисовать не только новогодние елки, но и трехмерные графики, и модели различных систем.
Надеюсь, данная статья окажется для кого-то полезной и подтолкнет к дальнейшему изучению языка Python и спецификации OpenGL.
С наступающим Новым годом, товарищи.
