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