【问题标题】:Pool/Billiards trig台球/台球三角
【发布时间】:2010-11-23 23:06:00
【问题描述】:

好的,我正在尝试使用 c#/java 进行台球游戏。

  • start = 台球杆背面(x,y)
  • end = 台球杆前面(x,y)
  • circles = 球列表 (x,y,r)

因此,每次您移动鼠标时,我都会更新startend,然后循环遍历`circles 检查它是否相交。那么这是我的问题我需要弄清楚如果我在交叉点击球会发生什么(它会向上向下)。

我将如何做到这一点。我在 google 上查看了一些示例,但只能找到他们使用 vector 进行操作的示例,并且在我的脑海中以这种方式....

我的第一个想法是获得台球杆的角度,然后从圆圈中点画一条相同角度的线,但由于某种原因这是错误的。这可能是我的GetEnd 函数

    public Point GetEnd(Point start, double angle, int len)
    {
        double y = start.Y + (len * Math.Sin(angle));
        double x = start.X + (len * Math.Cos(angle));

        return new Point((int)x, (int)y);
    }

【问题讨论】:

  • 这类物理总是由向量建模。花点时间学习基本的线性代数,你需要的东西并不难。
  • 现阶段我只想要角度,并不需要速度或摩擦力或任何其他...
  • 这篇文章可能会有所帮助。 codeproject.com/KB/game/CSharpSnooker.aspx

标签: c# java trigonometry


【解决方案1】:

我认为球杆指向的方向和球移动的角度是:

Math.ASin(a/r)

a 代表球杆的射线与球中心之间的最小距离,r 是球的半径。

您可以通过最小化 lamda 的 a^2 = (Cue.Position+Cue.Direction*Lamda-Ball.Position)^2 然后计算该表达式的平方根来获得 a

但我懒得重新表述没有向量的表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多