Рисуем эллипс с наклоном с помощью Черепашки в 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












