Страница 1 из 1

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

Добавлено: Пн ноя 01, 2010 12:29 pm
dims12
Я хочу создать свою фигуру 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]]}]


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

Добавлено: Вт ноя 02, 2010 11:44 am
Gordon
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}}]}]

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

Добавлено: Вт ноя 02, 2010 11:34 pm
dims12
Нет, это не подходит, потому что так -- голова меняется (с FigureOfMyOwn на Circle), а мне надо, чтобы голова не менялась, я хочу анализировать её.

Добавлено: Ср ноя 03, 2010 12:43 am
Gordon
попробуйте так

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

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}]}]