【问题标题】:Determine which java 2d Rectangle edge (top/left/etc) an angle points to (from center)确定角度指向哪个java 2d矩形边缘(顶部/左侧/等)(从中心)
【发布时间】:2013-05-28 05:17:44
【问题描述】:

我在游戏地图上有两个矩形(称为 A 和 B),我计算了从 B 中心到 A 的角度。我有代码生成第三个 (C) 并从 B“射”它到 A. 问题是在我的游戏中,其中两个游戏元素永远不应该重叠(它们通常具有碰撞代码),因此“射击”代码被停止 - 在顶部生成 C 无法正常工作。

我的解决方案(告诉我是否有更好的解决方案)是生成第三个矩形在父级边缘的旁边 - 但是为了使 UI 正常运行,它需要始终生成面向矩形 A 的父级边缘。

我知道矩形 B 的中心坐标,我知道从 B 到 A 的角度(可以是弧度或度数),我如何确定角度将指向哪一侧(左、上、右、下)?

【问题讨论】:

    标签: java java-2d


    【解决方案1】:

    想一想位于单位圆上的正方形,其圆心位于原点。然后弄清楚 Java 的行为是否像 JavaScript 那样从标准的三元法倒退。 (pi/2 在 JS 中是直下的,而在标准三角中是直上的)。矩形对象也有边界和相交方法,这可能会有所帮助。

    此页面下方的图形可能会有所帮助:http://en.wikipedia.org/wiki/Unit_circle

    【讨论】:

      【解决方案2】:

      当我使用这样的碰撞引擎编写游戏并且需要弹丸发射行为时,我采用了几种不同的方法。

      首先,我维护了对发射弹丸的实体的引用。然后在碰撞检测方法中,我与this reference进行了比较。

      另一个可能更可取的选项是将实体与“派系”相关联。这可以建模为枚举。然后碰撞检测代码可以检查以确保两个实体不在同一派系中。您还可以使用映射来确定哪些派系相互冲突。例如,您可以有“敌对”、“中立”和“玩家”派系,并且玩家派系实体不会与中立等发生冲突。这取决于您游戏的“业务规则”。

      如果你这样做,你可以在任何你想要的地方生成射弹。

      【讨论】:

        【解决方案3】:

        假设angle 是从B 的中心到A 的中心的角度,在区间-pi..pi 中以弧度给出,那么下面应该做你想要的(记住像@Jared建议,正角是向下而不是向上):

        double halfPi = Math.PI/2;
        double theta = Math.atan2(B.height, B.width);
        if (angle >= theta+halfPi || angle <= -theta-halfPi) {
            // left side
        } else if (angle >= theta) {
            // bottom side
        } else if (angle >= -theta) {
            // right side
        } else {
            // top side
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多