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

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

К сожалению, в модуле Turtle нет отдельной команды для рисования эллипса. Попробуем его нарисовать. Для этого будем находить значения точек, составляющих периметр фигуры.

Чтобы найти координаты этих точек, возьмем каноническое уравнение эллипса.
где t это угол отклонения от оси абсцисс и ординат.
Чтобы построить законченный эллипс, необходимо будет рассчитать точки для всех значений градусов составляющих окружность, от 0 до 360.
Для начала подключим модуль turtle для управления нашей Черепашкой и модуль math для нахождения синуса и косинуса угла.
В качестве основных параметров у нас будут переменные a и b — это радиусы большей и меньшей окружности эллипса, задающие форму фигуры. Для рисования будем использовать команду goto() для перемещения Черепашки с текущего места в новую точку. Чтобы просчитать все значения x и y, воспользуемся циклом со счетчиком.
График эллипса нарисованный Черепашкой из модуля Tutrle в Python
Из модуля math нам понадобятся функции sin() и cos(). Эти функции принимают значения в радианах. Чтобы перевести градусы в радианы воспользуемся функцией radians() из того же модуля math и запишем полученное значение в переменную rad.
В переменные dx и dy мы записываем текущее положения Черепашки, используя функции для получения текущих координат xcor() и ycor(), для x и y координат соответственно. Далее при вычислении расположения точки на периметре эллипса мы будем делать поправки на них, прибавляя эти значения к полученным координатам. Это позволит рисовать Черепашку из текущего положения, а не из центра координат.
Формулы рассчитывают положение координат из центра эллипса, при нахождении y координаты сделаем поправку на это же значение b. Это необходимо чтобы наша Черепашка при рисовании не перепрыгивала из центра эллипса на его окружность, а начинала рисовать с текущей позиции. При этом рисование эллипса будет идентично работе функции circle(), рисующей окружность.

import turtle
import math

a = 150
b = 90
dx = turtle.xcor()
dy = turtle.ycor()
for deg in range(361):
    rad = math.radians(deg)
    x = a * math.sin(rad) + dx
    y = -b * math.cos(rad) + b + dy
    turtle.goto(x, y)

Черепашка рисует эллипс с текущей позиции против часовой стрелки. Чтобы заставить рисовать эллипс по часовой стрелке, достаточно передать отрицательное значение второго аргумента b. Отрицательное значение a меняет направление рисования при движении. Черепашка начинает рисовать двигаясь не вперед, а назад.
Теперь оформим код в отдельную функцию для дальнейшего использования в различных проектах. Также добавим к функции дополнительные возможности, указание цвета линии, которым будет рисоваться эллипс и заливку фигуры.
В качестве аргументов будем передавать значения большого и малого радиусов нашего эллипса. В качестве необязательных параметров указываем цвет линии (по умолчанию рисуем черным) и цвет заливки (по умолчанию будет прозрачная).

import turtle
import math


def ellipse(a, b, color='black', fill=''):
    """
    This function draws an ellipse.
    """
    dx = turtle.xcor()
    dy = turtle.ycor()
    turtle.color(color, fill)
    turtle.begin_fill()
    for deg in range(361):
        rad = math.radians(deg)
        x = a * math.sin(rad) + dx
        y = -b * math.cos(rad) + b + dy
        turtle.goto(x, y)
    turtle.end_fill()


ellipse(250, 90, 'red', 'green')
ellipse(180, 75, color='blue', fill='orange')
ellipse(120, 50)
Посмотреть Live Demo
Поделиться:
Вам также может понравится
Решение олимпиадных задач по информатике: Наименьший остаток
Решение олимпиадных задач по информатике: Последовательность
Решение олимпиадных задач по информатике: От перестановки чисел что-то меняется
Делаем Черепашку в виде снежинки