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