2014-08-28 2 views
2

У меня есть следующий код, который генерирует x_d и x_y. Затем я хочу добавить или вычесть эти значения из последних вычисленных значений x и y (возвращается из config.get_last_point()) и сохранить их в последней точке.Python: если значение изменения состояния

def generate_asv_configuration(
     asv_count, generate_left_concavity, corner_angle=None): 
    # Create a configuration 
    config = Configuration(generate_left_concavity) 

    for i in range(2, asv_count): 
     # Calculate the angle to be used in the calculations 
     turning_angle = turning_angle - delta_angle 

     # Calculate the delta-x, and -y. 
     x_d = MAX_BOOM_LENGTH * math.cos(turning_angle) 
     y_d = MAX_BOOM_LENGTH * math.sin(turning_angle) 

     # print generate_left_concavity 
     if (i % 2) == 0: 
      print '1: Left, i: {0}'.format(i) 
      x = config.get_last_point()[0] - x_d 
      y = config.get_last_point()[1] - y_d 
     else: 
      print '2: Right, i: {0}'.format(i) 
      x = config.get_last_point()[0] + x_d 
      y = config.get_last_point()[1] + y_d 
     config.add_point((x, y)) 

Проблема у меня в том, что код генерирует изображение, аналогичное this one. Это выглядит хорошо, разные точки имеют разные углы (вы можете видеть, что некоторые из них почти закрыты, другие очень открыты). Однако, когда я меняю первый if на (i % 2) == 0 and generate_left_concavity, и я называю это generate_left_concavityTrue, я думаю, что-то похожее на this image. Проблема в том, что существуют действительно открытые полигоны.

К сожалению, я пробовал несколько разных условий, и всякий раз, когда у меня есть условие generate_left_concavity, оно всегда генерируется по-разному. Я даже опробовал вложенные условия if.

Я считаю, что я даже попробовал иметь вышеуказанные два условия, затем в более позднем состоянии, я проверяю if generate_left_concavity, если это так, я добавляю 2 * x_d для компенсации. Он по-прежнему генерирует изображения, похожие на this one.

Я не вижу, насколько мой код может напрямую повлиять на генерацию вычислений x и y на основе состояния if, но я мог ошибаться. Однако я могу гарантировать, что они всегда входят в одну ветвь с условием, но порождают по-разному.

+0

Что произойдет, если вы используете '(i% 2) == 0 и True'? Что произойдет, если вы используете '((i% 2) == 0) и True'? –

+0

Когда вы создаете '' 'config''',' '' generate_left_concavity''' влияет на последовательность точек, с которых начинается? – wwii

+0

Я не уверен, что я действительно понимаю разницу между предполагаемым выходом и выпущенным решением. Мне кажется, что-то с углами слишком широкие или узкие. Однако, просто глядя на код, в потоке, похоже, есть асимметрия. 'turn_angle = turn_angle - delta_angle' всегда выполняется вне условного выражения, в то время как внутри условной одной ветви добавляется, а другая вычитается. –

ответ

0

Я смотрел на немного больше, и получается, что, когда я пытаюсь создать левые вогнутости открытого полигон, диапазон углов, которые возможны разные по возможные углы для открытого многоугольника с правой вогнутостью. Как только я узнал, что если я найду минимальные/максимальные разрешенные углы для вогнутости, которые я создаю, это был правильный выбор угла в границах, поэтому, генерируя то, что я хочу :) Спасибо всем за помощь и руководство!

0

Не совсем ответ, но: Если я думаю, что что-то странное происходит в условном выражении, я стараюсь сделать как можно более условные сюиты, чтобы устранить или разделить возможный код проблемы. Ваш может быть переработано:

 if (i % 2) == 0: 
      print '1: Left, i: {0}'.format(i) 
      x_d, y_d = -x_d, -y_d 
     else: 
      print '2: Right, i: {0}'.format(i) 
     x = config.get_last_point()[0] + x_d 
     y = config.get_last_point()[1] + y_d 
+0

Спасибо за подсказку! Я изменил свои условия, чтобы быть как ваш, это намного легче читать на самом деле :) Несмотря на то, что это не устранило проблему, я прокомментировал это выше :) – Brandon

Смежные вопросы