Python中的圈扇形是否存在点

2024-06-02 09:44:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

p=精灵玩家位置

M=鼠标位置

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

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

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

S=与精灵方向相对应的圆截面。简单地说,如果M在S中,方向等于1

开始,结束=开始角度和结束角度

所以,在函数中,我插入了while循环。后来,我不得不计算半径是:

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

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

cpx,cpy=精灵玩家位置(X,Y)

我使用了math.hypot,多亏了这个(Link)。我加了20,这样半径就稍微超过了鼠标的位置。在

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

^{pr2}$

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

为了找出每个方向的起始角和结束角,我将重叠角除以方向数的两倍。然后我把结果减去/加上参考角。在

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


Tags: 函数玩家半径linkmath鼠标方向精灵
1条回答
网友
1楼 · 发布于 2024-06-02 09:44:04

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

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

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

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

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

^{pr2}$

二维向量A和B的dot product可以通过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)

相关问题 更多 >