从方向向量中找到所需的象限

Finding required quadrants from direction vector

我的游戏有一个 2d tilemap,我希望它最初对玩家隐藏,然后在他们移动时显示它。假设我已经暴露了玩家周围的一圈瓷砖,我只想暴露象限的边缘。

我假设它是正确的,例如当玩家向上移动时暴露 Q1 和 Q2,仅当玩家向左移动时暴露 Q2,等等。

我想我已经解决了公开代码,我遇到的问题是在初始化时想出一个优雅的解决方案。

我想已经创建了一个象限数组,当玩家在 xy 方向移动和通过时,我需要显示这些象限。

我可以创建单独的调用来为 8 个可能的方向中的每一个手动执行此操作,如下所示:

    private void CreateUpDirection()
    {
        directionDetails[Vector2Int.up.x + 1, Vector2Int.up.y + 1] = new DirectionDetail(quadrantDetails[Constants.QUADRANT_ONE],
            quadrantDetails[Constants.QUADRANT_TWO]);
    }

但有没有办法通过 xy 矢量值本身确定正确的象限,这样我就可以做这样的事情?

        CreateDirectionDetail(Vector2Int.up);
        CreateDirectionDetail(Vector2Int.up + Vector2Int.left);
        CreateDirectionDetail(Vector2Int.up + Vector2Int.right);
        CreateDirectionDetail(Vector2Int.left);
        CreateDirectionDetail(Vector2Int.right);
        CreateDirectionDetail(Vector2Int.down);
        CreateDirectionDetail(Vector2Int.down + Vector2Int.left);
        CreateDirectionDetail(Vector2Int.down + Vector2Int.right);   

我希望我已经说得够清楚了。谢谢

这让我很困扰,所以我尝试了一种不同的方法,我不再考虑象限,而是专注于角度。我发现 atan2 可以从方向向量给我我需要的角度,所以我不需要担心查找。

这是一个例子:

        float radians = Mathf.Atan2(vector.x, vector.y);

        int angle = (int)(Mathf.Rad2Deg * radians);

        int fov = 180;

        int centreAngle = ((360 + angle) % 360);
        int startAngle = ((360 + centreAngle) - fov / 2) % 360;
        int endAngle = ((360 + centreAngle) + fov / 2) % 360;

我调用 atan2(x,y) 而不是 atan2(y,x) 所以零度从 +y 而不是 +x 开始。视野是我要检查的弧度的任意值。

这是 8 个方向中每个方向的结果:

X: 0     Y: 1    angle: 0    centreAngle: 0     startAngle: 270  endAngle: 90
X: -1    Y: 1    angle: -45  centreAngle: 315   startAngle: 225  endAngle: 45
X: 1     Y: 1    angle: 45   centreAngle: 45    startAngle: 315  endAngle: 135
X: -1    Y: 0    angle: -90  centreAngle: 270   startAngle: 180  endAngle: 0
X: 1     Y: 0    angle: 90   centreAngle: 90    startAngle: 0    endAngle: 180
X: 0     Y: -1   angle: 180  centreAngle: 180   startAngle: 90   endAngle: 270
X: -1    Y: -1   angle: -135 centreAngle: 225   startAngle: 135  endAngle: 315
X: 1     Y: -1   angle: 135  centreAngle: 135   startAngle: 45   endAngle: 225