python - 在Python中创建曲率动画

标签 python math motion

我已经面临一个问题两周了,但我仍然不知道从哪里开始。问题在于创建一个关于两个点相互追逐的曲率动画。其中一个在 x 轴上沿直线移动,另一个从 x 轴向下开始(在 y 轴上,例如 p(0:-10)),根据追逐原理,第二个尝试不断面对第一个并捕获它。我编写了一些代码来帮助我获得实际答案,但我无法以非常宝贵的方式将其可视化。我使用 python 作为我的主要编码语言。

提前谢谢您 卢卡·K.

最佳答案

看起来像enemy following player上周被要求 tkinterpygame

enter image description here

计算对象之间的向量

diff_x = player_x - enemy_x
diff_y = player_y - enemy_y

和距离

distance = (diff_x**2 + diff_y**2)**0.5  # Pythagoras: a**2 + b**2 = c**2

计算归一化向量(长度为 1 的向量)

normal_x = diff_x/distance
normal_y = diff_y/distance

你可以乘以speed计算move_xmove_y对于 enemy

enemy_move_x = enemy_speed * normal_x
enemy_move_y = enemy_speed * normal_y

你可以用它来移动enemy并画线。

<小时/>

要绘制它,您可以使用不同的模块 - 任何 GUI 框架,如 tkinter , PyQt , wxPython或游戏/媒体库,如 ​​pygamepyglet 。最终您可以生成可用于创建动画 GIF 的图像。

<小时/>
import tkinter as tk

def follow(player_x, player_y, enemy_x, enemy_y, enemy_speed=5):
    diff_x = player_x - enemy_x
    diff_y = player_y - enemy_y

    distance = (diff_x**2 + diff_y**2)**0.5  # Pythagoras: a**2 + b**2 = c**2

    if distance <= enemy_speed:
        return diff_x, diff_y

    normal_x = diff_x/distance
    normal_y = diff_y/distance

    enemy_move_x = enemy_speed * normal_x
    enemy_move_y = enemy_speed * normal_y

    return enemy_move_x, enemy_move_y

def update_game():
    global player_x
    global player_y
    global enemy_x
    global enemy_y

    # draw line for player
    canvas.create_line(player_x, player_y, player_x+player_move_x, player_y+player_move_y, fill='green')

    # move player
    player_x += player_move_x
    player_y += player_move_y
    canvas.move(player_id, player_move_x, player_move_y)

    # calculate move for enemy
    enemy_move_x, enemy_move_y = follow(player_x, player_y, enemy_x, enemy_y, enemy_speed)

    # draw line for enemy
    canvas.create_line(enemy_x, enemy_y, enemy_x+enemy_move_x, enemy_y+enemy_move_y, fill='red')

    # move enemy
    enemy_x += enemy_move_x
    enemy_y += enemy_move_y
    canvas.move(enemy_id, enemy_move_x, enemy_move_y)

    root.after(100, update_game) # repeate after 100ms (0.1s)

# --- main ---

# player start position and move ("speed")
player_x = 5
player_y = 50
player_move_x = 4
player_move_y = 0 # try for `1`

# enemy start position and speed
enemy_x = 5
enemy_y = 500
enemy_speed = 5

root = tk.Tk()

canvas = tk.Canvas(root, width=750, height=500)#, bg='gray')
canvas.pack()

player_id = canvas.create_oval(player_x-5, player_y-5, player_x+5, player_y+5, fill='green')
enemy_id = canvas.create_oval(enemy_x-5, enemy_y-5, enemy_x+5, enemy_y+5, fill='red')

update_game()

root.mainloop()
<小时/>

顺便说一句:回答问题How to make enemy follow player你有相同的代码,但你必须使用键 WASD 移动玩家而且它不画线。

关于python - 在Python中创建曲率动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59836541/

相关文章:

python - 在 ffmpeg 中使用 xfade 缩放视频时出错

python - Celery - 如何通过任务 id 获取任务名称?

algorithm - TSP优游

math - float 学有问题吗?

jquery - 使用单独的元素更改 div onClick 的类

android - 在 Android 的 ViewGroup 的 onInterceptTouchEvent 方法中检测到 MotionEvent.ACTION_POINTER_DOWN?

python - asyncio 如何安排文件系统统计操作?

python - 如果 py.test 的另一个测试失败,我该如何跳过测试?

使用小数类型的 C# 百分比计算会导致问题

c++ - Ease of Motion函数(Ease to number)C++