Продолжая цикл while над набором точек после достижения значения None - PullRequest
0 голосов
/ 07 июля 2019

У меня есть код, над которым я работаю, чтобы отследить фигуру вокруг облака точек. В сущности, у меня есть цикл while, который проверяет, равна ли next_point начальной точке, а если нет, обновляет current_point и next_point.

Изначально мне нужно было выполнить код как рекурсию как таковой:

 def recur(self, p):
 """
 @params p: [2x2] ndarray defining a vector to measure angle from
 self.next_point: the next point that the loop will travel to next
 self.start: the start point of the loop. [2x2] ndarray defining a starting  line  
 self.k: number of neighbors to search for further in the code (needs to be updated when self.next_point is None
 self.
 new_vect: line connecting current and next_point to use as next angle reference
"""                                                                                  
        current_point = p[0]                                                                              
        next_point = self.get_next_point(p)                                                               
        if next_point is None:                                                                            
            self.k+=1                                                                                                                                                                     
            self.recur(p)                                                                                                                                             
        elif next_point[0] == self.start[0] and next_point[1] == self.start[1]:                     
            print("DONE!")                                                                                
            return None                                                                                   
        else:                                                                                             
            new_vect = np.concatenate([[next_point, current_point]])                                                                                                                   
            self.n+=1                                                                                                                                                   
            self.recur(new_vect)                                                                          
        return self.line

Это сработало для небольших наборов данных, но я достиг предела рекурсии для большого набора данных, который мне действительно нужен для этого.

Поэтому я попытался переписать это с помощью цикла while, и он в основном работает до тех пор, пока я не достиг точки, где next_point равен None (get_next_point возвращает None, потому что ни один из соседей, через которые он проходит, не удовлетворяет необходимым условиям). В этом случае, как и в приведенной выше рекурсии, мне нужно обновить k на 1 (количество соседей для поиска), а затем снова попробовать эту же точку.

def loop(self, start):                                                                               
        self.current_vect = start                                                                         
        self.current_point = start[0]                                                                                                                
            while self.next_point[0] != self.start[0][0] or self.next_point[1] != self.start[0][1]:       │
                self.next_point = self.get_next_point(self.current_vect)                                                                           
                self.new_vect = np.concatenate([[self.next_point, self.current_point]])                                                                                            
                self.current_vect = self.new_vect                                                         
                self.current_point = self.next_point                                                                                                                
        print("DONE!")

Как только цикл достигает следующей точки, которая равна None, цикл завершается сбоем, поскольку он не может сравнить None с начальной точкой. У меня проблемы с этой последней частью цикла while, и я надеялся, что кто-нибудь сможет подтолкнуть меня в правильном направлении. Есть ли способ, которым я могу обновить k и затем продолжить цикл while в той же точке? Например, если self.current_point = ([1,2]) и get_next_point (current_point) возвращает None, мне нужно обновить k и запустить get_next_point для той же точки ([1,2]).

Спасибо

1 Ответ

0 голосов
/ 07 июля 2019

Вы должны передать цикл для значений None.

, например:

#this variation will print the statement
x="some_value"
if x:
    print("i am here")

#this variation wont print the statement

x=None
if x:
    print("i am here")

, поэтому вы должны сделать что-то вроде

if list_x:
    #start your loop
    for i in ...
else:
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...