首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在这个方程式里做错了什么?

我在这个方程式里做错了什么?
EN

Stack Overflow用户
提问于 2017-05-18 21:27:25
回答 1查看 52关注 0票数 0

我试着做一个函数,如果一个点在某个圆之外,这个点会移动到经过圆心的直线与点碰撞的点。守则:

代码语言:javascript
复制
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是我要检查的点,两者都是元组。

戊特是直线的倾斜(在法语中抱歉)。

原语是这条线的Y原点(法语也是)

teleport_range是半径,是一个常数300

我想要的实际返回值是为了测试目的而注释的。

当我运行它时,如果它在圆圈内,一切都很好,但是如果它在外面,就会出现一个错误,因为它试图将负数平方根。

X= (-B +math.sqrt(B**2-4*A*C)/(2*A) ValueError:数学域错误

二次方程中的平方根只有在直线和圆之间没有碰撞点时才是负的,而直线经过圆心和一个点时,就应该有两个碰撞点。

当线是常数时,我知道只有一个碰撞点,但当我理解为什么(B**2-4*A*C)不应该是负的时,我会修正它。

我数学不好,如果有人能帮我,也不要犹豫,告诉我是否可以在不弄清楚的情况下简化代码。

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-18 22:56:12

这里有一个更简单、更短、更清晰的方法来获得你想要的圆点。

代码语言:javascript
复制
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)

这个代码首先找出光线从圆心到点的倾斜角度。然后用这个角度在圆上找到一个具有相同角度的点。

请注意,这段代码甚至适用于圆内的点:它从圆心找到具有相同角度的圆上的点。如果点是圆的中心,那么所需的点是不明确的,但是代码返回一个特定的点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44058051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档