找到一个点所在的正方形中心

时间:2016-06-18 19:16:26

标签: c# algorithm geometry-surface

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

找到正方形左上角点的方法是:

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

SquareSize是int类型的属性(可以是奇数)。 Vector2是具有浮动X和Y特性的XNA向量。 SquareSize是方形边缘的长度。

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

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

感谢。

修改

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

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

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

func allItemsEqual<T>(items:[T]) -> Bool {
    guard items.count > 1 else { fatalError("Must have at least two objects to check for equality") }
    return Set(items).count == 1
}

func allItemsEqual(items:T...) -> Bool {
    return equal(items)
}

if allItemsEqual(2,3,2) {
    // false
}

if allItemsEqual(2, 2, 2) {
    // true
}

我已将Square尺寸改为浮动。

1 个答案:

答案 0 :(得分:1)

如果正方形的长度为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;