找到点所在的正方形中心

Find center of square that a point is in

目前在我的程序中,我在其左上角的正方形网格中定义了一个正方形。我想更改定义,以便正方形由它的中心定义。但是,正方形的X和Y值必须是整数。

求正方形左上角a点的方法在:

public Vector2 InSquare(Vector2 vector)
{
    int x = (int)vector.X, y = (int)vector.Y;//floor of vector coordinates
    x -= x % SquareSize;
    y -= y % SquareSize;
    return new Vector2(x, y);
}

SquareSize 是一个 属性 类型的 int(它可以是奇数)。 Vector2 是具有浮点 X 和 Y 属性的 XNA 向量。 SquareSize 是正方形边的长度。

如何将正方形的定义更改为其中心点,但中心仍为圆坐标?

(我没有将此问题标记为 XNA,因为它不需要 XNA 经验即可理解)

谢谢。

编辑:

我试图做的是用统一的正方形网格来表示游戏中的关卡。网格上的一个正方形由它的左上角定义。但是,因为我知道哪些方块是通过遍历关卡的纹理、对每个点应用矩阵、然后阻挡该点所在的方块而被阻挡的,所以让方块由它们的左上角定义意味着每个被阻挡的方块都略微偏离从它应该在的地方向左。让每个方块由它们的中心点定义意味着每个被阻挡的方块更接近地图上障碍物的位置。

我希望这能更好地解释问题。

感谢@potato his/hers 的回答。我目前的方法:

    public Vector2 InSquare(Vector2 vector)
    {
        float x = vector.X, y = vector.Y;//floor of vector coordinates
        x -= x % SquareSize - (SquareSize / 2);
        y -= y % SquareSize - (SquareSize / 2);
        return new Vector2(x, y);
    }

我已将方形大小更改为浮动大小。

如果正方形的长度是SquareSizeSquareSize的一半就是正中间。

public Vector2 InSquare(Vector2 vector)
{
   int x = (int)vector.X, y = (int)vector.Y;//floor of vector coordinates
   x -= x % SquareSize - (SquareSize / 2);
   y -= y % SquareSize - (SquareSize / 2);
   return new Vector2(x, y);
}

但是,如果 SquareSize 是奇数,您将无法将正方形的确切中心存储为整数。 SquareSize / 2的结果会比真实的中心小0.5

(例如 9 / 2 = 4)

如果您需要精确的坐标,请考虑使用浮点变量而不是整数,或者让坐标指向正方形的一角。

编辑: 您得到的四舍五入的数字仍然足以轻松计算出正方形所有边的位置:

int left    =  x - (SquareSize / 2);
int top     =  y - (SquareSize / 2);
int right   =  left + SquareSize;
int bottom  =  top + SquareSize;