Comment puis-je « meilleur ajustement » un chemin de cairo arbitraire (pycairo)?
Question
Il semble que compte tenu des informations dans stroke_extents()
et les fonctions de translate(x, y)
et scale(x, y)
, je devrais être en mesure de prendre tout chemin cairo arbitraire (j'utilise de pycairo) et « meilleur ajustement », il. En d'autres termes, centre et l'étendre à remplir l'espace disponible.
Avant de dessiner le chemin, j'ai escaladé la toile de telle sorte que l'origine est le coin inférieur gauche, en haut est y +, droit est x +, et la hauteur et la largeur sont tous deux 1. Compte tenu de ces conditions, le code semble à l'échelle correctement le chemin:
# cr is the canvas
extents = cr.stroke_extents()
x_size = abs(extents[0]) + abs(extents[2])
y_size = abs(extents[1]) + abs(extents[3])
cr.scale(1.0 / x_size, 1.0 / y_size)
Je ne peux pas pour la vie de me le Translating bien. Y at-il une approche plus simple? Comment puis-je « meilleur ajustement » un chemin de cairo sur sa toile?
S'il vous plaît demander des éclaircissements si tout est clair dans cette question.
La solution
Je l'ai trouvé une solution qui me plaît (au moins pour mes besoins). Il suffit de créer une nouvelle surface et peindre la surface ancienne à la nouvelle.
Autres conseils
En ce qui concerne l'échelle seulement, je l'ai fait une chose semblable à régler une image dans une boîte avec une approche « mieux adaptée ». Comme au sujet de l'échelle, voici le code:
available_width = 800
available_height = 600
path_width = 500
figure_height = 700
# formulas
width_ratio = float(available_width)/path_width
height_ratio = float(available_height)/figure_height
scale = min(height_ratio, width_ratio)
# result
new_path_width = path_width*scale
new_figure_height = figure_height*scale
print new_path_width, new_figure_height
L'image est dessiné aligné sur l'origine (en haut à gauche dans mon cas), alors peut-être devrait être fait une chose semblable à traduire le chemin.
En outre, ce meilleur ajustement est destiné à préserver le rapport d'aspect. Si vous voulez étirer la figure, utilisez chacun des rapports au lieu de la variable « échelle ».
Je l'ai aidé l'espoir