Vector library


License
MIT
Install
pip install easyvec==0.0.23

Documentation

Быстрая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹

Данная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ основныС структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹ ΠΊΠ°ΠΊ для Π΄Π²ΡƒΡ…ΠΌΠ΅Ρ€Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ для Ρ‚Ρ€Ρ‘Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΉ. Написана Π½Π° cython, поэтому быстрая. Π›Π΅Π³ΠΊΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Установка

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ/ΠΏΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

pip install easyvec --upgrade

2d Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ основныС структуры 2d Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹:

2d структура easyvec-класс
Π’Π΅ΠΊΡ‚ΠΎΡ€/Ρ‚ΠΎΡ‡ΠΊΠ° Vec2
ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° 2Ρ…2 Mat2
ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ AABB Rect
Полигон/полилиния PolyLine

А Ρ‚Π°ΠΊΠΆΠ΅ ряд Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² для ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°ΠΌΠΈ, Π»ΡƒΡ‡Π°ΠΌΠΈ, линиями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ

Π’Π΅ΠΊΡ‚ΠΎΡ€/Ρ‚ΠΎΡ‡ΠΊΠ° Vec2

Поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ создания

from easyvec import Vec2

v1 = Vec2(1,2)
v2 = Vec2.from_list([1,2])
v3 = Vec2.from_list([0,-100,1,2,100], start_ind=2)
v4 = Vec2.from_dict({'x':1, 'y': 2})
v5 = Vec2.from_dict({'x':1, 'y': 2, 'some': 'data'})
v6 = Vec2(100,200) / 100
v7 = Vec2(100,200) - (99,198)
v8 = Vec2(0,1) + 1

# всС эти Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΈ Ρ€Π°Π²Π½Ρ‹ Vec2(1,2)

Доступ ΠΊ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

v1 = Vec2(1,2)
print(v1)            # (1.00, 2.00)
print(repr(v1))      # Vec2(1.0, 2.0)
print(v1.x)          # 1.0
print(v1.y)          # 2.0
print(v1[0])         # 1.0
print(v1[1])         # 2.0
print(v1['x'])       # 1.0
print(v1['y'])       # 2.0
print(v1.as_np())    # [1. 2.]
print(v1.as_tuple()) # (1.0, 2.0)
print(v1.to_dict())  # {'x': 1.0, 'y': 2.0}

x, y = v1
print(x, y)          # 1.0 2.0

for a in v1:
    print(a)         # 1.0
                     # 2.0
    
def foo(x, y):
    print(x, y)
    
foo(*v1)             # 1.0 2.0
foo(**v1)            # 1.0 2.0

Π’Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ/ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ/Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ/Π΄Π΅Π»ΠΈΡ‚ΡŒ/ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ/ΠΈ Ρ‚.ΠΏ. Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, со списками/ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ/numpy-массивами ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ числами:

v1 = Vec2(1,2)
v2 = -v1*10 + 20 
print(v2 == (10,0)) # True

v1 += 3
print(v1 != [4,5]) # False

Π§Ρ‚ΠΎ касаСтся спСцифичСских Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

v1 = Vec2(1,2)
v2 = Vec2(3,4)
print(v1.dot(v2))          # 11.0 - скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
print(v1*v2))              # 11.0 - Ρ‚ΠΎΠΆΠ΅ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
print(v1.cross(v2))        # -2.0 - Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
print(v1 & v2)             # -2.0 - Ρ‚ΠΎΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
print(v1.norm())           # (0.45, 0.89) - Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€
print(v1.norm().len())     # 1.0 - Π΄Π»ΠΈΠ½Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°
print(v1.rotate(3.14/2))   # (-2.00, 1.00) - ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° 90 градусов
print(v1.rotate(90, degrees=True))   # (-2.00, 1.00) - ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° 90 градусов Ρ‚ΠΎΠΆΠ΅
print(v1.angle_to(v2, degrees=True)) # -10.30... ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° 2Ρ…2 Mat2

Класс ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 2Ρ…2. Π‘Π»ΡƒΠΆΠΈΡ‚ для Π°Ρ„ΠΈΠ½Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Vec2

Поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ полоТСниям элСмСнтов: ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ создания ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

from easyvec import Mat2

m1 = Mat2(1,2,3,4)
m2 = Mat2((1,2),(3,4))
m3 = Mat2(Vec2(1,2), Vec2(3,4))
m4 = Mat2(Vec2(1,2),(3,4))
m5 = Mat2(-1,-2,-3,-4) + 2 * Mat2(1,2,3,4) 
m6 = Mat2([[1.0, 2.0], [3.0, 4.0]])

# всС эти ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΈ Ρ€Π°Π²Π½Ρ‹ Mat2([[1.0, 2.0], [3.0, 4.0]])

Доступ ΠΊ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

mat = Mat2(1,2,3,4)
print(mat)         # [[1.00, 2.00], [3.00, 4.00]]                           
print(repr(mat))    # Mat2([[1.0, 2.0], [3.0, 4.0]])
print(mat.m11, mat.m12, mat.m21, mat.m22) # 1.0 2.0 3.0 4.0
print(mat['m11'], mat['m12'], mat['m21'], mat['m22']) # 1.0 2.0 3.0 4.0
print(mat[0][1], mat[0][1], mat[1][0], mat[1][1]) # 1.0 2.0 3.0 4.0
print(mat[0,1], mat[0,1], mat[1,0], mat[1,1]) # 1.0 2.0 3.0 4.0
print(mat.T) # [[1.00, 3.00], [2.00, 4.00]]   - транспонированная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°
print(mat.det()) # ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
print(mat._1 * mat == Mat2.eye()) # True - обратная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° помноТСнная Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ равняСтся Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ

БпСцифичСский конструктор для ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°:

from easyvec import Mat2, Vec2

m = Mat2.from_angle(90, degrees=True)
v = Vec2(1,2)

# ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ (ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° 90 градусов ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки)
print(m * v)     # (2.00, -1.00)
print(m * (1,2)) # (2.00, -1.00)

ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ со сторонами, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ осям ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Rect

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ 4 поля с float числами: x1, y1, x2, y2. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ° (x1, y1) - ниТняя-лСвая, (x2, y2) - вСрхняя правая

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ создания:

from easyvec import Rect, Vec2

r1 = Rect(1, 2, 3, 4)
r2 = Rect([1, 2], [3, 4])
r3 = Rect([1,2,3,4])
r4 = Rect(Vec2(1,2), Vec2(3,4))
r5 = Rect.from_dict({'x1': 1, 'y1': 2, 'x2': 3, 'x3': 4})

# всС эти ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΈ Ρ€Π°Π²Π½Ρ‹ Rect(1.00, 2.00, 3.00, 4.00)

Π’Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ конструктор:

# Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, описанный Π²ΠΎΠΊΡ€ΡƒΠ³ мноТСства Ρ‚ΠΎΡ‡Π΅ΠΊ
r1 = Rect.bbox((1,2), (3,4), (1.5, 3)) 
r2 = Rect.bbox(Vec2(1,2), Vec2(3,4), Vec2(1.5, 3))
r3 = Rect.bbox([(1,4), Vec2(3,4), (1.5, 2)])

# всС эти ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΈ Ρ€Π°Π²Π½Ρ‹ Rect(1.00, 2.00, 3.00, 4.00)

Доступ ΠΊ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

r = Rect(1,2,3,4)
print(r)          # Rect(1.00, 2.00, 3.00, 4.00)                       
print(repr(r))    # Rect(1.00, 2.00, 3.00, 4.00)
print(r.x1, r.y1, r.x2, r.y2) # 1.0 2.0 3.0 4.0
print(r['x1'], r['y1'], r['x2'], r['y2']) # 1.0 2.0 3.0 4.0
print(r[0], r[1], r[2], r[3]) # 1.0 2.0 3.0 4.0

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСсСчСния/объСдинСния:

r1 = Rect(1,2,3,4)
r2 = Rect(2,3,4,5)
r3 = Rect(10,20,30,40)

