Python:如果条件改变值

2 投票
2 回答
2786 浏览
提问于 2025-04-18 18:50

我有一段代码,它生成了两个值,x_dx_y。接下来,我想把这些值加到最后计算出来的 x 和 y 上(这些值是通过 config.get_last_point() 得到的),然后把结果存储为最新的点。

 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_concavity 设置为 True 时,生成的图像就像 this image。问题是,这样生成的多边形真的很开放。

不幸的是,我尝试了几种不同的 if 条件,每当我在条件中使用 generate_left_concavity 时,生成的结果总是不同。我甚至尝试了嵌套的 if 条件。

我相信我还尝试过先使用上面的两个条件,然后在后面的条件中检查 if generate_left_concavity,如果是这样,我就加上 2 * x_d 来进行补偿。但结果仍然生成了类似于 this one 的图像。

我不明白我的代码中有什么部分会直接影响 x 和 y 的计算,基于一个 if 条件,但我可能错了。不过,我可以保证的是,它们总是进入同一个条件分支,但生成的结果却不同。

2 个回答

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

我进一步研究了一下,发现当我想生成一个左凹的开放多边形时,能用的角度范围和生成一个右凹的开放多边形时的角度范围是不一样的。一旦我找到了我想生成的凹形所允许的最小和最大角度,它就能在这个范围内正确选择一个角度,从而生成我想要的形状 :) 感谢大家的帮助和指导!

撰写回答