Hvordan styrer jeg formen på mine pilehoveder? LaTeX “s TikZ-pakke har en bred vifte af foruddefinerede pilspidsformater, hvoraf nogle jeg gerne vil matche for Mathematica-figurer, som jeg importerer til et LaTeX-dokument:
Men Mathematicas standardpil til pilspids kommer ikke nær nogen af disse. F.eks.
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
giver
Tidligere versioner af Mathematica havde muligheder for at kontrollere pilespidsform, men de ser ud til at være væk i 8.0.
Hvordan kan jeg få formen på mine Mathematica-pilehoveder til at matche LaTeX TikZ-pilespidsformaterne? >
Kommentarer
Svar
Her er et Manipulate for at designe dig selv en 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} ] ]
Det er let at tilføje flere kontrolpunkter, hvis behovet opstår.
Pilehovedgrafikken placeres i variablen h. Bemærk, at den indeholder en Opacity -funktion for bedre synlighed af kontrolpunkterne. Du skal fjerne det, hvis du vil have et fuldt mættet pilehoved.
Nogle eksempler genereret med dette Manipulate ved hjælp af:
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 ]
Koden til pilehovederne findes i h. Kopier bare grafikken eller FullForm for at gemme den til senere brug.
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.}}]}]} ] *)
REDIGER
Et kontrolpunkt mere dækker de mest almindelige former:
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} ] ]
Kommentarer
- Fantastisk! Tak!
Svar
En kilde til pilehovedformer er Graph som kommer med en liste over foruddefinerede pilspidsformer, som du kan indstille ved hjælp af indstillingen EdgeShapeFunction. Du kan få navnene på disse figurer ved at gøre noget som
arrowheadNames = GraphElementData["Edge"];
Desværre er disse navne i sig selv ubrugelige i Arrowheads. Heldigvis er der en måde at udtrække Graphics specifikationerne for disse pilespidser ved at konvertere en Graph til Graphics ved hjælp af Show og udpakning af Arrowheads direktiverne:
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]
Du kan bruge disse i Arrowheads som følger:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Kommentarer
- Jeg kan ' For ikke at få denne kode til at fungere længere.
- Samme her, på Mathematica 10.1, fungerer denne kode ikke længere.
- Til dette for at arbejde i Mathematica 10 skal du erstatte
GraphicsBoxmedGraphics:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames]; - Der er en forkert indtastning, Headlist skrives i begyndelsen med en lille l “Headlist” i slutningen med en stor L “HeadList” …
- I har rettet det, @Phil.
Arrowheads?StreamPlothar en miriade af forskellige indbyggede pilestile).