Панорамирование системы координат с помощью мыши (с учетом увеличения) - PullRequest
0 голосов
/ 05 октября 2018

Один из моих проектов содержит рабочую пользовательскую систему координат, в которую помещаются различные объекты.Класс системы координат хранит масштаб и смещение, что, в свою очередь, влияет на масштаб и местоположение всех объектов в системе координат.Хотя он работает правильно, я нахожусь в тупике при использовании мыши для взаимодействия с системой координат.В частности, перетаскивание мыши должно панорамировать систему координат, так что система координат перемещается с той же скоростью, что и мышь, что означает, что величина, на которую мышь изменяет смещение, умножается на коэффициент, относящийся к масштабированию. Какая формула / алгоритм мог бы выполнить это?

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

    def c(self,pos): # canvas to screen coords.
    x = pos[0]+self.xOffset # change offsets
    y = pos[1]+self.yOffset

    x = (x - CENTER_X) * self.scale + CENTER_X # change scales
    y = (y - CENTER_Y) * self.scale + CENTER_Y

    return [int(x),int(y)]

def cRev(self,pos): # screen coords to canvas
    x = pos[0]
    y = pos[1]

    x = (x-CENTER_X) / float(self.scale) + CENTER_X
    y = (y-CENTER_Y) / float(self.scale) + CENTER_Y

    x -= self.xOffset
    y -= self.yOffset

    return [int(x),int(y)]

У меня есть версия алгоритма мыши, которая не работает так, как задумано - мышь движется с той же скоростью, что и система координат;однако он «прыгает» каждый раз, когда мышь только начинает перетаскиваться.

Ниже приведена сокращенная версия: (Имейте в виду, что все переменные являются глобальными)

for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
    orig_x, orig_y = event.pos
    origXOffset = d.xOffset
    origYOffset = d.yOffset
    mouseDown = True

elif event.type == pygame.MOUSEMOTION:
    x = event.pos[0]
    y = event.pos[1]
    if mouseDown: # dragging
        xa,ya = d.cRev(event.pos)
        mousex,mousey = origXOffset + xa - orig_x,origYOffset + ya - orig_y
        d.xOffset += mousex
        d.yOffset += mousey
elif event.type == pygame.MOUSEBUTTONUP:
    mouseDown = False
...