Jak mohu přizpůsobit tvar šipky tak, aby odpovídal běžným stylům LaTeXu?

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:

Příklady šipek 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

Výchozí šipka Mathematica

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

  • Kromě toho jsou šipky Mathematica ' škálovány odlišně od šipek LaTeXu pomocí logiky, kterou mohu ' nerozlišujeme. V ideálním případě bych ' rád také zajistil, že moje šipky Mathematica se budou měnit stejně, jako to dělají šipky LaTeXu; ale to je možná samostatná otázka.
  • Podívali jste se na dokumentaci Arrowheads?
  • Ano, přirozeně. Nic mě tam nepřiblížilo.
  • @Heike: to dává pouze jeden příklad pro vlastní šipku, ale nic o předdefinovaných typech (ačkoli StreamPlot má Miriadu různých vestavěné styly šipek).
  • Viz tuto otázku – ukáže, jak definovat vlastní tvary, a nastavit absolutní velikosti šipek.

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

grafiku Mathematica

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 ] 

grafika Mathematica

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

Grafika Mathematica

Grafika Mathematica

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] 

Grafika Mathematica

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] 

grafika Mathematica

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 GraphicsBox za Graphics: 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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *