2013-11-11 3 views
7

После прочтения Adobe PDF 1.7 (ISO 32000-1:2008) specification у меня все еще не получается понять, как правильно создать матрицу преобразования.PDF 1.7 - Как точно работает CTM (матрица трансформации тока)?

Спецификация в разделе 4.2/4.3 состояние следующее:

• Переводы определяются как [1 0 0 1 Тх ф], где ТХ и Ty являются расстояния, чтобы перевести происхождение от координаты системы в горизонтальных и вертикальных размеров, соответственно.
• Масштабирование получается [sx 0 0 sy 0 0]. Это масштабирует координаты , так что 1 единица в горизонтальном и вертикальном размерах новой системы координат имеет тот же размер, что и единицы sx и sy, соответственно в предыдущей системе координат.
• Вращения производятся с помощью [ cosθθθθθθθθθθθθθθθθθθθθθθθθθ, что приводит к вращению осей системы координат на угол θ против часовой стрелки.
• Skew is , указанный в [1 tan α tan β 1 0 0], что искажает ось x на угол и ось y на угол β.

Учитывая это, как точно можно использовать преобразования в последовательности друг с другом?

Я могу успешно использовать Translation и Rotation вместе, но когда я пытаюсь использовать Scaling или Skewing вещи идут серьезно неправильно. Возможно, я неправильно использую CTM или, может быть, даже моя математика отключена. Я пытаюсь создать текст в координатном положении (50, 50) с вращением 45 градусов и масштабированием 2 (в указанном порядке). Причина, по которой я указываю « В этом порядке», объясняется тем, что спецификация заявляет, что упорядочение преобразований имеет значение (спецификация дает графический пример различий, основанных на упорядочении преобразования). Итак, как бы выглядел бы объект потока и/или как применима матричная математика?

Рабочая (Трансформация (50, 50) + 45 градусов вращения)

[ 1 0 0 ] [ 0.707 0.707 0 ] [ 0.707 0.707 0 ] 
[ 0 1 0 ] x [ -0.707 0.707 0 ] = [ -0.707 0.707 0 ] 
[ 50 50 1 ] [ 0  0  1 ] [ 50.000 50.000 1 ] 

BT 
    0.707 0.707 -0.707 0.707 50 50 Tm 
    /F1 36 Tf 
    (Hello, World!) Tj 
ET 

Когда я пытаюсь сделать матричное умножение добавить масштабирование, это не похоже на работу:

[ 0.707 0.707 0 ] [ 2 0 0 ] [ 1.414 1.414 0 ] 
[ -0.707 0.707 0 ] x [ 0 2 0 ] = [ -1.414 1.414 0 ] 
[ 50.000 50.000 1 ] [ 0 0 1 ] [ 100.000 100.000 1 ] 

Математика кажется правильной, за исключением того, что текст начинается с координаты (100, 100) вместо (50, 50). Мне это кажется не правильным, так как я пытаюсь начать с (50, 50), повернуться на 45 градусов, затем масштабировать на 2.

+0

BTW, вы выполнили первое умножение матрицы наоборот, поворот x-перевод дает ваш результат, а не перевод x вращения, как вы писали. – mkl

+0

А вы правы, сэр. –

ответ

6

Математика кажется правильной, за исключением текста начинается с координаты (100, 100) вместо (50, 50). Это просто не кажется правильным для меня, так как я пытаюсь начать с (50, 50), поворот на 45 градусов, а затем масштабировать его на 2.

Но что делает имеет смысл. Если вы сначала переводите (50, 50), а затем уменьшаете на два, вы фактически переводите на (50, 50) раз два, т. Е. (100, 100).

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

[ 2 0 0 ] [ 0.707 0.707 0 ] [ 1.414 1.414 0 ] 
[ 0 2 0 ] x [ -0.707 0.707 0 ] = [ -1.414 1.414 0 ] 
[ 0 0 1 ] [ 50.000 50.000 1 ] [ 50.000 50.000 1 ] 

Некоторые руки завивки: То, что вы имели в виду, когда вы сказали

Я пытаюсь создать текст в координате (50, 50) с поворотом на 45 градусов и масштабирования 2 (в указанном порядке).

несомненно, что после перевода на (50, 50) следующие операции должны оставить фиксированную точку (50, 50). Но это не то, что делают другие операции, они фиксируют начало координат (0,0). Таким образом, вы должны сначала масштабировать и поворачивать свой объект в начале координат и только после этого переводить его, по крайней мере, чтобы соответствовать тому, что вы имели в виду ...

+0

Итак, я правильно выполнял преобразования в коде, но я просто не передал то, что хотел в своей голове (т. Е. Текст в два раза больше обычного размера под углом 45 градусов в точке (50, 50))? –

+0

Кроме того, имеет ли стандарт PDF 1.7 (ISO 32000-1: 2008) способ автоматического умножения матрицы для меня, или мне нужно его кодировать? –

+1

Вам не нужно умножать матрицы самостоятельно. Если вы используете операции для манипуляции ctm, а не манипуляции с текстовой матрицей, они объединяются: новый умножается на существующий ctm с левой стороны. – mkl

3

Оператор Tm используется для , устанавливая текстовую матрицу, которая комбинируется с текущей матрицей трансформации при визуализации текста.

Вместо этого вы можете использовать оператор cm (concatenate matrix), который будет выполнять все математические операции для вас. Если вы хотите сохранить исходную матрицу, которая использовалась до начала вывода текста, вы можете использовать операторы q/Q для сохранения/восстановления текущего графического состояния.