我在这个等式中做错了什么?
what am I doing wrong in this equation?
我想做一个函数,如果一个点在某个圆的外面,这个点移动到通过圆心的线与这个点相撞的点。代码:
def inside_circle(self, pos):
if ((pos[0]-self.pos[0])**2 + (pos[1]-self.pos[1])**2) <= teleport_range**2:
return "inside"#pos
else:
pente = (pos[1]-self.pos[1])/(pos[0]-self.pos[0])
origine = pos[1]-pente*pos[0]
A = pente**2 + 1
B = 2 * -self.pos[0] + (origine+self.pos[1])*pente*2
C = self.pos[0]**2 + (origine+self.pos[1])**2 - teleport_range**2
if pos[0] > self.pos[0]:
X = (-B + math.sqrt(B**2 - 4*A*C))/(2*A)
Y = pente * X + origine
return "outside bot"#(X,Y)
elif pos[0] < self.pos[0]:
X = (-B - math.sqrt(B**2 - 4*A*C))/(2*A)
Y = pente * X + origine
return "outside top"#(X,Y)
self.pos是圆心,pos是我要检查的点,都是tuple
pente 是线的倾斜度(抱歉是法语)
origin 是直线的 Y 原点(法语也是)
teleport_range是半径,常数300
我想要的实际 return 已评论以供测试
当我 运行 它时,如果它在圆圈内,一切都很好,但如果它在圆圈外,就会出现错误,因为它试图对负数求平方根
X = (-B + math.sqrt(B**2 - 4*A*C))/(2*A)
ValueError:数学域错误
二次方程的平方根只有在直线和圆没有碰撞点时才为负,但是直线经过圆心和一点,所以应该有两个碰撞点.
我知道当直线是一个常量时只能有一个碰撞点,但是当我理解为什么 (B**2 - 4*A*C) 不应该是负数时我会解决这个问题
我数学不好,如果有人能帮助我,请不要犹豫告诉我代码是否可以简化而不失去清晰度
谢谢:)
这里有一个更简单、更短、更清晰的方法来获得你想要的圆上的点。
theta = math.atan2(pos[0] - self.pos[0], pos[1] - self.pos[1])
X = self.pos[0] + teleport_range * math.cos(theta)
Y = self.pos[1] + teleport_range * math.sin(theta)
这段代码首先求出射线从圆心到点的倾斜角度。然后它使用该角度在圆上找到一个具有相同角度的点。
请注意,此代码甚至适用于圆内的点:它会找到与圆心成相同角度的圆上的点。如果该点是圆的中心,则所需的点是不明确的,但代码 returns 一个特定的点。
我想做一个函数,如果一个点在某个圆的外面,这个点移动到通过圆心的线与这个点相撞的点。代码:
def inside_circle(self, pos):
if ((pos[0]-self.pos[0])**2 + (pos[1]-self.pos[1])**2) <= teleport_range**2:
return "inside"#pos
else:
pente = (pos[1]-self.pos[1])/(pos[0]-self.pos[0])
origine = pos[1]-pente*pos[0]
A = pente**2 + 1
B = 2 * -self.pos[0] + (origine+self.pos[1])*pente*2
C = self.pos[0]**2 + (origine+self.pos[1])**2 - teleport_range**2
if pos[0] > self.pos[0]:
X = (-B + math.sqrt(B**2 - 4*A*C))/(2*A)
Y = pente * X + origine
return "outside bot"#(X,Y)
elif pos[0] < self.pos[0]:
X = (-B - math.sqrt(B**2 - 4*A*C))/(2*A)
Y = pente * X + origine
return "outside top"#(X,Y)
self.pos是圆心,pos是我要检查的点,都是tuple
pente 是线的倾斜度(抱歉是法语)
origin 是直线的 Y 原点(法语也是)
teleport_range是半径,常数300
我想要的实际 return 已评论以供测试
当我 运行 它时,如果它在圆圈内,一切都很好,但如果它在圆圈外,就会出现错误,因为它试图对负数求平方根
X = (-B + math.sqrt(B**2 - 4*A*C))/(2*A) ValueError:数学域错误
二次方程的平方根只有在直线和圆没有碰撞点时才为负,但是直线经过圆心和一点,所以应该有两个碰撞点.
我知道当直线是一个常量时只能有一个碰撞点,但是当我理解为什么 (B**2 - 4*A*C) 不应该是负数时我会解决这个问题
我数学不好,如果有人能帮助我,请不要犹豫告诉我代码是否可以简化而不失去清晰度
谢谢:)
这里有一个更简单、更短、更清晰的方法来获得你想要的圆上的点。
theta = math.atan2(pos[0] - self.pos[0], pos[1] - self.pos[1])
X = self.pos[0] + teleport_range * math.cos(theta)
Y = self.pos[1] + teleport_range * math.sin(theta)
这段代码首先求出射线从圆心到点的倾斜角度。然后它使用该角度在圆上找到一个具有相同角度的点。
请注意,此代码甚至适用于圆内的点:它会找到与圆心成相同角度的圆上的点。如果该点是圆的中心,则所需的点是不明确的,但代码 returns 一个特定的点。