print(r1.is_intersect_rect(r2))  # True   - ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π»ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ
print(r1 * r2)                   # Rect(2.00, 3.00, 3.00, 4.00) - ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ
print(r1 + r2)                   # Rect(1.00, 2.00, 4.00, 5.00)  - описанный ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

print(r1.is_intersect_rect(r3))  # False
print(r1 * r3)                   # Rect(0.00, 0.00, 0.00, 0.00)
print((r1 * r3).is_null())       # True
print(r1 + r3)                   # ect(1.00, 2.00, 30.00, 40.00)

Π’Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

r1 = Rect(1,2,3,4)
r2 = Rect(2,3,4,5)

print(r1.area())       # 4.0  ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ 
print(r1.perimeter())  # 8.0  ΠŸΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€

p1 = Vec2(0,0)
p2 = (2, 3)
print(r1.intersect(r2) )   # Rect(2.00, 3.00, 3.00, 4.00) пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²
print(r1.intersect((p1,p2)) ) # (1.33, 2.00) пСрСсСчСниС c ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ (p1,p2)
print(r1.intersect(p1,p2) )   # (1.33, 2.00) пСрСсСчСниС c ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ (p1,p2)
print(r1.intersect((p1,p2)))  # (1.33, 2.00) пСрСсСчСниС c ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ (p1,p2)
print(r1.intersect(s=(p1,p2)))  # (1.33, 2.00) пСрСсСчСниС c ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ (p1,p2)
print(r1.intersect(r=(p1,p2)) ) # (1.33, 2.00) пСрСсСчСниС c Π»ΡƒΡ‡ΠΎΠΌ (p1,p2)
print(r1.intersect(line=(p1,p2)) ) # (1.33, 2.00) пСрСсСчСниС c Π»ΠΈΠ½ΠΈΠ΅ΠΉ (p1,p2)

Полигон/полилиния PolyLine

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ 3 поля:

  • vecs - list[Vec2] - список ΠΈΠ· Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°
  • enclosed - [bool] - Ρ„Π»Π°Π³, являСтся Π»ΠΈ полилиния Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠΉ
  • bbox - Rect - описанный Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ создания:

from easyvec import PolyLine

pg1 = PolyLine([(1,2), (3,4), (2,5)])  
pg2 = PolyLine([(1,2), (3,4), (2,5)], enclosed=True)  
pg3 = PolyLine([Vec2(1,2), Vec2(3,4), Vec2(2,5)], copy_data=False)  
pg4 = PolyLine.from_dict({'vecs': [{'x': 1, 'y': 2}, {'x':3, 'y':4}, {'x': 2, 'y': 5}], 'enclosed': False})

Π˜ΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

имя Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚
copy() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°
clone() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°
to_dict Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ прСдставлСниС ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π° Π² Π²ΠΈΠ΄Π΅ словаря
is_in(self, Vec2 point) провСряСт, находится Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°
transform(self, Mat2 m) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ исходных Ρ‚ΠΎΡ‡Π΅ΠΊ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ Mat2 m
add_vec(self, Vec2 v) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ смСщСниСм исходных Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ v
get_area(self, bint always_positive=True) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°
get_center_mass(self) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ Ρ†.ΠΌ. ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π° (ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ считаСтся с Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΏΠΎ ΠΏΠΎΠ»Ρ‰Π°Π΄ΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ)
get_Iz(self, Vec2 z_point) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ½Π΅Ρ€Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ оси, проходящСй Ρ‡Π΅Ρ€Π΅Π· z_point ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ пСрпСндикулярно плоскости xy (ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ считаСтся с Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΏΠΎ ΠΏΠΎΠ»Ρ‰Π°Π΄ΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ массой = 1)
is_selfintersect(self) ΠŸΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ сам сСбя
intersect_line(self, Vec2 p1, Vec2 p2, bint sortreduce=True) Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ Π»ΠΈΠ½ΠΈΠΈ. sortreduce - Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ Ρ€Π°ΡΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΡ‚ p1
intersect_ray(self, Vec2 p1, Vec2 p2, bint sortreduce=True) Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ Π»ΡƒΡ‡Π°. sortreduce - Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ Ρ€Π°ΡΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΡ‚ p1
intersect_segment(self, Vec2 p1, Vec2 p2, bint sortreduce=True) Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°. sortreduce - Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ Ρ€Π°ΡΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΡ‚ p1

