2016-06-18 4 views
0

В настоящее время в моей программе я определил квадрат квадратной сетки в его верхнем левом углу. Я хочу изменить определение, поэтому квадрат определяется его центром. Однако значения X и Y квадрата должны быть круглыми.Найти центр квадрата, который находится в

Способ нахождения верхнего левого угла квадрата точка находится в:

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 (это может быть и нечетным числом). Вектор2 представляет собой вектор XNA с поплавками X и Y. SquareSize - это длина края квадрата.

Как изменить определение квадрата на его центральную точку, но все же иметь центры с круглыми координатами?

(я не помечать этот вопрос как XNA, поскольку он не требует опыта XNA, чтобы понять)

Спасибо.

EDIT:

То, что я пытался сделать это, чтобы представить уровень в игре с равномерной квадратной сеткой. квадрат на сетке был определен его верхним левым углом. Однако, поскольку я знаю, какие квадраты заблокированы путем повторения текстуры уровня, применяя матрицу к каждой точке, а затем блокируя квадрат, в котором находится точка, имея квадраты, определяемые их верхним левым углом, означает, что каждый заблокированный квадрат был слегка выключен слева от того места, где он должен был быть. Наличие каждого квадрата определяется их центральной точкой означает, что каждый заблокированный квадрат ближе к тому месту, где препятствие находится на карте.

Надеюсь, это объяснит проблему лучше.

Спасибо @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); 
    } 

Я изменил площадь, чтобы плавать.

+3

Я не очень понимаю, что вы пытаетесь достичь, может вы, пожалуйста, приложите некоторые усилия для переформулировки вопроса? –

+0

Точка может быть целым числом, но PointF может быть числом с плавающей запятой. – jdweng

+0

@WillemVanOnsem Извините, что написал такой плохой вопрос. Я написал его, пока он был сонным и стрессом, и не собирался тратить время на то, чтобы сделать это снова. – user1461837

ответ

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)

Если нужны координаты точно, рассмотрим с помощью поплавка переменных вместо чисел или оставить координаты, указывающие на углу площади.

EDIT: закругленных вниз номера вы получите все еще достаточно хорошо, чтобы легко вычислить местоположение всех сторон квадрата:

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

Я адаптировал ваше решение и изменил SquareSize на int. В любом случае, память не моя текущая проблема. Спасибо! – user1461837