Блог учителя Информатики

Рисуем эллипс с наклоном с помощью Черепашки в Python

В прошлой статье мы нарисовали с помощью Черепашки эллипс. Недостаток этого решения в том, что фигура получается всегда горизонтально. Но сейчас мы улучшим нашу программу так, чтобы можно было рисовать эллипс с наклоном на заданный угол.

Возьмем готовый код рисующий эллипс из прошлого материала и добавим в него пересчет координат со смещением на заданный угол для рисования фигуры с наклоном.
График эллипса с наклоном нарисованный Черепашкой из модуля Tutrle в 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
Поделиться:
Вам также может понравится
Решение олимпиадных задач по информатике: Наименьший остаток
Решение олимпиадных задач по информатике: Последовательность
Решение олимпиадных задач по информатике: От перестановки чисел что-то меняется
Делаем Черепашку в виде снежинки