НСкоторыС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

from easyvec.geometry import intersect, closest, normalize_angle2pi, angle_between

# Ρƒ всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ докумСнтация:
print(intersect.__doc__)

    # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΡƒ пСрСсСчСния Π΄Π²ΡƒΡ… сущностСй (ΠΈΠ»ΠΈ None, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅ΠΊΠ°ΡŽΡ‚ΡΡ).
    # Π’ качСствС сущностСй ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ бСсконСчныС Π»ΠΈΠ½ΠΈΠΈ, Π»ΡƒΡ‡ΠΈ, ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ, Π΄ΡƒΠ³ΠΈ.
    # Бущности Π·Π°Π΄Π°ΡŽΡ‚ΡΡ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ проходят (ΠΊΡ€ΠΎΠΌΠ΅ Π΄ΡƒΠ³, ΠΎΠ½ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ, радиусом, ΠΈ двумя ΡƒΠ³Π»Π°ΠΌΠΈ).
    # К соТалСнию, ΠΏΠΎΠΊΠ° нСльзя Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС Π΄Π²ΡƒΡ… Π΄ΡƒΠ³(
    
    # ΠžΡ‚Ρ€Π΅Π·ΠΊΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - двумя ΠΊΡ€Π°ΠΉΠ½ΠΈΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°. И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: 
    #     'segment', 's', 'segment1', 's1', 'segment2', 's2',
    # Ρ‚Π°ΠΊΠΆΠ΅ Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ‹, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ для ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ². 
    
    # Π›ΡƒΡ‡ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ испускаСтся Π»ΡƒΡ‡, ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚. 
    # И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: 
    #     'ray', 'r', 'ray1', 'r1', 'ray2', 'r2'
    
    # БСсконСчныС Π»ΠΈΠ½ΠΈΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ линия. 
    # И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:
    #     'line', 'l', 'line1', 'l1', 'line2', 'l2'

    # Π”ΡƒΠ³Π° Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (ctnter, r, angle_from, angle_to) - Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ окруТности Π΄ΡƒΠ³ΠΈ, радиусом, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ. 
    # И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:
    #     'arc', 'a'


    # ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования:
    #     >>> p_intersect = intersect(p1, p2, p3, p4)                 # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, s=(p3, p4))           # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, segment=(p3, p4))     # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, s2=(p3, p4))          # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
        
    #     >>> p_intersect = intersect(s=(p1, p2), s2=(p3, p4))    # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(s1=(p1, p2), s2=(p3, p4))   # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(s=(p1, p2), segment=(p3, p4))# p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС Π΄Π²ΡƒΡ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² (p1, p2) ΠΈ (p3, p4)

    #     >>> p_intersect = intersect(p1, p2, ray=(p3, p4))          # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΡƒΡ‡Π° (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, r=(p3, p4))            # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΡƒΡ‡Π° (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, ray2=(p3, p4))         # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΡƒΡ‡Π° (p3, p4)
        
    #     >>> p_intersect = intersect(r1=(p1, p2), r2=(p3, p4))    # p_intersect Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π»ΡƒΡ‡Π΅ΠΉ (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(r1=(p1, p2), ray2=(p3, p4))  # p_intersect Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π»ΡƒΡ‡Π΅ΠΉ (p1, p2) ΠΈ (p3, p4)
    #     >>> p_intersect = intersect(s=(p1, p2), ray2=(p3, p4))   # p_intersect Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΡƒΡ‡Π° (p3, p4)

    #     >>> p_intersect = intersect(p1, p2, line=(p3, p4))         # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΠΈΠ½ΠΈΠΈ (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, l=(p3, p4))            # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΠΈΠ½ΠΈΠΈ (p3, p4)
    #     >>> p_intersect = intersect(p1, p2, l1=(p3, p4))           # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π»ΠΈΠ½ΠΈΠΈ (p3, p4)

    #     >>> p_intersect = intersect(p1, p2, a=(p3, r, a1, a2))     # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π΄ΡƒΠ³ΠΈ (p3, r, a1, a2)
    #     >>> p_intersect = intersect(p1, p2, arc=(p3, r, a1, a2))   # p_intersect Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° (p1, p2) ΠΈ Π΄ΡƒΠ³ΠΈ (p3, r, a1, a2)
    #     ΠΈ Ρ‚.Π΄.

    # Π’ качСствС p1, p2, p3, p4 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Vec2, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, списки, массивы.... Всё, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ [0] ΠΈ [1], возвращая ΠΏΡ€ΠΈ этом числа
    

