2008-09-23 14 views
0

まず、グリッドにスナップすることはかなり簡単ですが、この状況では奇妙な問題に遭遇してしまい、数学が弱すぎて具体的に何が間違っているのか分かりません。グリッドコードにスナップすると何が問題になりますか?

ここでYは離れて正確にY_STEPステップと、私は、グリッドの抽象的な概念を持っている状況

(Xステップが正常に動作しているので、今のためにそれらを無視する)

グリッド座標抽象的でありますスペース、およびのは、私は、次のコード(パイソン)

def snapToGrid(originalPos, offset, step): 
    index = int((originalPos - offset)/step) #truncates the remainder away 
    return index * gap + offset 
を持ってグリッドにスナップY_OFFSET

それを呼びましょう、物事は私がそこにオフセット魔法を持って並ぶように取得します

なので、カーソル位置Y_OFFSETとY_STEPをその関数に渡して、グリッド上の最も近いflooring y位置を返します。

これは、元のシナリオでうまくいくように見えますが、ビューはスクロール可能なものは少し奇妙になる。

私はそれを得ることができる基本的なスクロールは、私はY軸に沿ってスクロールされた距離のカウントを保持し、それを通過するすべてのビューポートを持っている。

ここでは、カーソルのmouseMotionコードの抜粋です:だから、そこを見て二つのものがあります

def mouseMotion(self, event): 
    pixelPos = event.pos[Y] 
    odePos = Scroll.pixelPosToOdePos(pixelPos) 
    self.tool.positionChanged(odePos) 

ピクセル位置から抽象への最初のスクロールモジュールの変換座標空間、とり、ツールの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) 

ツールは、自分自身をレンダリングするために行くとき、最後の関連チャンクがあるのです。それはのは、画面上のピクセル位置に空間位置座標スナップツールを変換スクロールオブジェクトを通過し、ここでのコードは次のとおりです。長い説明した

#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以上のものではなく、常に有効なグリッド位置にスナップしています。

私はどこかで間違った場所でデータを切り捨てていますが、どこでどのように動作するのかはわかりません。

座標空間、スクロール、スナップに詳しい方はいらっしゃいますか?

答えて

1

私はここで自分の質問に答えています。アレクレク氏が言いましたように、切り詰めにintを使用するのは私の間違いでした。

私が行った動作は、math.floor()によって最もよくモデリングされています。

ご迷惑をおかけして申し訳ございませんが、元の質問には実際に問題が解決するのに十分な情報が含まれていません。私はその時点で余分な情報を持っていませんでした。

私は誤った方法でコンテキストを使用している可能性があります... positionChanged()関数の観点から、パラメータは新しい位置に入っています。
snapToGrid()関数のパラメータはスナップされた位置に変更されている元の位置です。 言語はそのようなものです。その一部は私のイベント処理コードにあり、他の部分は私の一般的なサービスコードの中にあるからです。私は例のために変更したはずです

+0

あなたの質問にお答えいただきありがとうございました – mmcdole

+0

喜んでそれを修正しました。ちょうど、ちょうどあなたが更新するたびに新しい投稿を作成する必要はありません、あなたは元の質問を編集することができます。 –

0

positionChanged()にタイプミスがありますか?

def positionChanged(self, newPos): 
    self.snappedPos = snapToGrid(newPos, Y_OFFSET, Y_STEP) 

フロート分割時の精度の問題から、1ピクセルずれているようです。これに)(あなたのsnapToGridを変更してみてください:答えを

def snapToGrid(originalPos, offset, step): 
    EPS = 1e-6 
    index = int((originalPos - offset)/step + EPS) #truncates the remainder away 
    return index * gap + offset 
0

おかげで、そこにタイプミスかもしれないが、私はそれを見ることができない...

残念ながらsnapToGridへの変更は行いませんでした違いがあるので、私はそれが問題だとは思わない。

ピクセル単位ではなく、Y_STEP単位で表示されます。それをもう少し調べてみると、画面がスクロールアップされていることを正確に把握することができないことがわかりました。また、画面の上部に向かって発生することもあります。私は自分の問題が小さいか負の値であると推測しています。

+0

typoに関しては、 'newPos'ではなく' originalPos'を 'snapToGrid()'に渡しています。 負の値は、int(-1.5)== -1という事実に関連していますか? –

関連する問題