2016-05-14 4 views
3

Я пытаюсь написать простую графику черепахи для моего Transcrypt компилятора Python для JavaScript. Чтобы быть совместимым с модулем CPython Turtle, мне нужны карцинные координаты, т. Е. Начало координат должно быть в центре холста. Есть ли способ, которым я могу достичь этого, без использования отдельной системы координат и преобразования их для каждого объекта в моем собственном коде.Как поместить начало холста в центр

Я видел, что для отдельных объектов я могу использовать 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 
+0

я узнал SVG гораздо больше подходит для этой работы, и использовать его для модуля Turtle. Это подсказка о траектории приближается к движениям черепах, и когда вы увеличиваете масштаб, линии остаются гладкими. В общем, сглаживание намного лучше. –

ответ

1

Чтобы избежать де «удвоения» эффект, который вы можете попробовать это:

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

Спасибо за предложение. Я отказался от холста в пользу SVG. И результат довольно приятен: http://www.transcrypt.org/live/turtle_site/turtle_site.html, особенно демо-версия мандалы. –