Как повернуть (x, y) для привязки к сетке - PullRequest
0 голосов
/ 22 сентября 2018

Я сделал привязку к сетке для нормальной квадратной сетки, основываясь на том, что, как я полагаю, это популярный метод для этого

int newX = Math.Round(oldX / gridCubeWidth)  * gridCubeWidth;
int newY = Math.Round(oldY / gridCubeHeight) * gridCubeHeight;

, что не было интуитивно для меня то, что это не работает с моимдиагональная сетка.

enter image description here

Я выделил красный прямоугольник для рисунка, который мог бы взять мой объект, если бы он перемещался, оставляя фиолетовый круг недоступным.Мне нужно повернуть это вычисление на 45 градусов, чтобы оно соответствовало приведенному ниже примеру, что позволяет мне правильно привязать объект к диагональной сетке.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Кажется, что на вашем изображении нет углов в 45 градусов.

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

 int newX = (Math.Floor(oldX / HorizontalSpacing) + 0.5) * HorizontalSpacing;
 int newY = (Math.Floor(oldY / VerticalSpacing)  + 0.5) * VerticalSpacing;
0 голосов
/ 22 сентября 2018

Вы можете посмотреть на диагональную сетку с другой точки зрения.Это суперпозиция двух регулярных сеток, смещенных на половину размера сетки, показанных ниже как синие и зеленые сетки (зеленые вертикальные линии соответствуют левой и правой границам).

enter image description here

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

const int SubgridWidth = 40, SubgridHeight = 28;

double newX1 = Snap(oldX, SubgridWidth);
double newY1 = Snap(oldY, SubgridHeight);

double newX2 = SnapShifted(oldX, SubgridWidth);
double newY2 = SnapShifted(oldY, SubgridHeight);

double squareDist1 = SquareDist(oldX, oldY, newX1, newY1);
double squareDist2 = SquareDist(oldX, oldY, newX2, newY2);

if (squareDist1 < squareDist2) {
    // Snap to (newX1, newY1).
} else {
    // Snap to (newX2, newY2).
}

double Snap(double x, double gridSize)
{
    return Math.Round(x / gridSize) * gridSize;
}

double SnapShifted(double x, double gridSize)
{
    return (Math.Round(x / gridSize - 0.5) + 0.5) * gridSize;
}

double SquareDist(double x1, double y1, double x2, double y2)
{
    double dx = x2 - x1;
    double dy = y2 - y1;
    return dx * dx + dy * dy;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...