print(closest.__doc__)

# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π° сущности ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅
#     Π’ качСствС сущности ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ бСсконСчныС Π»ΠΈΠ½ΠΈΠΈ, Π»ΡƒΡ‡ΠΈ, ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ.
#     Бущности Π·Π°Π΄Π°ΡŽΡ‚ΡΡ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ проходят
    
#     ΠžΡ‚Ρ€Π΅Π·ΠΊΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - двумя ΠΊΡ€Π°ΠΉΠ½ΠΈΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°. И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: 
#         'segment', 's', 'segment1', 's1', 'segment2', 's2',
#     Ρ‚Π°ΠΊΠΆΠ΅ Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ‹, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ для ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ². 
    
#     Π›ΡƒΡ‡ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ испускаСтся Π»ΡƒΡ‡, ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚. 
#     И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: 
#         'ray', 'r', 'ray1', 'r1', 'ray2', 'r2'
    
#     БСсконСчныС Π»ΠΈΠ½ΠΈΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ (p1, p2) - двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ линия. 
#     И ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:
#         'line', 'l', 'line1', 'l1', 'line2', 'l2'

#     Π—Π°Π΄Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ·Π°Π½Ρ‡ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:
#         'point', 'p'


#     ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования:
#         >>> p_nearest = closest(p1, p2, p)       # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ (p1, p2)
#         >>> p_nearest = closest(p1, p2, p=p)   # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ (p1, p2)
#         >>> p_nearest = closest(p1, p2, point=p)         # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ (p1, p2)
#         >>> p_nearest = closest(s=(p1, p2), p=p)       # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ (p1, p2)
#         >>> p_nearest = closest(segment=(p1, p2), p=p) # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ (p1, p2)

#         >>> p_nearest = closest(r=(p1, p2), p=p)       # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΡƒΡ‡Ρƒ (p1, p2)
#         >>> p_nearest = closest(ray=(p1, p2), p=p)     # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΡƒΡ‡Ρƒ (p1, p2)

#         >>> p_nearest = closest(line=(p1, p2), p=p)     # p_nearest Π΅ΡΡ‚ΡŒ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ "p", ΠΈ которая ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈΠ½ΠΈΠΈ (p1, p2)
#         ΠΈ Ρ‚.Π΄.

#     Π’ качСствС p1, p2, p ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Vec2, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, списки, массивы.... Всё, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ [0] ΠΈ [1], возвращая ΠΏΡ€ΠΈ этом числа



print(normalize_angle2pi.__doc__)

# Нормализвут ΡƒΠ³ΠΎΠ». ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΊ Π²ΠΈΠ΄Ρƒ  0 <= angle <= 2*pi


print(angle_between.__doc__)

    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ Π»ΡƒΡ‡, выходящий ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΏΠΎΠ΄ ΡƒΠ³Π»ΠΎΠΌ mid, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΡƒΠ³Π»Π°, ΠΎΠ±Ρ€Π°Π·Π°Π²Π°Π½Π½ΠΎΠ³ΠΎ двумя Π»ΡƒΡ‡Π°ΠΌΠΈ,
    # выходящими ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΏΠΎΠ΄ ΡƒΠ³Π»Π°ΠΌΠΈ start ΠΈ end. ΠžΠ±Π»Π°ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΡƒΠ³Π»Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π»ΡƒΡ‡Π° start Π΄ΠΎ Π»ΡƒΡ‡Π° end ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки 
    

ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ слСдуСт...