Come posso personalizzare la forma della punta della freccia in modo che corrisponda agli stili LaTeX comuni?

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:

Esempi di frecce 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

Freccia Mathematica predefinita

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

  • Inoltre, le frecce di Mathematica ' sono ridimensionate in modo diverso dalle punte di freccia LaTeX, utilizzando una logica che posso ' t discernere. Idealmente, ' vorrei anche assicurarmi che le mie frecce di Mathematica si adattino allo stesso modo delle frecce LaTeX; ma questa è forse una domanda a parte.
  • Hai esaminato la documentazione di Arrowheads?
  • Sì, naturalmente. Niente mi ha avvicinato.
  • @Heike: questo fornisce solo un esempio per una punta di freccia personalizzata, ma niente sui tipi predefiniti (sebbene StreamPlot abbia una miriade di stili freccia incorporati).
  • Vedi questa domanda : mostrerà come definire forme personalizzate, e imposta le dimensioni assolute della punta della freccia.

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

grafica Mathematica

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

Mathematica graphics

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

Grafica Mathematica

Grafica Mathematica

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] 

Grafica Mathematica

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] 

Mathematica graphics

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 con Graphics: 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *