Зайдя настолько далеко, насколько это практически возможно с pic, постскриптум действительно является естественным выбором для этого.
Хорошо, я еще не разобрался с маркировкой, но вот обобщенная схема. Оказывается, вы просто помещаете центры в вершины правильного многоугольника для этого n.
Но некоторые из этих пространств становятся очень маленькими. Итак, я думаю о каком-то образце помеченных дуг, расходящихся по спирали. Возможно, радиус метки должен отражать глубину обозначенного раздела...
Изменить: я переработал код, так что в версии 1 появилась красивая страница с 15 диаграммами.
Редактировать: я только что изучил Википедию. Оказывается, то, что я называю диаграммой Венна с 4 ячейками, на самом деле вовсе не диаграмма Венна.
![4-пятиугольная диаграмма Эйлера](https://i.stack.imgur.com/YIlIR.jpg)
Это диаграмма Эйлера. Проблема в том, что нигде нельзя получить пересечение только двух областей с противоположных сторон диаграммы. Настоящая диаграмма с 4 ячейками становится странной независимо от того, как вы это делаете. Таким образом, объем ответа уменьшен по сравнению с тем, что я преследовал в последних двух правках.
Для диаграммы с двумя кругами лучшее размещение, которое я могу найти, определяется пересечением радиусов от центра диаграммы через центры кругов к краям с определяющими кругами, расположенными в центрах кругов. ![2-круговая диаграмма Эйлера с радиусами и повторяющимися определяющими окружностями](https://i.stack.imgur.com/jEoG7.jpg)
Для трехкруговой диаграммы наилучшее размещение, которое я могу найти, определяется пересечением радиусов (и повернутых радиусов) с приближениями повернутого треугольника к кругам и неповернутым треугольникам соответственно. ![3-круговая диаграмма Эйлера с аппаратом](https://i.stack.imgur.com/6MQhT.jpg)
Версию кода можно найти в предыдущей версии этого ответа. Я отправил расширенную версию в Usenet в ветке геодезические цветы< /а>. Но так как это излишне для этого ответа (и до сих пор на самом деле не рисует никаких меток и не возвращает их местоположения) и недостаточно для реальных обобщенных диаграмм Венна, мне нужно обрезать большую часть багажа, прежде чем подвергать этот вопрос к любым более длинным блокам кода.
Редактировать: я думаю, что почти слизал это. Эта программа содержит только те части предыдущей программы, которые необходимы для создания 2-х и 3-х диаграмм Венна с маленькими кружками в «идеальных» местах расположения меток. Для диаграммы с двумя ячейками решение действительно тривиально (удвоение определяющего радиуса). Для диаграммы с тремя ячейками решение равно cos(60) * радиус окружности + определяющий радиус, либо сначала умножая, либо сначала добавляя.
Изменить: Наконец-то ярлыки. Потребовалась некоторая хитрость в последнюю минуту, так как я использовал вращение матрицы, чтобы найти точки. Это означало, что когда я пытался печатать этикетки, все они были в странной ориентации. Таким образом, процедура "centershow" имеет немного больше, чем обычно. Он должен сбросить масштабные части текущей матрицы преобразования, оставив компоненты перевода в покое. Это означает, что где-то в начале выполнения нам нужно спрятать ориентированную матрицу в правильном масштабе.
(Редактировать: еще один способ получить текст прямо без изменения матрицы: transform
установить координаты устройства, установить ориентированную матрицу (в любом масштабе или переводе!), itransform
указать точку обратно на "новые" пользовательские координаты, а затем moveto
.)
%!
%cp:xy rad circ -
/circ {
currentpoint newpath
2 copy 5 -1 roll 0 360 arc stroke
moveto
} def
%rad n poly [pointlist]
/poly {
1 dict begin exch /prad exch def
[ exch
0 exch 360 exch div 359.9 {
[ exch
dup cos prad mul exch
sin prad mul
]
} for
]
end
} def
%[list] rad subcirc -
/subcirc {
1 dict begin /crad exch def gsave
currentpoint translate
{ aload pop moveto crad circ } forall
grestore end
} def
%[list] locate -
%draw little circles around each point
/locate {
gsave
currentpoint translate
0 0 moveto 5 circ
{ aload pop moveto 5 circ } forall
grestore
} def
%cp:xy (string) cshow -
/cshow {
gsave
currentpoint translate %0 0 moveto
matrix currentmatrix
dup 0 normal 0 4 getinterval %reset rotation, keep translation
putinterval setmatrix
dup true charpath flattenpath pathbbox
3 -1 roll sub 3 1 roll sub
2 div exch -2 div moveto show
grestore
} def
%[list] [labels] label -
%print label text centered on each point
/label {
gsave
currentpoint translate
0 1 3 index length 1 sub {
2 index 1 index get aload pop moveto
2 copy get cshow pop
} for
pop pop
grestore
} def
%[x0 y0] [x1 y1] pyth-dist radius
/pyth-dist {
aload pop 3 -1 roll aload pop % x1 y1 x0 y0
exch % x1 y1 y0 x0
3 1 roll sub dup mul % x1 x0 dy^2
3 1 roll sub dup mul % dy^2 dx^2
add sqrt
} def
/rotw { 180 n div rotate } def
%cp:xy rad n venn -
%make the circles intersect the opposite point of def poly
/venn {
3 dict begin /n exch def /vrad exch def
vrad n poly
dup 0 get exch
dup length 2 idiv get
pyth-dist /crad exch def
%vrad crad n ven
vrad n poly crad subcirc %the Venn circles
[[0 0]] [(All)] label
n 2 eq {
%vrad 2 mul n poly locate
vrad 2 mul n poly
[(A) (B)] label
}{
n 3 eq {
%vrad crad 60 cos mul add n poly locate
vrad crad 60 cos mul add n poly
[ (A) (B) (C) ] label
%gsave rotw vrad crad add 60 cos mul n poly locate grestore
gsave rotw vrad crad add 60 cos mul n poly
[ (A^B) (B^C) (A^C) ] label
grestore
} if
} ifelse
end
} def
/normal matrix currentmatrix def
/in{72 mul}def
/Palatino-Roman 20 selectfont
4.25 in 8.25 in moveto
1 in 2 venn
4.25 in 3.5 in moveto
1 in 3 venn
showpage
И ghostscript выдает (gs -sDEVICE=jpeggray -sOutputFile=venlabel.jpg v4.ps
): ![2- и 3-диаграммы Венна с метками](https://i.stack.imgur.com/3DxVX.jpg)
person
luser droog
schedule
23.09.2011