System.Drawing.Matrix, я понимаю, что он делает, но как он работает? - PullRequest
1 голос
/ 05 августа 2009

Я использовал класс Matrix тысячу раз. У меня есть элементарное понимание математической математики, прошло много лет с тех пор, как у меня был урок по этому предмету. Но я не до конца понимаю, что этот класс делает под капотом для манипулирования точками в GraphicsPath.

Что, в частности, он делает там, в частности, в отношении GraphicsPaths? Или другой способ взглянуть на это, если бы класс Matrix не существовал, и мне пришлось создать свой собственный, как бы он выглядел и что бы он делал? (Я не создаю свою собственную, я просто хочу это понять)

Кроме того, кто-нибудь знает размеры матрицы, используемой в классе Matrix?

РЕДАКТИРОВАТЬ: я сузил его до следующего вызова в отражателе. Оттуда у меня буб поцелуй.

[DllImport("gdiplus.dll", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
internal static extern int GdipTransformPath(HandleRef path, HandleRef matrix);

Ответы [ 3 ]

1 голос
/ 05 августа 2009

В этом случае класс Matrix является матрицей двумерного преобразования. Матрица используется для масштабирования, поворота и / или перевода графического контура. Математика относительно прямолинейна. Вы можете посмотреть на это здесь: http://en.wikipedia.org/wiki/Transformation_matrix

1 голос
/ 05 августа 2009

Важно отметить, что если вы создаете свой собственный класс матрицы, который конвертирует туда и обратно в класс System.Drawing.Matrix, это то, что .NET one не использует наиболее часто используемый стандарт при преобразовании точек. 1001 *

Матрица .NET, похоже, транспонируется до того, как произойдет преобразование.

Также прочитайте фон здесь: http://www.codeproject.com/KB/recipes/psdotnetmatrix.aspx

0 голосов
/ 05 августа 2009

GraphicsPath - это, в основном, набор точек и флагов, которые объясняют, как точки связаны друг с другом. Класс матрицы просто применяет матрицу к этим точкам.

Вы можете реализовать то же самое: 1. Создайте новый пустой GraphicsPath 2. Используя GraphicsPathIterator, итерируйте пути (и подпути) 3. Взять каждую точку и применить матрицу 4. Добавьте эту точку к новому, GraphicsPath

Но не делай этого. Типы в GraphicsPath плохо документированы.

...