3

長方形の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

体系的なスケーリングの問題を解決する方法についてのアドバイスを特に感謝しますが、既存のセットアップの範囲内で円を描く方法についてのアドバイスもいただければ幸いです。

どうもありがとうございました。

4

1 に答える 1

1

context.arcスケーリングが対称でない場合、楕円を描画することを回避する方法はおそらくありません。あなたのx_scale (x)関数では、円の中心をあるべき場所にスケーリングするだけです。

回避策として、両方の方向を同じ量だけスケーリングすることをお勧めします。したがって、x_maxy_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場合はスケーリングしてください)。

于 2015-07-10T22:23:19.487 に答える