Лучший способ получить ближайшую точку пересечения в сетке

Я использую Cocos2D для iPhone для создания игры. У меня есть сетка на экране, нарисованная горизонтальными и вертикальными линиями (я сделал это с помощью CCDrawNode). Как вы могли догадаться, там много точек пересечения, я имею в виду точки пересечения горизонтальных и вертикальных линий. С каждой процедурой touchBegan-Moved-Ended я рисую линию, более жирную и другого цвета. В методе touchesMoved мне нужно найти точку пересечения, ближайшую к текущей конечной точке линии, и прикрепить конец линии к этой точке. Как я могу это сделать? У меня есть одна идея: добавить все точки пересечения в массив при рисовании сетки, перебрать этот массив и найти ближайшую. Но я думаю, что это не лучший подход. У вас есть идеи получше?


person Mikayil Abdullayev    schedule 02.05.2013    source источник


Ответы (1)


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

Например. задана конечная точка X/Y 17,23, тогда x(17)/x-spacing(10) = 1,7, округляется до 2. 2*x-spacing = 20. y/y-spacing=2,3 -> 2*20 = 20. Таким образом, ваше пересечение 20,20.

РЕДАКТИРОВАТЬ: более подробный пример на С#, поскольку это то, что я использую, если у меня будет время, я напишу образец Objective-C

// defined somewhere and used to draw the grid
private int _spacingX = 10;
private int _spacingY = 10;

public Point GetNearestIntersection(int x, int y)
{
    // round off to the nearest vertical/horizontal line number
    double tempX = Math.Round((double)x / _spacingX);
    double tempY = Math.Round((double)y / _spacingY);

    // convert back to pixels
    int nearestX = (int)tempX * _spacingX;
    int nearestY = (int)tempY * _spacingY;

    return new Point(nearestX, nearestY);
}

ПРИМЕЧАНИЕ: приведенный выше код оставлен довольно подробным, чтобы помочь вам понять, вы можете легко переписать его, чтобы он был чище.

person Timothy Walters    schedule 02.05.2013
comment
Хорошая идея, но Тим, не могли бы вы сделать пример более понятным? Мне трудно это понять. - person Mikayil Abdullayev; 02.05.2013