Come controllo la forma delle mie punte di freccia? Il pacchetto TikZ di LaTeX ha unampia varietà di stili di punte di freccia predefiniti, alcuni dei quali mi piacerebbe provare ad abbinare per le figure di Mathematica che sto importando in un documento LaTeX:
Ma lo stile predefinito delle punte di freccia di Mathematica non si avvicina affatto a nessuno di questi. Ad esempio,
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
produce
Le versioni precedenti di Mathematica avevano opzioni per controllare la forma della punta della freccia, ma quelle sembrano essere scomparse nella 8.0.
Come posso ottenere la forma delle mie punte di freccia di Mathematica per abbinare gli stili della punta della freccia LaTeX TikZ? >
Commenti
Risposta
Ecco un Manipulate
per progettare da soli una 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} ] ]
È facile aggiungere più punti di controllo in caso di necessità.
La grafica della punta della freccia viene inserita nella variabile h
. Tieni presente che contiene una funzione Opacity
per una migliore visibilità dei punti di controllo. È necessario rimuoverlo se si desidera avere una punta di freccia completamente satura.
Alcuni esempi generati con questo Manipulate
utilizzando:
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 ]
Il codice per le punte delle frecce si trova in h
. Copia semplicemente la grafica o FullForm
per memorizzarla per un uso successivo.
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
Un altro punto di controllo coprirà le forme più comuni:
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} ] ]
Commenti
- Incredibile! Grazie!
Risposta
Una fonte di forme a punta di freccia è Graph
che viene fornito con un elenco di forme di punte di freccia predefinite che puoi impostare utilizzando lopzione EdgeShapeFunction
. Puoi ottenere i nomi di queste forme eseguendo qualcosa del tipo
arrowheadNames = GraphElementData["Edge"];
Sfortunatamente, questi nomi da soli sono inutili in Arrowheads
. Fortunatamente esiste un modo per estrarre le Graphics
specifiche di queste punte di freccia convertendo un Graph
in Graphics
utilizzando Show
ed estraendo le Arrowheads
direttive:
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]
Puoi utilizzarli in Arrowheads
come segue:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Commenti
- Posso ' per far funzionare più questo codice.
- Lo stesso qui, su Mathematica 10.1, questo codice non funziona più.
- Per questo per lavorare in Mathematica 10, sostituisci
GraphicsBox
conGraphics
:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
- Si è verificato un errore di battitura, Headlist è scritto allinizio con una piccola l “Headlist” alla fine con una L maiuscola “HeadList” …
- I lho risolto, @Phil.
Arrowheads
?StreamPlot
abbia una miriade di stili freccia incorporati).