Класс Segment
Отрезок состоит из двух точек a и b.from grid import Grid import math g = Grid() 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}' return s # функция рисует точку. координаты точки в ящике self def draw(self): g.draw_dot(self.x, self.y, self.col) # двигаем точку на dx. Изменяе координаты точки, которые хранятся в ящике self def move(self, dx): self.x = self.x + dx # делаем НОВУЮ ТОЧКУ симметричную относительно оси Х def flipX(self): p = Point(self.x, -self.y, self.col) return p 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 - other.x dy = self.y - other.y res = math.sqrt(dx*dx + dy*dy) return res # возвращаем число # кончились отступы, закончился класс Point class Segment: def __init__(self, pa, pb, col): self.a = pa self.b = pb self.col = col def __repr__(self): s = f'[{self.a}, {self.b} ] {self.col}' return s def draw(self): g.draw_line(self.a.x, self.a.y, self.b.x, self.b.y, self.col) self.a.draw() self.b.draw() def length(self): # d = p1.dist(p2) d = self.a.dist(self.b) return d def move(self, dx): # двигаем сам отрезок self.a.move(dx) self.b.move(dx) def flipX(self): # возвращает новый отрезок newa = self.a.flipX() newb = self.b.flipX() news = Segment(newa, newb, self.col) return news # кончились отступы, закончился класс Segment # тут можно его использовать 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 p2 = Point(30, -10, 'blue') p2.draw() d = p1.dist(p2) print(f'distance between {p1} and {p2} = {d}') print('Теперь отрезок:') s1 = Segment(p1, p2, 'green') s1.draw() print(s1) ds1 = s1.length() print(f'length = {ds1}') s1.move(-100) s1.draw() print(s1) s2 = s1.flipX() s2.col = 'lightgreen' s2.draw() p0 = Point(-10, -20, 'darkred') p01 = p0.flipX() p01.col = 'pink' p0.draw() p01.draw() g.done()
Задачи
Задача 1. Длина проекции на оси Х и У
Вариант 1: Найти длину проекции на ось Х
d = s1.dx() print(d)
Вариант 2: Найти длину проекции на ось Y
d = s1.dy() print(d)
Задача 2. Сравнение отрезков
Сравнивать длину отрезков.Вариант 1: Отрезки одинаковой длины?
s1 == s2:
Вариант 2: Первый отрезок меньше второго?
s1 < s2:
Вариант 3: Первый отрезок больше второго?
s1 > s2:
Задача 3. Отобразить отрезок, создать новый
В задаче получаем НОВЫЙ отрезок.Вариант 1: Сделать проекцию на ось Х
s3 = s1.toX() s1.draw() s3.draw()
Вариант 2: Сделать проекцию на ось Y
s3 = s1.toY() s1.draw() s3.draw()
Вариант 3: Отобразить центрально симметрично относительно точки (0,0)
s3 = s1.to0() s1.draw() s3.draw()
-- TatyanaDerbysheva - 03 Mar 2020