【问题标题】:Calculating tangent from a point on a circle?从圆上的一点计算切线?
【发布时间】:2012-03-08 07:53:22
【问题描述】:

我正在尝试创建一种算法来找到圆上的切线,以便我可以计算该圆与物体碰撞时的反射角。我知道圆心和半径的 x 和 y 值。我也有与另一个对象的撞击点的 x 和 y 值。任何有关如何使用 Java 库计算切线的帮助都会很棒,或者如果有人对如何以另一种方式计算反射角有任何建议,将不胜感激。谢谢。

【问题讨论】:

  • 那么,你问的是如何求切线方程?
  • 纸和铅笔你会怎么做?
  • 好吧,我想这可能是一个答案,但是有没有什么方法可以让 Java 库更容易地做我正在做的事情?还有我正在做的整个事情是否是计算这个反射角的好方法。
  • 圆的切线垂直于半径,所以如果你有圆心和接触点,很容易确定切线。
  • @user1055696:没有魔法,只需做基本的数学运算(只不过是三角函数),如果你卡住了,然后再返回你的代码。就这么简单。

标签: java 2d collision-detection trigonometry geometry


【解决方案1】:

据我了解,您实际上想要计算圆的入射角。为此,您需要知道圆运动的角度和它反弹的表面的角度;碰撞点是不够的,因为无论圆圈碰撞的角度如何,它都是相同的。如果你有这个角度,那么圆的新角度由(360 - circle's angle + (surface's angle * 2)) % 360 给出。我怀疑您是否会跟踪圆的运动角度,尽管您可能已经有两个变量来描述它的运动,可能类似于以下内容:“对于每次更新,将圆移动dx 单位向右和dy 单位向上”。如果你有这个,你可以用(180 / π) * arctan(dy / dx) 计算圆的角度。这个公式有效,因为dy / dx 给出了由圆在平面上移动所产生的直线的斜率。一旦我们有了斜率,我们就取它的反正切(反正切),它以弧度表示它的角度。最后,我们使用180 / π 部分将该角度转换为度数。

如果我们使用表面的斜率,这也可以。假设曲面是一条线,从点 (x1, y1) 开始,到点 (x2, y2) 结束。使用(y1 - y2) / (x1 - x2) 找到曲面的坡度。然后我们可以像以前一样应用公式,代入曲面的斜率,如下所示:(180 / π) * arctan((y1 - y2) / (x1 - x2))

现在你有了圆和曲面的度数,可以应用上面的第一个公式。

【讨论】:

  • 是的,谢谢。这正是我的意思。虽然,我对表面的角度有点困惑,但我的意思是,用什么来代替 dy 和 dx 来计算它的角度?
  • 你基本上需要找到曲面的斜率。假设曲面是一条从点(x1, y1) 开始到点(x2, y2) 的线。然后dy = y2 - y1dx = x2 - x1
  • 谢谢。如果碰撞发生在拐角处,曲面斜率是否会与碰撞点处的圆相切?如果是这样,我应该如何让 dy 和 dx 离开那个斜坡?
  • 我不这么认为。就像我在回答中所说的那样,不同角度的碰撞点可能相同,因此无法判断如何将其反弹回来。相反,尝试平均两个表面的角度,然后计算一个垂直角,如下所示:((angle1 + angle2) / 2 + 90) % 360。将此角度用作我在答案中给出的第一个公式中的表面角度。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2015-07-12
相关资源
最近更新 更多