Hur kontrollerar jag formen på mina pilhuvuden? LaTeX ”s TikZ-paket har ett brett utbud av fördefinierade pilspetsstilar, varav några jag vill försöka matcha för Mathematica-figurer som jag importerar till ett LaTeX-dokument:
Men Mathematicas standardpilspetsstil kommer ingenstans nära någon av dessa. Till exempel
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
ger
Tidigare versioner av Mathematica hade alternativ för att styra pilspetsform, men de verkar vara borta i 8.0.
Hur kan jag få formen på mina Mathematica-pilspetsar så att de matchar LaTeX TikZ-pilspetsstilarna?
Kommentarer
Svar
Här är ett Manipulate
för att designa dig själv en 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} ] ]
Det är enkelt att lägga till fler kontrollpunkter om behov uppstår.
Grafen för pilspetsen placeras i variabeln h
. Observera att den innehåller en Opacity
-funktion för bättre synlighet för kontrollpunkterna. Du måste ta bort det om du vill ha ett helt mättat pilhuvud.
Några exempel som skapats med detta Manipulate
med:
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 ]
Koden för pilhuvuden finns i h
. Kopiera bara grafiken eller FullForm
för att lagra den för senare användning.
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
Ytterligare en kontrollpunkt täcker de vanligaste formerna:
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} ] ]
Kommentarer
- Fantastiskt! Tack!
Svar
En källa till pilspetsformer är Graph
som kommer med en lista över fördefinierade pilspetsformer som du kan ställa in med alternativet EdgeShapeFunction
. Du kan få namnen på dessa former genom att göra något liknande
arrowheadNames = GraphElementData["Edge"];
Tyvärr är dessa namn i sig själva värdelösa i Arrowheads
. Lyckligtvis finns det ett sätt att extrahera Graphics
specifikationerna för dessa pilspetsar genom att konvertera en Graph
till Graphics
använder Show
och extraherar Arrowheads
-direktiven:
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]
Du kan använda dessa i Arrowheads
enligt följande:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Kommentarer
- Jag kan ' För att den här koden inte ska fungera längre.
- Samma här, på Mathematica 10.1, fungerar den här koden inte längre.
- För detta för att arbeta i Mathematica 10, ersätt
GraphicsBox
medGraphics
:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
- Det finns en felaktig skrivning, Headlist skrivs i början med en liten l ”Headlist” i slutet med versaler L ”HeadList” …
- I har fixat det, @Phil.
Arrowheads
?StreamPlot
har en miriad av olika inbyggda pilstilar).