歌者文明清理员 发表于 2023-7-27 15:45:23

hellomyprogram 发表于 2023-7-27 15:40
啊?

这好像在动吧……

?我这好像也动了

似乎是修了一个 bug 这个就自动好了

hellomyprogram 发表于 2023-7-27 15:46:57

歌者文明清理员 发表于 2023-7-27 15:45
?我这好像也动了

似乎是修了一个 bug 这个就自动好了

啊这

歌者文明清理员 发表于 2023-7-27 15:50:31

hellomyprogram 发表于 2023-7-27 15:46
啊这

这个太阳系是真的不稳定……

JasonChencCjj 发表于 2023-7-27 16:08:25

我看看我看看

cjjJasonchen 发表于 2023-7-27 16:23:37

我把这个设置成False 或者True 都没见着太阳动啊

歌者文明清理员 发表于 2023-7-27 16:26:31

hellomyprogram 发表于 2023-7-27 15:46
啊这

另外 itertools.combinations 我这样改就……
def move(t):
    sprites_to_delete = []
    for sprite1, sprite2 in itertools.combinations(sprites, 2):
      x1, y1, vx1, vy1, m1 = sprite1.info
      ax1, ay1 = 0, 0
      x2, y2, vx2, vy2, m2 = sprite2.info
      dx = x2 - x1
      dy = y2 - y1
      r = get_distance(sprite1, sprite2)
      if is_collide(sprite1, sprite2):
            heavier = sprite1 if sprite1.mass > sprite2.mass else sprite2
            lighter = sprite2 if heavier is sprite1 else sprite1
            sprites_to_delete.append(lighter)
            heavier.vx += lighter.vx
            heavier.vy += lighter.vy
            message.text = language["star"]["collide"] % (heavier, lighter)
            Thread(target=disappear_message).start()
            break
      f = G * m1 * m2 / (r ** 2)
      if isclose(f, 0):
            continue
      accel = f / m1
      ax1 += accel * (dx / r)
      ay1 += accel * (dy / r)
      x, y = (
            x1 + vx1 * t + 0.5 * ax1 * (t ** 2),
            y1 + vy1 * t + 0.5 * ay1 * (t ** 2)
      )
      tempx, tempy = sprite1.x, sprite1.y
      if True:
            sprite1.x, sprite1.y = x, y
            sprite1.vx = (x - tempx) / t
            sprite1.vy = (y - tempy) / t
      sprite1.flush()
    for sprite in sprites_to_delete:
      sprites.remove(sprite)
    for sprite in sprites:
      sprite.add_to_trail()

hellomyprogram 发表于 2023-7-27 16:33:45

本帖最后由 hellomyprogram 于 2023-7-27 16:38 编辑

试试itertools.product(sprites, 2)?

歌者文明清理员 发表于 2023-7-27 16:35:52

hellomyprogram 发表于 2023-7-27 16:33
试试itertools.product?

Traceback (most recent call last):
File "E:\Python123\k\main.py", line 179, in <module>
    move(2)
File "E:\Python123\k\main.py", line 71, in move
    for sprite1, sprite2 in itertools.product(sprites, 2):
TypeError: 'int' object is not iterable

hellomyprogram 发表于 2023-7-27 16:38:12

那itertools.permutations(sprites, 2)?

歌者文明清理员 发表于 2023-7-27 16:40:14

hellomyprogram 发表于 2023-7-27 16:38
那itertools.permutations(sprites, 2)?

hellomyprogram 发表于 2023-7-27 16:41:01

是太阳质量不够吗?

hellomyprogram 发表于 2023-7-27 16:41:59

能给我一下simulation文件吗

歌者文明清理员 发表于 2023-7-27 16:42:25

hellomyprogram 发表于 2023-7-27 16:41
是太阳质量不够吗?

够的,如果是原来的嵌套循环的话一切正常

歌者文明清理员 发表于 2023-7-27 16:43:08

hellomyprogram 发表于 2023-7-27 16:41
能给我一下simulation文件吗

[
    #    name       radius color   x    y    vx vy   mass locked
    Star("sun",   50,    "yellow", 500, 500, 0, 0,   1e4, True),
    Star("mercury", 3,   "gray",   600, 500, 0, -16,   1),
    Star("venus",   4.5,   "orange", 630, 500, 0, -15,   1.7),
    Star("earth",   5,   "blue",   690, 500, 0, -12,   1.7),
    Star("mars",    4,   "red",    720, 500, 0, -11.5, 1.3)
]

hellomyprogram 发表于 2023-7-27 17:02:34

发现这里用itertools的问题了:
使用itertools每两个星球之间就会计算一次距离,而使用嵌套循环要等到一个星球的加速度计算完之后才计算移动的距离,因此itertools算的距离会多数倍。
但是目前我还没有解决办法,建议回滚到上一个使用嵌套循环的版本……

歌者文明清理员 发表于 2023-7-27 22:22:19

hellomyprogram 发表于 2023-7-27 17:02
发现这里用itertools的问题了:
使用itertools每两个星球之间就会计算一次距离,而使用嵌套循环要等到一个 ...

我还没 commit 呢
页: 1 [2]
查看完整版本: python 问题