Comment contrôler la forme de mes flèches? Le paquetage TikZ de LaTeX a une grande variété de styles de pointes de flèches prédéfinis, dont certains que jaimerais essayer de faire correspondre pour les figures Mathematica que jimporte dans un document LaTeX:
Mais le style de pointe de flèche par défaut de Mathematica ne se rapproche daucun de ces éléments. Par exemple,
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
donne
Les versions précédentes de Mathematica avaient des options pour contrôler la forme de la pointe de flèche, mais celles-ci semblent avoir disparu dans la version 8.0.
Comment puis-je faire correspondre la forme de mes pointes de flèche Mathematica aux styles de pointes de flèche LaTeX TikZ?
Commentaires
Réponse
Voici une Manipulate pour concevoir vous-même un 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} ] ]
Il est facile dajouter plus de points de contrôle si le besoin sen fait sentir.
Le graphique en pointe de flèche est placé dans la variable h. Notez quil contient une fonction Opacity pour une meilleure visibilité des points de contrôle. Vous devez le supprimer si vous voulez avoir une tête de flèche complètement saturée.
Quelques exemples générés avec ce Manipulate en utilisant:
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 ]
Le code des flèches se trouve dans h. Copiez simplement les graphiques ou le FullForm pour les stocker pour une utilisation ultérieure.
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 autre point de contrôle couvrira les formes les plus courantes:
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} ] ]
Commentaires
- Incroyable! Merci!
Réponse
Une source de formes de pointes de flèche est Graph qui est livré avec une liste de formes de pointes de flèches prédéfinies que vous pouvez définir à laide de loption EdgeShapeFunction. Vous pouvez obtenir les noms de ces formes en faisant quelque chose comme
arrowheadNames = GraphElementData["Edge"];
Malheureusement, ces noms en eux-mêmes sont inutiles dans Arrowheads. Heureusement, il existe un moyen dextraire les Graphics spécifications de ces pointes de flèches en convertissant un Graph en Graphics en utilisant Show et en extrayant les Arrowheads directives:
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]
Vous pouvez les utiliser dans Arrowheads comme suit:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Commentaires
- Je peux ' pour que ce code fonctionne plus.
- Pareil ici, sur Mathematica 10.1, ce code ne fonctionne plus.
- Pour cela pour travailler dans Mathematica 10, remplacez
GraphicsBoxparGraphics:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames]; - Il y a une erreur de frappe, Headlist est écrit au début avec un petit l « Headlist » à la fin avec un L majuscule « HeadList » …
- I lai corrigé, @Phil.
Arrowheads?StreamPlotait une miriade de différents styles de flèches intégrés).