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
GraphicsBox
parGraphics
: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
?StreamPlot
ait une miriade de différents styles de flèches intégrés).