Панорамирование системы координат с помощью мыши (с учетом масштабирования)

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

В моей программе есть две функции: 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

person Ansel Chang    schedule 04.10.2018    source источник
comment
см. некоторые идеи в масштабировании графики на основе текущей позиции мыши. Вы должны преобразовать разницу мыши в ту же систему координат, которую вы используете для панорамирования вида, и просто добавить/подставить ее в/из смещения панорамирования. У вас есть два смещения: CENTER, self.?Offsey, так что это немного сбивает с толку, и я привык к уравнениям масштабирования/панорамирования с одним смещением для 2D.   -  person Spektre    schedule 06.10.2018
comment
@Spektre Спасибо за помощь! Я прочитал сообщение, которое вы связали. Просто чтобы уточнить, (CENTER_X,CENTER_Y) определены для координат центра экрана и использовались в программе для масштабирования от центра. Вы предлагаете найти разницу x и y cRev (старая позиция мыши) и cRev (новая позиция мыши) и использовать эти значения для увеличения d.xOffset и d.yOffset?   -  person Ansel Chang    schedule 07.10.2018
comment
да так бы и получилось. Кстати, я не использую CENTER, так как вместо этого его значение является частью моего смещения. что упрощает преобразование, но масштабирование немного сложнее, как вы можете видеть (но не намного)   -  person Spektre    schedule 07.10.2018
comment
Спасибо! Только что исправил ошибку, теперь работает хорошо.   -  person Ansel Chang    schedule 09.10.2018
comment
хорошо, тогда вы можете написать ответ с вашим решением, чтобы помочь другим, столкнувшимся с той же проблемой...   -  person Spektre    schedule 09.10.2018