Искажение масштаба Pycairo

Я изо всех сил пытаюсь нарисовать круг на прямоугольном фоне png. Всякий раз, когда я пытаюсь нарисовать круг, он растягивается в соответствии с масштабом моего изображения, что делает его эллипсом вместо круга.

Вот настройка:

#set background image surface = cairo.ImageSurface.create_from_png (image) context = cairo.Context (surface) WIDTH = cairo.ImageSurface.get_width(surface) HEIGHT = cairo.ImageSurface.get_height(surface) context.scale (WIDTH, HEIGHT) 

А вот функция рисования круга (координата x, координата y, радиус, значение цвета) и функции, используемые для позиционирования:

 def draw_node(cx,cy,r, rgb): context.arc(x_scale(cx), y_scale(cy), r, 0, 2 * math.pi) context.set_source_rgb(rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0) context.fill() context.stroke() def x_scale (x): width = 1000.0 return (x + .5) / width def y_scale (y): height = 1000.0 * HEIGHT / WIDTH return (y + .5) / height 

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

Большое спасибо.

вероятно, нет способа избежать этого context.arc будет рисовать эллипс, когда ваше масштабирование не является симметричным. с вашей x_scale (x) функцией вы только масштабируете центр круга, чтобы быть там, где он должен быть.

в качестве обходного пути я предлагаю масштабировать оба направления на одну и ту же сумму; x_max тем, что x_max и y_max оба будут равны 1 .

я бы изменил ваш код:

 context.scale(HEIGHT, HEIGHT) print('surface = 1 x {:1.2f}'.format(WIDTH/HEIGHT)) def draw_node(cx,cy,r, rgb): context.arc(cx, cy, r, 0, 2 * math.pi) context.set_source_rgb(rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0) context.fill() context.stroke() 

и не делайте никаких масштабирования (или масштабируйте на 1000 если это то, что вы предпочитаете).