2008-09-23 4 views
0

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

Вот ситуация

У меня есть абстрактное понятие сетки, с Y шаги точно Y_STEP друг от друга (шаги х работают отлично так что игнорировать их сейчас)

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

привязать к сетке, я получил следующий код (питон)

def snapToGrid(originalPos, offset, step): 
    index = int((originalPos - offset)/step) #truncates the remainder away 
    return index * gap + offset 

, поэтому я передаю позицию курсора, Y_OFFSET и Y_STEP в эту функцию, и она возвращает мне ближайшую полную позицию y на сетке.

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

Прокрутка сделана как базовая, так как я могу ее получить. У меня есть viewPort, который подсчитывает расстояние, прокручиваемое вдоль оси Y, и просто смещает все, что проходит через него.

Вот фрагмент кода mouseMotion курсора:

def mouseMotion(self, event): 
    pixelPos = event.pos[Y] 
    odePos = Scroll.pixelPosToOdePos(pixelPos) 
    self.tool.positionChanged(odePos) 

Таким образом, есть две вещи, чтобы посмотреть на то, первый перевод модуля Scroll от позиции пикселя к абстрактному пространстве координат, то функция PositionChanged Автомата, который принимает абстрактное значение координатного пространства и привязывается к ближайшему шагу Y.

Вот соответствующий код Scroll

def pixelPosToOdePos(pixelPos): 
    offsetPixelPos = pixelPos - self.viewPortOffset 
    return pixelsToOde(offsetPixelPos) 

def pixelsToOde(pixels): 
    return float(pixels)/float(pixels_in_an_ode_unit) 

И код инструменты обновления

def positionChanged(self, newPos): 
    self.snappedPos = snapToGrid(originalPos, Y_OFFSET, Y_STEP) 

Последнее отношение кусок, когда инструмент переходит к визуализации себя. Он проходит через объект Scroll, который трансформирует инструмент щелкнул координатное пространство позиции в экранную позицию пикселя, вот код:

#in Tool 
def render(self, screen): 
    Scroll.render(screen, self.image, self.snappedPos) 

#in Scroll 
def render(self, screen, image, odePos): 
    pixelPos = self.odePosToPixelPos(odePos) 
    screen.blit(image, pixelPos) # screen is a surface from pygame for the curious 

def odePosToPixelPos(self.odePos): 
    offsetPos = odePos + self.viewPortOffset 
    return odeToPixels(offsetPos) 

def odeToPixels(odeUnits): 
    return int(odeUnits * pixels_in_an_ode_unit) 

Уф, это было длинное объяснение. Надеюсь, вы по-прежнему со мной ...

Проблема, которую я получаю сейчас, заключается в том, что при прокрутке вверх обратное изображение теряет выравнивание с помощью курсора.
Он начинает привязываться к шагу Y ровно на 1 шаг ниже курсора. Кроме того, он, похоже, находится в фазе и выходит из привязки.
В некоторых свитках он отсутствует на 1, а другие свитки - на месте.
Это никогда не бывает более 1, и он всегда привязывается к действительной ячейке сетки.

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

Любое знакомое с координатными пространствами, прокруткой и привязкой?

ответ

1

Хорошо, я отвечаю на свой вопрос здесь, как сказал алекск, используя int для усечения, была моя ошибка.

Поведение, с которым я следую, лучше всего моделируется math.floor().

Извинения, оригинальный вопрос не содержит достаточной информации, чтобы действительно решить, в чем проблема. В этот момент у меня не было лишней информации.

касаемо опечатка ноте, я думаю, что я могу использовать контекст в запутанной манере ... С точки зрения функции PositionChanged(), параметр является новое положение входить.
С точки зрения функции snapToGrid() параметр является исходной позицией, которая изменяется на позицию с привязкой. Язык такой, потому что часть его в моем коде обработки событий, а другая часть - в моем общем сервисе. Я должен был изменить его для примера

+0

Спасибо, отметьте свой вопрос – mmcdole

+0

Рад, что вы его исправили. Просто FYI, вам не нужно создавать новую запись каждый раз, когда у вас есть обновление, вы можете просто изменить свой исходный вопрос. –

0

У вас есть опечатка в positionChanged()?

def positionChanged(self, newPos): 
    self.snappedPos = snapToGrid(newPos, Y_OFFSET, Y_STEP) 

Я думаю, вы отключены на один пиксель из-за проблем с точностью во время поплавкового разделения. Попробуйте изменить SnapToGrid() это:

def snapToGrid(originalPos, offset, step): 
    EPS = 1e-6 
    index = int((originalPos - offset)/step + EPS) #truncates the remainder away 
    return index * gap + offset 
0

Спасибо за ответ, может быть опечатка, но я не могу видеть его ...

К сожалению, изменение SnapToGrid не сделать разница, поэтому я не думаю, что это проблема.

Это не один пиксель, а скорее Y_STEP. Играя с ним еще немного, я обнаружил, что не могу понять, что это точно, в любой момент, когда экран прокручивается вверх, а также что это происходит в верхней части экрана, что, я подозреваю, является нулевой позицией ODE, поэтому Я предполагаю, что моя проблема связана с небольшими или отрицательными значениями.

+0

Что касается опечатки, вы передаете 'originalPos' вместо' newPos' '' snapToGrid() '. Что касается отрицательных значений, может ли это быть связано с тем, что int (-1.5) == -1? –