2014-01-06 3 views
2

Я рисую простой прямоугольник, используя постскриптум со следующимкоманда Concat на языке приписки

1 -1 scale 
0 -300 translate 
newpath 88.9 117.25 moveto 131.6 117.25 lineto 
88.9 259.75 lineto closepath fill 88.9 117.25 moveto 111.4 94.75 
lineto154.1 94.75 lineto 131.6 117.25 lineto closepath fill 131.6 
117.25 moveto 154.1 94.75 lineto 154.1 237.25 lineto 131.6 259.75 
lineto closepath fill 
%%EndDocument 

Результатом является 3D-прямоугольником.

Но когда я добавляю следующий код, прямоугольник становится наклонным под некоторым углом.

[ 0.9999999 0 -1 1 261 0 ] concat 

Я могу понять, что это поведение вызвано из-за значений, используемых в матрице, объединенной с CTM. Может ли кто-нибудь объяснить использование значений в приведенной выше матрице и как это влияет на поведение чертежа?

Редактировать:

Большое спасибо за информацию. На самом деле, я конвертирую растровое изображение в eps, используя пост-скрипт. Для этого я преобразовываю все операции, выполняемые на объекте Graphics, для рисования растрового изображения в их эквивалентную команду post script.

Я конвертирую g.Transform=matrix в C# как [ matrix.Elements[0] ...... [matrix.Elements[5] ] concat в почтовом скрипте. Из того, что я googled, оба выглядят похожими на меня по функциональности, но результат нарисованных eps отличается от растрового изображения. Итак, я хотел знать, как работает concat-преобразование матрицы postscript. Кто-нибудь может объяснить, что происходит с моим подходом к конвертации в eps?

+0

Матрицы преобразования описаны в руководстве: http://partners.adobe.com/public/developer/en/ps/PLRM.pdf –

+0

Работает по матричному умножению. Ваша матрица должна быть [1 0 0 1 261 0], если вектор ai + bj не ортогонален ci + di, тогда ваша модель перекошена, период. полная остановка. Просто i + j не ортогонален i. Возможно ли, что ваша матрица транспонирована, потому что математическая матрица работает в обоих направлениях, соответствующих правилу A * B = (BT * AT) T, где T - операция транспонирования. – joojaa

+0

Я думаю, проблема в том, что g.Transform заменяет матрицу новой, но concat использует матрицу матричного умножения * CTM (Текущая матрица преобразования). Я думаю, что конкатенирование CTM * -матрицы в постскриптуме исправит это. Может ли кто-нибудь предложить, как я могу это достичь. – Kira

ответ

5

CTM - это ток Transformation Matrix, который обычно представляет собой матрицу 3x3. В Postscript он представлен как массив из 6 элементов, поскольку 3 элемента в CTX 3x3 являются постоянными. Массив Postscript CTM

[a b c d tx ty] 

соответствует 3x3 CTM матрицы

a b 0 
c d 0 
tx ty 1 

хотя это часто рассматривается в транспонированной форме (как в связанном статье):

a c tx 
b d ty 
0 0 1 

В любом случае, tx и ty управляющий перевод и другие значения объединяются для других преобразований. Некоторые модели abcd приводят к названным преобразованиям: поворот, масштабирование, отражение и сдвиг. Тот, который вы даете, соответствует шаблону сдвига (если мы обрабатываем 0.9999999 как 1): 1 0 k 1, где k - это величина сдвига, которая равна -1 в вашем случае.

+0

Спасибо за информацию о матрице преобразования. Это помогло мне решить мою проблему – Kira