Hvordan kontrollerer jeg formen på pilhodene mine? LaTeX «s TikZ-pakke har et bredt utvalg av forhåndsdefinerte pilspisser, hvorav noen jeg vil prøve å matche for Mathematica-figurer jeg importerer til et LaTeX-dokument:
Men Mathematicas standard pilspissstil kommer ikke i nærheten av noen av disse. For eksempel
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
gir
Tidligere versjoner av Mathematica hadde muligheter for å kontrollere pilenes form, men de ser ut til å være borte i 8.0.
Hvordan kan jeg få formen til Mathematica-pilene mine til å matche LaTeX TikZ-pilspilene?
Kommentarer
Svar
Her er et Manipulate
for å designe deg selv 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 er enkelt å legge til flere kontrollpunkter hvis behovet oppstår.
Grafikken til pilspissen er satt i variabelen h
. Merk at den inneholder en Opacity
-funksjon for bedre synlighet av kontrollpunktene. Du må fjerne det hvis du vil ha et fullstendig mettet pilhode.
Noen eksempler generert med dette Manipulate
ved å bruke:
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 for pilhodene finnes i h
. Bare kopier grafikken eller FullForm
for å lagre den for senere bruk.
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
Ett kontrollpunkt til vil dekke de vanligste figurene:
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
- Utrolig! Takk!
Svar
En kilde til pilspissformer er Graph
som kommer med en liste over forhåndsdefinerte pilspissformer som du kan angi ved hjelp av alternativet EdgeShapeFunction
. Du kan få navnene på disse figurene ved å gjøre noe sånt som
arrowheadNames = GraphElementData["Edge"];
Dessverre er disse navnene ubrukelige i Arrowheads
. Heldigvis er det en måte å trekke ut Graphics
spesifikasjonene til disse pilspissene ved å konvertere en Graph
til Graphics
bruker Show
og trekker ut Arrowheads
-direktivene:
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 bruke disse i Arrowheads
som følger:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Kommentarer
- Jeg kan ' For ikke å få denne koden til å fungere lenger.
- Samme her, på Mathematica 10.1, fungerer ikke denne koden lenger.
- For dette for å jobbe i Mathematica 10, erstatt
GraphicsBox
medGraphics
:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
- Det er feil skriving, Headlist skrives i begynnelsen med en liten l «Headlist» på slutten med store L «HeadList» …
- I har fikset det, @Phil.
Arrowheads
?StreamPlot
har en miriade av forskjellige innebygde pilstiler).