Jak mohu ovládat tvar hlav šipek? Balíček TikZ v LaTeXu má širokou škálu předdefinovaných stylů šipek, z nichž některé bych se chtěl pokusit porovnat s postavami Mathematica, které importuji do dokumentu LaTeXu:
Výchozí styl šipky Mathematica se ale ani zdaleka nepodobá žádnému z nich. Například
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
výnosy
Starší verze Mathematica měly možnosti ovládání tvaru šipky, ale zdá se, že jsou pryč v 8.0.
Jak mohu získat tvar mých šipek Mathematica tak, aby odpovídal stylům šipek LaTeX TikZ?
Komentáře
Odpovědět
Zde je Manipulate navrhněte si Arrow:
DynamicModule[{top, baseMid, rightBase, outerMidRight, innerMidRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; rightBase = {1, -1} leftBase; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, leftBase}], BSplineCurve[{leftBase, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, rightBase}], BSplineCurve[{rightBase, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{leftBase, {-2, 1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ]
V případě potřeby je snadné přidat další kontrolní body.
Grafika šipky je vložena do proměnné h. Všimněte si, že obsahuje Opacity funkci pro lepší viditelnost kontrolních bodů. Pokud chcete mít plně nasycenou šipku, musíte ji odstranit.
Některé příklady generované pomocí tohoto Manipulate pomocí:
Graphics[ { Arrowheads[{{Automatic, 1, h /. Opacity[_] :> Sequence[]}}], Arrow /@ Table[{{0, 0}, {Sin[t], Cos[t]}}, {t, 0, 2 \[Pi] - 2 \[Pi]/20, 2 \[Pi]/20}] }, PlotRangePadding -> 0.2 ]
Kód hlav šipek naleznete v h. Stačí zkopírovat grafiku nebo FullForm a uložit ji pro pozdější použití.
h /. Opacity[_] :> Sequence[] // FullForm (* ==> Graphics[{FilledCurve[{BSplineCurve[{{-0.496, 0.}, {-1., 0.48}, {-2,1}}], BSplineCurve[{{-2, 1}, {-0.548, 0.44999999999999996}, {0, 0}}], BSplineCurve[{{0, 0}, {-0.548, -0.44999999999999996}, {-2, -1}}], BSplineCurve[{{-2, -1}, {-1., -0.48}, {-0.496, 0.}}]}]} ] *)
EDIT
Nejběžnější tvary pokryje ještě jeden kontrolní bod:
DynamicModule[{top, baseMid, outerMidRight, innerMidRight, innerBaseRight, outerBaseRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; innerBaseRight = {1, -1} innerBaseLeft; outerBaseRight = {1, -1} outerBaseLeft; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, innerBaseLeft}], Line[{innerBaseLeft, outerBaseLeft}], BSplineCurve[{outerBaseLeft, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, outerBaseRight}], Line[{outerBaseRight, innerBaseRight}], BSplineCurve[{innerBaseRight, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{innerBaseLeft, {-2, 1}}, Locator}, {{outerBaseLeft, {-2, 1.1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ]
Komentáře
- Úžasné! Děkujeme!
Odpověď
Jedním ze zdrojů tvarů šipek je Graph který obsahuje seznam předdefinovaných tvarů šipek, které můžete nastavit pomocí možnosti EdgeShapeFunction. Názvy těchto tvarů můžete získat tak, že uděláte něco podobného
arrowheadNames = GraphElementData["Edge"];
Bohužel jsou tato jména sama o sobě v Arrowheads. Naštěstí existuje způsob, jak extrahovat Graphics specifikace těchto šipek převedením Graph na Graphics pomocí Show a extrahování Arrowheads směrnic:
headlist = Flatten[Cases[ Show[Graph[{1 <-> 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, b_GraphicsBox :> ToExpression[b], Infinity, 1], Infinity, 1] & /@ arrowheadNames]; GraphicsGrid[Partition[headlist, 5, 5, {1, 1}, ""], Frame -> All]
Můžete je použít v Arrowheads následujícím způsobem:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
komentáře
- mohu ' Tento kód již nebude fungovat.
- Stejně jako v Mathematica 10.1 tento kód již nefunguje.
- Za tímto účelem pro práci v Mathematica 10 nahraďte
GraphicsBoxzaGraphics:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames]; - Dochází k překlepům, Headlist je napsán na začátku s malým l „Headlist“ na konci s velkým L „HeadList“ …
- I opravili jsme to, @Phil.
Arrowheads?StreamPlotmá Miriadu různých vestavěné styly šipek).