¿Cómo controlo la forma de las puntas de mis flechas? El paquete TikZ de LaTeX tiene una amplia variedad de estilos de punta de flecha predefinidos, algunos de los cuales me gustaría tratar de hacer coincidir con las cifras de Mathematica que estoy importando en un documento LaTeX:
Pero el estilo de punta de flecha predeterminado de Mathematica no se acerca a ninguno de estos. Por ejemplo,
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
produce
Las versiones anteriores de Mathematica tenían opciones para controlar la forma de la punta de flecha, pero esas parecen desaparecer en 8.0.
¿Cómo puedo hacer que la forma de mis puntas de flecha de Mathematica coincida con los estilos de punta de flecha de LaTeX TikZ?
Comentarios
Respuesta
Aquí hay un Manipulate
para diseñar usted mismo 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} ] ]
Es fácil agregar más puntos de control si surge la necesidad.
Los gráficos de punta de flecha se colocan en la variable h
. Tenga en cuenta que contiene una función Opacity
para una mejor visibilidad de los puntos de control. Debe eliminar eso si desea tener una punta de flecha completamente saturada.
Algunos ejemplos generados con este Manipulate
usando:
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 ]
El código para las puntas de flecha se puede encontrar en h
. Simplemente copie los gráficos o FullForm
para almacenarlos para su uso posterior.
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 punto de control más cubrirá las formas más comunes:
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} ] ]
Comentarios
- ¡Increíble! ¡Gracias!
Respuesta
Una fuente de formas de punta de flecha es Graph
que viene con una lista de formas de punta de flecha predefinidas que puede configurar usando la opción EdgeShapeFunction
. Puede obtener los nombres de estas formas haciendo algo como
arrowheadNames = GraphElementData["Edge"];
Desafortunadamente, estos nombres por sí mismos son inútiles en Arrowheads
. Afortunadamente, hay una manera de extraer las Graphics
especificaciones de estas puntas de flecha convirtiendo un Graph
en Graphics
usando Show
y extrayendo las Arrowheads
directivas:
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]
Puede usarlos en Arrowheads
de la siguiente manera:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Comentarios
- Puedo ' No haga que este código funcione más.
- Lo mismo aquí, en Mathematica 10.1, este código ya no funciona.
- Para esto para trabajar en Mathematica 10, reemplace
GraphicsBox
conGraphics
:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
- Hay un error de escritura, la lista principal está escrita al principio con una pequeña l «Lista principal» al final con una L mayúscula «Lista principal» …
- I lo he arreglado, @Phil.
Arrowheads
?StreamPlot
tiene una miríada de diferentes estilos de flecha incorporados).