c# - 找到点所在的正方形中心

标签 c# algorithm geometry-surface

目前在我的程序中,我在其左上角的正方形网格中定义了一个正方形。我想更改定义,以便正方形由它的中心定义。但是,正方形的 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 经验即可理解)

谢谢。

编辑:

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

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

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

    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);
    }

我已将 Square 大小更改为 float 。

最佳答案

如果正方形的长度为 SquareSize,则 SquareSize 的一半恰好在中间。

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;

关于c# - 找到点所在的正方形中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900750/

相关文章:

python - pickle 保存pygame Surface(python)

go - 将 golang S2 几何库与 dynamodb 结合使用

c# - 对列表进行分组 - 寻找更好的方法

algorithm - 如何减少 (x,y) 数据中的点数

c# - 检查集合是否包含具有特定属性的元素

计算关键字与短文本(50 - 100 字)相关性的算法

c++ - 叶子上有重复条目的树

java - Java中使用double计算截锥体侧面时如何处理浮点精度

c# - 这可能是 : c# collection of Type with constrains, 还是通用类型的集合?

c# - C#.NET套接字tcp begin/endreceive客户端: endreceive reads all bytes,,但是在beginreceive中,缓冲区大小自行更改