Рисуем эллипс с наклоном с помощью Черепашки в Python
В прошлой статье мы нарисовали с помощью Черепашки эллипс. Недостаток этого решения в том, что фигура получается всегда горизонтально. Но сейчас мы улучшим нашу программу так, чтобы можно было рисовать эллипс с наклоном на заданный угол.
Возьмем готовый код рисующий эллипс из прошлого материала и добавим в него пересчет координат со смещением на заданный угол для рисования фигуры с наклоном.
Введем новую переменную tilt для хранения значения угла отклонения эллипса. Пересчитаем ее в радианы используя функция radians() из модуля math и поместим в переменную tilt_rad для дальнейшего использования. Найдем координаты x и y для расчета нашего эллипса и переведем их в новые x_tilt и y_tilt согласно формуле, для дальнейшего рисования Черепашкой.
import turtle import math # ellipse width a = 100 # ellipse height b = 50 # ellipse tilt tilt = 35 dx = turtle.xcor() dy = turtle.ycor() tilt_rad = -math.radians(tilt) for deg in range(361): rad = math.radians(deg) x = a * math.sin(rad) y = -b * math.cos(rad) + b x_tilt = x * math.cos(tilt_rad) + y * math.sin(tilt_rad) + dx y_tilt = -x * math.sin(tilt_rad) + y * math.cos(tilt_rad) + dy turtle.goto(x_tilt, y_tilt)
Теперь изменим нашу функцию так, чтобы можно было рисовать как обычный эллипс, так и наклоненный под заданным углом. Для этого, после указания параметров с размерами эллипса добавим значение по умолчанию tilt=0. Таким образом, мы рисуем по умолчанию обычный эллипс, но если в функцию передать три аргумента, то эллипс будет отклонен на значение третьего аргумента.
import turtle import math def ellipse(a, b, tilt=0, color='black', fill=''): """ This function draws an ellipse. """ dx = turtle.xcor() dy = turtle.ycor() tilt_rad = -math.radians(tilt) turtle.color(color, fill) turtle.begin_fill() for deg in range(361): rad = math.radians(deg) x = a * math.sin(rad) y = -b * math.cos(rad) + b x_tilt = x * math.cos(tilt_rad) + y * math.sin(tilt_rad) + dx y_tilt = -x * math.sin(tilt_rad) + y * math.cos(tilt_rad) + dy turtle.goto(x_tilt, y_tilt) turtle.end_fill() ellipse(250, 90, 25, 'red', 'green') ellipse(180, 75, 15, color='blue', fill='orange') ellipse(120, 50)Посмотреть Live Demo