Прежде всего, я довольно уверен, что привязка к сетке довольно проста, однако я столкнулся с какой-то странной проблемой в этой ситуации, и мои математики слишком слабы, чтобы четко определить, что не так.Что не так с моей привязкой к коду сетки?
Вот ситуация
У меня есть абстрактное понятие сетки, с 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, и он всегда привязывается к действительной ячейке сетки.
Лучшее, что я могу придумать, это то, что где-то я усекаю некоторые данные в неправильном месте, но не знаю, где и как это заканчивается этим поведением.
Любое знакомое с координатными пространствами, прокруткой и привязкой?
Спасибо, отметьте свой вопрос – mmcdole
Рад, что вы его исправили. Просто FYI, вам не нужно создавать новую запись каждый раз, когда у вас есть обновление, вы можете просто изменить свой исходный вопрос. –