Как сделать елочку в питоне
Перейти к содержимому

Как сделать елочку в питоне

Python 3, командная строка, рисуем елку

Задание

Как лучше выполнить эту задачу? вот что у меня получилось, как можно сделать по другому?

user avatar

user avatar

Ваш код у меня вообще не отработал. Вот, Вам, мой пример генератора ёлки:

А вот с игрушками:

Если нужен такой вывод:

То: [26] ((STRAR*stars) if (i % 2) == 0 else toy(STRAR*stars)) +

Код:

Вывод:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.13.42356

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Печать елки в питоне

Это простая проблема программирования. Итак, давайте создадим простую программу для ее решения.

Сначала нам нужно нарисовать наше дерево. в каждой строке у нашего дерева есть нечетное число запусков для отображения дерева и некоторые

символы для представления фона. Если мы хотим получить дерево, высота которого равна переменной height . в height -ой строке мы не хотим иметь ни одного символа

. Но в первой строке мы хотим иметь только один * символ.

Таким образом, кажется хорошей идеей иметь цикл for, который отсчитывает от height до нуля и каким-то образом связывает с ним количество символов

Давайте сначала посмотрим код:

Если вы запустите этот код, вы получите следующий вывод:

Теперь давайте добавим * символы для рисования дерева. У нас должно быть совершенно противоположное отношение для * символов из

Мы добавляем end=»» в конце предыдущей функции print . Потому что print будет добавлять символ новой строки в конце каждого вызова, и мы хотим предотвратить это (потому что мы хотим добавить * символов после

Затем мы хотим добавить * символов в каждой строке. Но мы хотим посчитать их количество от 1 до height * 2 . Но нам нужны только нечетные числа. Это то, что мы сделали во второй строке. Теперь у нас есть следующее количество * символов в каждой строке: 1, 3, 5, 7, .

Ниже приведен вывод этого кода (мы считали, что height = 7 ):

Как видите, теперь у нас есть новогодняя елка. Но наш фон неполон. Единственное, что нам нужно сделать, это повторить наше первое утверждение print . Но на этот раз мы не должны добавлять end=»» , потому что мы хотим эту новую строку в конце каждой строки.

Теперь наше дерево завершено:

Вы можете добавить другие вещи в свое дерево, следуя этому простому подходу. Я надеюсь, это поможет вам.

PyOpenGL для начинающих и немного новогоднего настроения

image

Благодаря своей гибкости и простоте, язык Python позволяет легко и быстро писать целый ряд приложений и утилит. Мною данный язык, в основном, используется для написания небольших скриптов, облегчающих выполнение различных задач, связанных с системным администрированием. Как оказалось, Python можно использовать и для не совсем «традиционных» задач, например, для вывода 3D графики. Об этом и будет мой небольшой предновогодний пост.

В этой статье я постараюсь показать, насколько просто работать с OpenGL в Python. Рисовать на экране мы будем новогоднюю 3D елку. Елка будет довольно схематичная, поэтому, если вы ожидали от поста роскошную графику с шейдерами, можете дальше не читать, вам будет не интересно.

Для работы с «непитоновскими» библиотеками (например, OpenGL) необходимы модули, обеспечивающие возможность вызова функций библиотеки непосредственно из программы на языке Python. Библиотека PyOpenGL — модуль, позволяющий в программах на языке Python легко работать с функциями OpenGL, GLU и GLUT, а также с рядом расширений OpenGL.

  • Интерпретатор языка Python (ссылка).
  • Среда разработки PyCharm (ссылка) (или любая другая на ваш вкус, подойдет даже блокнот).
  • Библиотека PyOpenGL (ссылка).

Для работы с 3D графикой (в частности, OpenGL) необходимо импортировать несколько модулей:

Мы будем, насколько возможно, пользоваться функциями из модуля glut, чтобы не писать «лишний» код и не изобретать очередные велосипеды.
Инициализируем режим отображения с использованием двойной буферизации и цветов в формате RGB (двойная буферизация позволяет избежать мерцания во время перерисовки экрана):

Зададим начальный размер окна (ширина, высота):

Укажем начальное положение окна относительно левого верхнего угла экрана:

Выполним инициализацию OpenGl:

Создадим окно с заголовком «Happy New Year!»:

Запустим основной цикл программы:

Если запустить программу на выполнение, то мы увидим пустое окно с заголовком «Happy New Year!». Это замечательно, но не хватает главного — елки! Поэтому не будем останавливаться на достигнутом и пойдем дальше.

Перед тем как начать рисовать елку, необходимо провести ряд подготовительных мероприятий или, другими словами, выполнить инициализацию. Для этого создадим отдельную процедуру и не забудем вызвать её до запуска основного цикла программы. В нашей программе процедура инициализации выглядит следующим образом:

Переменные xrot и yrot определяют угол вращения по осям x и y (это понадобится нам в дальнейшем для того, чтобы иметь возможность осмотреть елку со всех сторон). Массив ambient определяет параметры рассеянного освещения: цвет и яркость. Далее задаются две переменные (greencolor, treecolor), определяющие зеленый цвет для иголок и коричневый цвет для ствола.

Функцией glClearColor, определяется цвет, которым будет закрашиваться экран перед каждым новым циклом перерисовки. Функцией gluOrtho2D определяем границы рисования по горизонтали и вертикали. С использованием функции glRotatef смещаемся по оси X на 90 градусов, так нам будет лучше видно елку. Функцией glLightModelfv устанавливаем рассеянную модель освещения. Включаем освещение командой glEnable(GL_LIGHTING). Просто включить освещение недостаточно, нужно добавить хотя бы один источник освещения. Делаем это функцией glEnable(GL_LIGHT0). И, напоследок, отодвинем подальше только что созданный источник света:

На этом инициализацию OpenGL можно считать завершенной. Осталось только одно подготовительное мероприятие: нам нужно создать процедуру, обрабатывающую нажатия клавиш, и сообщить glut о необходимости её использовать (для этого перед запуском основного цикла программы выполним функцию glutSpecialFunc(specialkeys). Сама процедура specialkeys выглядит следующим образом:

В коде specialkeys в зависимости от того, какая стрелка на клавиатуре была нажата, мы либо уменьшаем, либо увеличиваем значения переменных xrot или yrot, а затем функцией glutPostRedisplay вызываем перерисовку экрана.

Все, теперь можно приступать к главному — рисованию елки! Как и в случае с функцией specialkeys сообщим glut о том, какую процедуру использовать для перерисовки экрана: glutDisplayFunc(draw). Сама процедура draw выглядит следующим образом:

Функция 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() выводим их на экран.

Результат выполнения программы(елка во всей красе):

image

image

и немного видео:

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *