Я делаю программу с выпуклой оболочкой, используя jarvis march
.
Моя проблема в том, что у меня есть формула, использующая правило правой руки, поэтому мне нужно 4 переменные (начальная точка, следующая точка, третья-х, третья-у) для формулы.Я планирую перебрать значения из списка заданных точек.Так что каждый цикл while, который у меня есть, - это способ итерации значений.
Проблема в том, что когда я создаю новый список в каждый момент времени, который я буду использовать для итерации каждой переменной, я использую .remove()
, что приведет к отсутствиюдиапазон индексов, когда я запускаю его.Я знаю, что неправильно использовать .remove()
в цикле, но я не могу найти способ решить эту проблему.
Я видел много проблем с выпуклой оболочкой, но я хочу остаться с моей идеей, так как я все еще учусь.
import math
a = [[1,2], [5,8], [-9,2], [0,-9], [4,0], [0,-4], [-1,-1]]
def orient(xa, ya, xb, yb, xc, yc):
u=(yb-ya)*(xc-xb)-(yc-yb)*(xb-xa)
if (u<0):
return (1)
if (u==0):
return (0)
if (u>0):
return (-1)
l2=1
l3=1
l4=1
i=0
k=0
b=-1
ppoint=[]
startpoint=[-9,2]
while l2>0:
a1=a
a1.remove(startpoint)
q=a1
while l3>0:
t=q
nextpoint=t[k]
t.remove(nextpoint)
n=t
while l4>0:
thirdx=n[i][0]
thirdy=n[i][1]
if orient(startpoint[0],startpoint[1],nextpoint[0],nextpoint[1],thirdx,thirdy)>0:
i+=1
l4+=1
if i==len(n):
ppoint.append(nextpoint)
print (ppoint)
k+=1
i=0
break
elif orient(startpoint[0],startpoint[1],nextpoint[0],nextpoint[1],thirdx,thirdy)<0:
k+=1
i=0
break
if k==len(q):
startpoint=a[b]
b+=1
break
if b==len(a):
break
print (ppoint)