Этот код принимает A и B как две вершины и проверяет, лежит ли соединяющая их линия полностью внутри, частично внутри или полностью вне многоугольника.Это основано на математическом факте, что для строки с уравнением.F (X, y): Ax + By + C точка x1, y1 будет лежать на прямой, если F (x1, y1) = 0 на одной стороне линии, если F (x1, y1)> 0 на другой стороне линииесли F (x1, y1) <0 </p>
L=[] #list of all the vertices of the polygon as (x,y) tuples in order
A=()
B=()
# A and B are tuples of coordinates of points joking diagonal to check
def eqn(A,B):
X1=A[0];Y1=A[1]
X2=B[0];Y2=B[1]
return(X2-X1,Y1-Y2,X1*Y2-X2*Y1)
def check(Y,X,C,y,x):
if(Y*y+X*X+C>0):
return 1
elif(Y*y+X*X+C<0):
return -1
else:
return 0
Y,X,C=eqn(A,B)
#get parameters of diagonal joining A and B
a=L.index(A)
b=L.index(B)
L1=[]
L2=[]
if(a>b):
L1=L[b+1:a]
L2=L[a+1:]+L[:b]
elif(b>a):
L1=L[a+1:b]
L2=L[b+1:]+L[:a]
#so I have split the list into two lists L1 and L2 containing vertices in cyclic order on either side of the diagonal
k=1
m=0
val1=check(Y,X,C,L1[0][1],L1[0][0])
val2=check(Y,X,C,L2[0][1],L2[0][0])
if(val1==val2):
k=0
m=1
else:
# I have to check F(x,y) for each point in list L1 and L2 it should be of one sign for all elements in L1 and of other sign for all elements in L2 for line to lie completely inside polygon
for t in L1:
if(check(Y,X,C,t[1],t[0])!=val1):
k=0
m=0
for s in L2:
if(check(Y,X,C,s[1],s[0])!=val2):
k=0
m=0
if(k==0):
print('the diagonal passes outside')
else:
print('the diagonal lies completely inside the polygon')
if(m==1):
print('the diagonal lies completely outside the polygon')
Я написал код, надеюсь, он работает как требуется, но возможны ошибки: o логика верна, возможно, у вас есть синтаксис или другие ошибкичтобы позаботиться (я могу помочь в этом случае) Я исключил один случай, если две выбранные точки являются последовательными, то это, очевидно, сторона многоугольника (тривиально проверить).