gpt4 book ai didi

python - 我将如何优化这种圆点碰撞检测方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:06 28 4
gpt4 key购买 nike

我正在研究一个 python 方法,该方法应该返回两个接触圆的截取坐标(碰撞点)。该方法按预期工作,但就其目的而言似乎过于昂贵。

应该只有一个拦截点,并且这些圆圈的大小可以变化。

def getPointOfContact(self, body):
a1 = min(self.pos.x, body.pos.x) # The x value of the centre of the left-most circle
b1 = min(self.pos.y, body.pos.y) # The y value of the up-most circle
a2 = max(self.pos.x, body.pos.x) # The x value of the right-most circle
b2 = max(self.pos.y, body.pos.y) # The y value of the down-most circle
dx = a2-a1 # (Delta x) The difference in x positions
dy = b2-b1 # (Delta y) The difference in y positions
if dy == 0: # In case of no difference in y,
m = 0 # Gradient is "zero"
elif dx == 0: # In case of no difference in x,
m = float("inf") # Gradient is "infinity"
else:
m = dy/dx # Gradient
if a1 == self.pos.x: # Such that left-most circle's radius is used
r1 = (self.size.x)/2
else:
r1 = (body.size.x)/2
# Calculates the x position of intersection using trig
x = a1+(r1*math.cos(math.atan(m)))
if b1 == self.pos.y: # Such that up-most circle's radius is used
r1 = (self.size.x)/2
else:
r1 = (body.size.x)/2
# Calculates the y position of intersection using trig
y = b1+(r1*math.sin(math.atan(m)))
return (int(x), int(y)) # Returns the coordinates as a tuple of integers

实际的计算实际上相当简单。它只是将半径位移的 x 和 y 分量添加到圆心的坐标上。

问题在于,为了使计算有效,必须满足很多条件,即所使用的圆必须具有最小分量,并且半径 (r1) 与圆非常匹配。

是否有一种简化方法的方法,或者甚至是更便宜的技术?

提前致谢。

最佳答案

我不确定我是否明白。你有第一个圆的半径并且你假设它们完全相切,对吧?然后去掉你的 cossinatan:

d = sqrt(d1**2 + d2**2)
x = a1 + dx * r1 / d
y = b1 + dy * r1 / d

看看这个三角形,其中 + 是中心,* 是交点:

  0<-dx->|      
0 +
^ \ r1
| \
| * d = r1+r2 = sqrt(dx**2 + dy**2)
dy \
| \ r2
v \
- +

注1:如果m=dy/dx并且您尝试计算atan(m)那么您最好直接使用atan2(dy, dx)这将解决烦人的零和无穷大。

注 2:cos(atan(dy/dx))==dx/RR=sqrt(dx**2+dy**2) 和与 sindy 相同,因为 atan(dy/dx) 是满足 dx = R*cos(theta)< 的角度dy = R*sin(theta)

注 3:您将数据转换为 int,因此您的圆和交叉点可能会有点偏差。

关于python - 我将如何优化这种圆点碰撞检测方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479696/

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