3

我正在尝试为我的Transcrypt Python to JavaScript 编译器编写简单的海龟图形。为了与CPython Turtle 模块兼容,我需要carthesian 坐标,即原点必须在画布的中心。有什么方法可以实现,而无需自己使用单独的坐标系并在我自己的代码中为每个对象转换它们。

我已经看到,对于单个对象,我可以使用 centerX 和 centerY 将它们的参考点居中在这样的对象内。但是我找不到将原点放在画布中间的示例。

如何将画布的原点更改为中心?工作,但看起来有些人为,因为我会补偿这个翻译的鼠标位置。它还给出了一些线段的奇怪“加倍”,可能是由于偏移。如果在我自己的代码中翻译坐标,则不存在加倍。两种翻译都添加整数。

使用画布上下文进行翻译

使用画布上下文进行翻译,有些行加倍。代码:

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 回答