Раздел «Язык Си».PythonOOPSegment:

Класс 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