Можно ли создавать свои графические примитивы?

Форум пользователей пакета Mathematica

Модератор: Admin

dims12
Сообщения: 37
Зарегистрирован: Чт янв 30, 2003 1:23 am

Можно ли создавать свои графические примитивы?

Сообщение dims12 » Пн ноя 01, 2010 12:29 pm

Я хочу создать свою фигуру FigureOfMyOwn, которая бы рисовалась функцией Graphics и вела себя так же, как такие функции, как Circle или Line, то есть, чтобы они не преобразовывались автоматически во что-то другое при вычислении.

То есть, мне не подходит определить FigureOfMyOwn как функцию, которая возвращает стандартные примитивы.

Допустим, FigureOfMyOwn это окружность, с центром в первом аргументе и проходящая через второй.

Тогда определение

Код: Выделить всё

Unprotect[Graphics]
Graphics[x_FigureOfMyOwn] := Graphics[Circle[x[[1]], Norm[x[[2]] - x[[1]]]]]
Protect[Graphics]


частично работает:

Код: Выделить всё

Graphics[FigureOfMyOwn[{0, 0}, {1, 1}]]


но вот в таком виде:

Код: Выделить всё

Graphics[{Line[{{0, 0}, {1, 1}}], FigureOfMyOwn[{0, 0}, {1, 1}]}]

уже нет. Хотя с простым Circle получается:

Код: Выделить всё

Graphics[{Line[{{0, 0}, {1, 1}}], Circle[{0, 0}, Sqrt[2]]}]


Можно ли реализовать идею?

Gordon
Сообщения: 300
Зарегистрирован: Вт сен 08, 2009 8:16 pm

Сообщение Gordon » Вт ноя 02, 2010 11:44 am

omg

либо так

Код: Выделить всё

FigureOfMyOwn[a_, b_] := Circle[a, Norm[b - a]]
Graphics[{Line[{{0, 0}, {1, 1}}], FigureOfMyOwn[{0, 0}, {1, 1}]}]

либо

Код: Выделить всё

FigureOfMyOwn[x_] := Circle[x[[1]], Norm[x[[2]] - x[[1]]]]
Graphics[{Line[{{0, 0}, {1, 1}}], FigureOfMyOwn[{{0, 0}, {1, 1}}]}]

хотя можно все вместе :)

dims12
Сообщения: 37
Зарегистрирован: Чт янв 30, 2003 1:23 am

Сообщение dims12 » Вт ноя 02, 2010 11:34 pm

Нет, это не подходит, потому что так -- голова меняется (с FigureOfMyOwn на Circle), а мне надо, чтобы голова не менялась, я хочу анализировать её.

Gordon
Сообщения: 300
Зарегистрирован: Вт сен 08, 2009 8:16 pm

Сообщение Gordon » Ср ноя 03, 2010 12:43 am

попробуйте так

Код: Выделить всё

Unprotect[Graphics]
Graphics[x_FigureOfMyOwn] := Graphics[Circle[x[[1]], Norm[x[[2]] - x[[1]]]]]
Protect[Graphics]

Show[Graphics /@ {Line[{{0, 0}, {1, 1}}],
   FigureOfMyOwn[{0, 0}, {1, 1}]}]