まず第一に、グリッドへのスナップはかなり簡単だと確信していますが、この状況で奇妙な問題に遭遇し、数学が弱すぎて具体的に何が悪いのかを特定できません.
状況はこちら
私はグリッドの抽象的な概念を持っており、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 位置が返されます
元のシナリオでは問題なく動作しているように見えますが、ビューがスクロール可能であるという事実を考慮すると、少し奇妙になります。
スクロールは可能な限り基本的に行われます。Y 軸に沿ってスクロールされた距離をカウントし、それを通過するすべてのものをオフセットする viewPort があります。
カーソルの mouseMotion コードのスニペットを次に示します。
def mouseMotion(self, event):
pixelPos = event.pos[Y]
odePos = Scroll.pixelPosToOdePos(pixelPos)
self.tool.positionChanged(odePos)
1 つ目は Scroll モジュールのピクセル位置から抽象座標空間への変換、次に抽象座標空間の値を取得して最も近い Y ステップにスナップするツールの positionChanged 関数です。
関連するスクロールコードは次のとおりです
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 を超えることはなく、常に有効なグリッド位置にスナップしています。
私が思いつくことができる最善の推測は、どこかで間違った場所でいくつかのデータを切り捨てているということですが、どこでどのようにこの動作になるのかわかりません。
座標空間、スクロール、スナップに詳しい人はいますか?