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