首先,我相当确定对网格的攻击是相当容易的,但是在这种情况下我遇到了一些奇怪的麻烦,我的数学太弱而无法明确解决问题。
这是情况
我有一个网格的抽象概念,Y步骤与Y_STEP分开(x步骤工作正常,所以现在忽略它们)
网格在一个抽象的坐标空间中,为了让事情排好,我在那里有一个魔法偏移,我们称之为Y_OFFSET
捕捉到网格我有以下代码(python)
def snapToGrid(originalPos, offset, step):
index = int((originalPos - offset) / step) #truncates the remainder away
return index * gap + offset
所以我将光标位置Y_OFFSET和Y_STEP传递给该函数,它返回网格上最近的地板y位置
在原始场景中似乎工作正常,但是当我考虑到视图是可滚动的这一事实时,事情变得有点奇怪。
滚动是基本的,因为我可以得到它,我有一个viewPort,它保持沿Y轴滚动的距离计数,并且只是偏移通过它的所有内容。
这是光标的mouseMotion代码的片段:
def mouseMotion(self, event):
pixelPos = event.pos[Y]
odePos = Scroll.pixelPosToOdePos(pixelPos)
self.tool.positionChanged(odePos)
所以有两件事要看,首先是Scroll模块从像素位置到抽象坐标空间的转换,然后是工具的positionChanged函数,它取抽象坐标空间值并捕捉到最接近的Y步。
这是相关的滚动码
def pixelPosToOdePos(pixelPos):
offsetPixelPos = pixelPos - self.viewPortOffset
return pixelsToOde(offsetPixelPos)
def pixelsToOde(pixels):
return float(pixels) / float(pixels_in_an_ode_unit)
工具更新代码
def positionChanged(self, newPos):
self.snappedPos = snapToGrid(originalPos, Y_OFFSET, Y_STEP)
最后一个相关的块是工具自动渲染的时候。它通过Scroll对象,它将工具的捕捉坐标空间位置转换为屏幕上的像素位置,这是代码:
#in Tool
def render(self, screen):
Scroll.render(screen, self.image, self.snappedPos)
#in Scroll
def render(self, screen, image, odePos):
pixelPos = self.odePosToPixelPos(odePos)
screen.blit(image, pixelPos) # screen is a surface from pygame for the curious
def odePosToPixelPos(self.odePos):
offsetPos = odePos + self.viewPortOffset
return odeToPixels(offsetPos)
def odeToPixels(odeUnits):
return int(odeUnits * pixels_in_an_ode_unit)
哇,这是一个很长的解释。希望你还和我在一起......
我现在遇到的问题是,当我向上滚动时,绘制的图像与光标失去对齐 它开始捕捉到光标下方正好1步的Y步。 此外,它似乎逐步进入和退出 在一些卷轴上,它是1和其他卷轴,它是现场 它永远不会超过1,并且它总是捕捉到有效的网格位置。
最好的猜测我能想到的是,某个地方我在错误的位置截断了一些数据,但不知道它在哪里或如何以这种行为结束。
任何熟悉坐标空间,滚动和捕捉的人?
答案 0 :(得分:1)
好的,我在这里回答我自己的问题,正如alexk所说,使用int来截断是我的错误。
我所追求的行为最好由math.floor()建模。
道歉,原始问题没有足够的信息来真正解决问题所在。那时我没有额外的信息。
关于拼写错误,我想我可能会以混乱的方式使用上下文...从positionChanged()函数的角度来看,参数是一个新的位置。
从snapToGrid()函数的角度来看,参数是一个原始位置,它被更改为一个捕捉位置。
语言是这样的,因为它的一部分在我的事件处理代码中,而另一部分在我的一般服务代码中。我应该为示例
答案 1 :(得分:0)
你在positionChanged()中有拼写错误吗?
def positionChanged(self, newPos):
self.snappedPos = snapToGrid(newPos, Y_OFFSET, Y_STEP)
由于浮动分割期间的准确性问题,我猜你离开了一个像素。尝试将snapToGrid()更改为:
def snapToGrid(originalPos, offset, step):
EPS = 1e-6
index = int((originalPos - offset) / step + EPS) #truncates the remainder away
return index * gap + offset
答案 2 :(得分:0)
感谢您的回答,可能会有拼写错误,但我看不到它......
不幸的是,对snapToGrid的更改没有什么区别,所以我认为这不是问题。
它没有偏离一个像素,而是由Y_STEP关闭。再玩一遍,我发现在屏幕向上滚动的任何一点上我都无法准确地说明它是在屏幕顶部发生的,我怀疑是ODE位置为零,所以我猜我的问题是关于小值或负值。