3

Transcrypt Python から JavaScript コンパイラー用の単純なタートル グラフィックスを作成しようとしています。CPython Turtle モジュールと互換性を持たせるには、デカルト座標が必要です。つまり、原点がキャンバスの中心にある必要があります。自分で別の座標系を使用せずに、自分のコードでオブジェクトごとに変換する方法はありますか。

個々のオブジェクトについて、centerX と centerY を使用して、そのようなオブジェクト内の参照ポイントを中央に配置できることを確認しました。しかし、キャンバスの真ん中に原点を置く例は見つかりませんでした。

キャンバスの原点を中央に変更する方法で与えられた解決策は? 動作しますが、この翻訳のためにマウスの位置を補正するため、やや不自然に見えます。また、おそらくオフセットが原因で、いくつかの線分が奇妙に「倍増」します。自分のコードで座標を変換すると、倍増はありません。どちらの変換も整数を追加します。

キャンバス コンテキストを使用した翻訳

キャンバス コンテキストを使用した翻訳、一部の行は 2 倍になります。コード:

class Turtle:
    def __init__ (self):
        self._canvas = __new__ (fabric.Canvas ('canvas', {'backgroundColor': 'lightgray'}))
        self._canvas.onWindowResize = self.resize
        self._canvas.onWindowDraw = self.draw

        self._context = self._canvas.getContext ('2d')
        self._context.translate (self._canvas.getWidth () / 2, self._canvas.getHeight () / 2)

        self.reset ()

    def reset (self):
        self._canvas.clear ()   
        self.pensize (1)
        self.color ('black')
        self.down ()
        self._position = [0, 0]
        self._heading = Math.PI / 2

アプリケーションコードの翻訳

私のアプリケーションコードの翻訳は、見た目どおりです。コード:

class Turtle:
    def __init__ (self):
        self._canvas = __new__ (fabric.Canvas ('canvas', {'backgroundColor': 'lightgray'}))
        self._canvas.onWindowResize = self.resize
        self._canvas.onWindowDraw = self.draw

        self._context = self._canvas.getContext ('2d')

        self.reset ()

    def reset (self):
        self._canvas.clear ()   
        self.pensize (1)
        self.color ('black')
        self.down ()
        self._position = [self._canvas.getWidth () / 2, self._canvas.getHeight () / 2]
        self._heading = Math.PI / 2
4

1 に答える 1

1

「倍増」効果を避けるために、これを試すことができます:

self._context.translate (round(self._canvas.getWidth () / 2), round(self._canvas.getHeight () / 2))
于 2016-08-25T07:55:17.177 に答える