gpt4 book ai didi

python - 用Python检查圆扇形中是否存在一个点

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:05 27 4
gpt4 key购买 nike

我知道在网上和这里已经有人问过这个问题,但不幸的是不是在 Python 环境中。在网上查找时,我发现了这个 ( Link ) 并从那里开始研究它。因为我使用的是 Pyglet,所以我将函数编写为线程。但首先,我向您展示我的想法和想要实现的目标:

enter image description here

P = Sprite 玩家位置

M = 鼠标位置

C = 一个假想的圆,其半径为 P 和 M 之间的距离。

0, 1, 2, 3, 4, 5, 6, 7 = Sprite 可以有的方向

a = 一个方向与另一个方向之间的角度 = 45°

S = 与 Sprite 方向对应的圆截面。简单来说,如果S中存在M,则方向等于1

start, end = 开始角和结束角

因此,在函数中,我插入了一个 while 循环。后来,我不得不计算当半径是:

while mpc_thread:
radius = math.hypot(mpx - cpx, mpy - cpy) + 20

mpx, mpy = 鼠标位置 (X, Y)

cpx, cpy = Sprite Player Position (X, Y)

由于这个 (Link),我使用了 math.hypot。我加了20,让半径稍微超出了鼠标的位置。

然后我添加了一个 for 循环来检查每个方向的圆部分:

while mpc_thread:
radius = math.hypot(mpx - cpx, mpy - cpy) + 20
for ang_obj in range(0, fchar):
reference_angle = 360 // fchar * ang_obj
s_angle = reference_angle - (360 / (fchar / 2))
e_angle = reference_angle + (360 / (fchar / 2))

fchar = Sprite 方向的数量,在本例中为 8

为了找出每个方向的起始角和结束角,我将搭接角除以方向数的两倍。然后我将结果减去/添加到引用角度。

问题从这里开始。以我发布第一个链接的方式编写,if 函数没有检测到任何东西,如果我出现负数 (,我得到一个错误。然后我搜索了一个解决方案,并从 user7048690 的答案中找到了这个 ( Link ) . 修改了函数,又遇到了新问题(数学域错误),所以我把math.sqrt改成cmath.sqrt,成功了。但是又出现了新问题出现。也就是说,始终遵循该答案,if 函数将 FPS 大幅降低到 0/1。现在我不知道该去哪里。你能帮我解决这个问题吗?我应该如何正确构建函数并正常工作?我希望我明白我的问题的意思。

最佳答案

找到最佳方向的最简单方法是计算从玩家位置到鼠标位置的直线与从玩家位置到 8 个点的直线之间夹角的余弦值。
必须找到与“鼠标”方向成最小角度的方向向量。0度的余弦为1,180°的余弦为-1。所以余弦最大的方向就是要找的方向。

计算余弦的最简单方法是 dot product .

一般来说,两个向量的积等于两个向量之间夹角的余弦乘以两个向量的大小(长度)。

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

因此,2 个单位向量的积等于这 2 个向量之间夹角的余弦,因为单位向量的长度为 1。

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )

dot product二维向量 A 和 B 可以通过 2 次乘法和 1 次加法计算:

dotAB = Ax * Bx + Ay * By  

设置一个包含 8 个标准化方向的列表:

dir = [(0, 1), (0.707, 0.707), (1, 0), (0.707, -0.707),
(0, -1), (-0.707, -0.707), (-1, 0), (-0.707, 0.707)]

找到“最佳”方向,即角度最近或角度余弦最大的方向:

dx, dy = mpx - cpx, mpy - cpy
max_i = max([i for i in range(len(dir))], key = lambda i: dx*dir[i][0] + dy*dir[i][1])

最后 max_i 包含搜索的方向。

请注意,该算法不会计算和比较角度的余弦值,它会比较余弦值和半径的乘积。 dx*dir[i][0] + dy*dir[i][1] 等于 radius * cos(alpha)

最终搜索到的点是:

radius = math.hypot(mdir_x, mdir_y) + 20
X = (dir[max_i][0] * radius, dir[max_i][1] * radius)

关于python - 用Python检查圆扇形中是否存在一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55501123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com