我的一个项目包含一个有效的自定义坐标系,该坐标系放置在不同的对象上。坐标系类存储比例尺和偏移量,这又会影响坐标系中所有对象的比例尺和位置。虽然它可以正常工作,但我却迷上了使用鼠标与坐标系进行交互的方法。具体而言,拖动鼠标应平移坐标系,以便坐标系以与鼠标相同的速率移动,这意味着鼠标更改偏移量的量将乘以与缩放有关的因子。 哪种公式/算法可以实现这一目标?
我在程序中提供了两个函数: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