Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import matplotlib.pyplot as plt
- import numpy as np
- def isCross(a1, a2, b1, b2):
- #представление точек в координатах
- x1a, y1a, x2a, y2a, x1b, y1b, x2b, y2b = a1[0], a1[1], a2[0], a2[1], b1[0], b1[1], b2[0], b2[1]
- def div(a, b): # проверка деления на 0
- if b != 0:
- return a / b
- else:
- return ...
- def normir(A, B, C): # функция нормирования
- if A != 0:
- A, B, C = 1.0, B / A, C / A
- else:
- A, B, C = A / B, 1.0, C / B
- return A, B, C
- # Ax+By+C=0 нормированое уравнение прямой в общем виде
- Aa, Ba, Ca = normir(y1a - y2a, x2a - x1a, x1a * y2a - x2a * y1a)
- Ab, Bb, Cb = normir(y1b - y2b, x2b - x1b, x1b * y2b - x2b * y1b)
- if div(Aa, Ba) == div(Ab, Bb): # прямые параллельны
- # Если лежат на одной прямой и накладываются
- return (Ca == Cb) and ((x1b <= x1a <= x2b and y1b <= y1a <= y2b) or (x1b <= x2a <= x2b and y1b <= y2a <= y2b))
- # Решение системы уравний прямых
- Mtrx = np.array([[Aa, Ba], [Ab, Bb]])
- Carr = np.array([-Ca, -Cb])
- x, y = np.linalg.solve(Mtrx, Carr)
- # Если точка пересечения пренадлежит первому отрезку
- return x1a <= x <= x2a and y1a <= y <= y2a
- #двумерный массив точек фигуры
- fig1=np.array([[1,1],[1,5],[5,5],[5,1],[4,0]])
- fig2=np.array([[0,0],[0,3],[3,3],[3,0]])
- #Цикличный сдвиг массива на единицу
- fir1=np.roll(fig1,-2)
- fir2=np.roll(fig2,-2)
- cross = False
- for i in range(len(fig1)):
- if cross:
- break
- for j in range(len(fig2)):
- if isCross(fig1[i],fir1[i],fig2[j],fir2[j]):
- cross = True
- break
- if cross:
- print('фигуры пересекаются')
- else:
- print('фигуры не пересекаются')
- plt.scatter(x = fig1[...,0],y = fig1[...,1])
- plt.scatter(x = fig2[...,0],y = fig2[...,1])
- plt.show()
Add Comment
Please, Sign In to add comment