Как я могу "наилучшим образом соответствовать" произвольному пути в Каире (Пикаиро)? - PullRequest
1 голос
/ 19 февраля 2010

Похоже, что, учитывая информацию в stroke_extents() и функциях translate(x, y) и scale(x, y), я должен иметь возможность выбрать любой произвольный путь Каира (я использую pycairo) и «наилучшим образом подобрать» его. Другими словами, отцентрируйте его и разверните, чтобы заполнить доступное пространство.

Перед отрисовкой пути я масштабировал холст так, чтобы его начало было левым нижним углом, вверх - y +, справа - x +, а высота и ширина равны 1. Учитывая эти условия, кажется, что этот код кажется для правильного масштабирования пути:

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

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

Пожалуйста, попросите разъяснений, если что-то неясно в этом вопросе.

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Я нашел решение, которое мне нравится (по крайней мере, для моих целей). Просто создайте новую поверхность и закрасьте старую поверхность новой.

0 голосов
/ 01 апреля 2011

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

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

Изображение выровнено по центру относительно начала координат (в верхнем левом углу в моем случае), поэтому, возможно, аналогичную вещь необходимо сделать для перевода пути.

Кроме того, это лучшее соответствие предназначено для сохранения соотношения сторон.Если вы хотите растянуть фигуру, используйте каждое из соотношений вместо переменной 'scale'.

Надеюсь, я помог

...