Рисуем эллипс с помощью Черепашки в Python
К сожалению, в модуле Turtle нет отдельной команды для рисования эллипса. Попробуем его нарисовать. Для этого будем находить значения точек, составляющих периметр фигуры.
Чтобы найти координаты этих точек, возьмем каноническое уравнение эллипса.
где t это угол отклонения от оси абсцисс и ординат.
Чтобы построить законченный эллипс, необходимо будет рассчитать точки для всех значений градусов составляющих окружность, от 0 до 360.
Для начала подключим модуль turtle для управления нашей Черепашкой и модуль math для нахождения синуса и косинуса угла.
В качестве основных параметров у нас будут переменные a и b - это радиусы большей и меньшей окружности эллипса, задающие форму фигуры. Для рисования будем использовать команду goto() для перемещения Черепашки с текущего места в новую точку. Чтобы просчитать все значения x и y, воспользуемся циклом со счетчиком.
Из модуля 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