如何将画布的原点放在中心

时间:2016-05-14 07:59:51

标签: fabricjs transcrypt

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

我已经看到,对于单个对象,我可以使用centerX和centerY将其参考点置于此对象内。但我无法找到将原点放在画布中间的示例。

How to change the origin of the canvas to the center?中给出的解决方案有效,但看起来有点人为,因为我会补偿此翻译的鼠标位置。它也给了一个奇怪的"加倍"一些线段,可能是由于偏移。如果在我自己的代码中翻译坐标,则不存在加倍。两种翻译都添加了整数。

Translation using canvas context

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

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

Translation in my application code

我的应用程序代码中的翻译,应该看起来。 代码:

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

1 个答案:

答案 0 :(得分:1)

为了避免“加倍”效应,你可以试试这个:

self._context.translate (round(self._canvas.getWidth () / 2), round(self._canvas.getHeight () / 2))