Domanda

Sembra che date le informazioni in stroke_extents() e le funzioni translate(x, y) e scale(x, y), dovrei essere in grado di prendere qualsiasi cairo arbitraria (sto usando pycairo) percorso e il "best fit" esso. In altre parole, centrarlo ed espanderlo per riempire lo spazio disponibile.

Prima di disegnare il percorso, ho scalato la tela in modo che l'origine è l'angolo inferiore sinistro, fino è y +, destra è x +, e l'altezza e la larghezza sono entrambi 1. In tali condizioni, questo codice sembra per scalare correttamente il percorso:

# 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)

Non posso per la vita di me capire la traduzione però. Esiste un approccio più semplice? Come posso "best fit" un percorso di cairo sulla sua tela?

Si prega di chiedere chiarimenti se qualcosa non è chiaro in questa questione.

È stato utile?

Soluzione

Ho trovato una soluzione che mi piace (almeno per i miei scopi). Basta creare una nuova superficie e dipingere la vecchia superficie a quello nuovo.

Altri suggerimenti

Per quanto riguarda solo la scala, ho fatto una cosa simile per regolare l'immagine all'interno di una scatola con un approccio "best-fit". Come su scala, ecco il codice:

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'immagine viene disegnata allineata alle origini (in alto a sinistra nel mio caso), quindi forse una cosa simile dovrebbe essere fatto per tradurre il percorso.

Inoltre, questo best fit intende tutelare proporzioni. Se si vuole allungare la figura, utilizzare ciascuno dei rapporti al posto della variabile 'scale'.

Spero di aver aiutato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top