Вспомним черепаху
Мы работали с черпахой.- import turtle - нужно в начале
- t = turtle.Turtle() - делали черепаху
- turtle.done() - пишем в конце, чтобы черепаха не исчезала
- t.fd(100) - черепаха идет вперед
import turtle t = turtle.Turtle() t.width(5) t.color("blue") # начинаем движение в точке (0, 0) t.fd(100) t.lt(90) t.fd(50) turtle.done()
Grid
Теперь можно рисовать в координатной сетке, как на математикеfrom grid import Grid g = Grid() # тут рисуем точки и линии g.draw_dot(30, 10, 'red') g.draw_dot(-20, 40) g.draw_line(30, 10, 0, -50, 'violet') g.done() # обязательно, иначе не будет видно рисунок

Классы
Хотим работать с геометрическими фигурами так же, как с черепахой.from grid import Grid g = Grid() # работаем с точкой, как с черепахой p1 = Point(50, -30, 'red') # создаем точку p1.draw() # рисуем точку print(p1) # точку можно напечатать p1.move(20) # двигаем точку на dx=20 p1.col = 'violet' # изменяем цвет точки p1.draw() # рисуем точку на новом месте print(p1) # печатаем новые значения точки g.done() # обязательно, иначе не будет видно рисунок

Создаем класс точка
Мы хранили разные переменные отдельно. Одна точка описывается координатами х у и цветом. К точке относятся переменные x, y, col. Если точек много, таких переменных много. Легко перепутать. Будем хранить все переменные, которые относятся к одной точке в одном "ящике". В этот же ящик положим функции, которые рисуют точку draw и двигают ее move. Объединить переменные в один ящик - это сделать класс. Класс описывает как делать разные точки (делать разные ящики, в каждом из них хранится по точке). Одна точка - это один экземпляр класса (один конкретный ящик). Можно делать другие ящики - для отрезка, прямоугольника, окружности, треугольника. Это потом. Сейчас опишем как сделать ящик (класс) точка и что в нем лежит. Назовем класс Point. В коде пишемclass Point: # с отступом <TAB> будем писать что в этом классе (ящике) # кончились отступы, закончился класс Point # тут можно его использовать
class Point: # с отступом <TAB> будем писать что в этом классе (ящике) # функция, которая делает 1 точку. В ней описывается, какие переменные лежат в ящике # это мой ящик. Его называю self # self - обязательный первый параметр каждой функции в классе def __init__(self, x, y, col='blue'): self.x = x # self.x и x - это разные переменные; self.x лежит в моем ящике, x - лежит где-то вне ящика self.y = y # self.y и y - это разные переменные; self.y лежит в моем ящике, y - лежит где-то вне ящика self.col = col # self.col и col - это разные переменные ... # функция рисует точку. координаты точки в ящике self def draw(self): g.draw_dot(self.x, self.y, self.col) # кончились отступы, закончился класс Point # тут можно его использовать p1 = Point(50, -30, 'red') # к ящику снаружи можно обратиться по ссылке. Переменная с именем p1 ссылается на сделанный ящик p1.draw() # нарисовать точку, на которую ссылается переменная p1
Печатаем точку
Если мы будем печатать точку, то получим непонятную информациюprint(p1) # <__main__.Point object at 0x7f6060e7e1d0>
class Point: # с отступом <TAB> будем писать что в этом классе (ящике) # функция, которая делает 1 точку. В ней описывается, какие переменные лежат в ящике # это мой ящик. Его называю self # self - обязательный первый параметр каждой функции в классе def __init__(self, x, y, col='blue'): self.x = x # self.x и x - это разные переменные; self.x лежит в моем ящике, x - лежит где-то вне ящика self.y = y # self.y и y - это разные переменные; self.y лежит в моем ящике, y - лежит где-то вне ящика self.col = col # self.col и col - это разные переменные ... # функция делает из точки строку, возвращает строку. Нужна для печати # у нее только свой ящик self, в котором хранятся self.x, self.y, self.col. Из них делаем строку. def __repr__(self): s = f'({self.x}, {self.y}) {self.col}' # функция рисует точку. координаты точки в ящике self def draw(self): g.draw_dot(self.x, self.y, self.col) # кончились отступы, закончился класс Point # тут можно его использовать p1 = Point(50, -30, 'red') # к ящику снаружи можно обратиться по ссылке. Переменная с именем p1 ссылается на сделанный ящик p1.draw() # нарисовать точку, на которую ссылается переменная p1 print(p1) # (50, -30) red
Двигаем точку
Напишем функцию move, которая двигает точку на dx по оси Х. Сдвинем точку. Сделаем точку другого цвета и напечатаем ее.class Point: # с отступом <TAB> будем писать что в этом классе (ящике) # функция, которая делает 1 точку. В ней описывается, какие переменные лежат в ящике # это мой ящик. Его называю self # self - обязательный первый параметр каждой функции в классе def __init__(self, x, y, col='blue'): self.x = x # self.x и x - это разные переменные; self.x лежит в моем ящике, x - лежит где-то вне ящика self.y = y # self.y и y - это разные переменные; self.y лежит в моем ящике, y - лежит где-то вне ящика self.col = col # self.col и col - это разные переменные ... # функция делает из точки строку, возвращает строку. Нужна для печати # у нее только свой ящик self, в котором хранятся self.x, self.y, self.col. Из них делаем строку. def __repr__(self): s = f'({self.x}, {self.y}) {self.col}' # функция рисует точку. координаты точки в ящике self def draw(self): g.draw_dot(self.x, self.y, self.col) # двигаем точку на dx. Изменяе координаты точки, которые хранятся в ящике self def move(self, dx): self.x = self.x + dx # кончились отступы, закончился класс Point # тут можно его использовать p1 = Point(50, -30, 'red') # к ящику снаружи можно обратиться по ссылке. Переменная с именем p1 ссылается на сделанный ящик p1.draw() # нарисовать точку, на которую ссылается переменная p1 print(p1) # (50, -30) red p1.move(20) # двигаем точку на 20 по оси х p1.col = 'violet' # цвет точки лежит в ящике. К нему мы снаружи доступаемся по имени p1 p1.draw() print(p1) # (70, -30) red
Задачи урока 1
Перепишите код для точки. Запустите его. Дальше делайте свой вариант.- Написать функцию, которая изменяет место точки (варианты)
- move(self, dx, dy)
- flipH(self) - отображение относительно оси У
- flipV(self) - отображение относительно оси Х
- sym0(self) - поворот на 180 градусов относительно (0,0)
- zoom(self, k) - удалить точку относительно (0,0) в k раз
- Написать функцию, которая изменяет место точки (варианты)
- rotateleft(self) - поворот точки на 90 градусов против часовой стрелки относительно (0,0)
- rotateright(self) - поворот точки на 90 градусов по часовой стрелки относительно (0,0)
Урок 2
Возвращаем число
Метод класса (функция) может вернуть число. Напишем функции, которые считают расстояние от точки до (0, 0) и от одной точки до другой:class Point: # тут другие функции, которые написали раньше def dist0(self): # расстояние от точки до (0,0) dx = self.x dy = self.y res = math.sqrt(dx*dx + dy*dy) return res # возвращаем число def dist(self, other): # расстояние от точки self до точки other dx = self.x dy = self.y res = math.sqrt(dx*dx + dy*dy) return res # возвращаем число
p2 = Point(30, 40, 'blue') p2.draw() d = p2.dist0() print('from (0,0) to ', p2, ' distance is ', d) p3 = Point(70, 70, 'green') p3.draw() d = p3.dist0() print(f'from (0,0) to {p3} distance is {d}') d = p2.dist(p3) print(f'from {p2} to {p3} distance is {d}')
Функция возвращает новую точку
Функция может вернуть не число, а новую точку (старая останется без изменений). Сравните метод move, который двигает саму точку и метод transform, который создает новую точку, а старая остается без изменений.class Point: # другие функции класса def move(self, dx): """ Двигаем точку на dx """ self.x = self.x + dx # изменяем саму точку def transform(self, dx): """ Двигаем точку на dx и получаем НОВУЮ ТОЧКУ """ res_point = Point(self.x + dx, self.y, self.col) # делаем новую точку return res_point
p3 = Point(70, 70, 'green') p3.draw() pnew = p3.transform(20) pnew.col = 'yellow' p3.col = 'lightgreen' pnew.draw() p3.draw()
Задача 2.1 Написать функцию
В выражении y = sin(x) функция sin(x) вычисляет и возвращает число. Это число записываем в y. Можно написать свою функцию f, которая будет вычислять и возвращать значение выражения 4*x2+3def f(x): res = 4*x*x + 3 # вычисляем результат return res # возвращаем результат # функция закончилась, можно ее использовать y = f(1) print(y) # напечатает 7 print(f(3)) # напечатает 39
def area(w, h): res = w*h # вычисляем результат return res # возвращаем результат # функция закончилась, можно ее использовать a, b = map(int, input().split()) s = area(a, b) # функция вернула результат, его сохранили в s print(s)
- Объем прямоугльного параллепипеда по его сторонам a, b, c.
- Площадь круга по его радиусу r.
- Площадь трапеции по длинам ее оснований a, b и высоте h.
- Площадь равностороннего треугольника со сторой а.
Задача 2.2
Написать функцию, которая делаетновую точку
- Проекция точки на ось Х pnew = p.toX()
- Проекция точки на ось У pnew = p.toY()
- Точка на половине расстояния от точки до точки (0,0) pnew = p.half()
- Точка посередине между точками p1 и p2 pnew = p1.middle(p2)
Задача 2.3
Напишем в файле data.txt координаты и цвет точек:3 -20 50 lightgreen 30 40 green 0 90 blue
def read_and_draw(): x, y, color = input().split() x = int(x) y = int(y) p = Point(x, y, color) print(p) p.draw() n = int(input()) for i in range(n): read_and_draw()
- Самую правую точку.
- Самую левую точку.
- Самую высокую точку.
- Самую низкую точку.
-- TatyanaDerbysheva - 11 Feb 2020
- grid example:
- point example: