Hvordan kan jeg tilpasse pilens form til at matche almindelige LaTeX-stilarter?

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:

LaTeX-pileksempler

Men Mathematicas standardpil til pilspids kommer ikke nær nogen af disse. F.eks.

Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}] 

giver

Standard Mathematica-pil

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

  • Derudover skaleres Mathematica ' pile forskelligt fra LaTeX pilehoveder ved hjælp af en logik, jeg kan ' t skelne. Ideelt set vil jeg ' også sikre, at mine Mathematica-pile skalerer på samme måde som LaTeX-pile gør; men det er måske et separat spørgsmål.
  • Har du kigget på dokumentationen til Arrowheads?
  • Ja, naturligvis. Intet der fik mig i nærheden.
  • @Heike: det giver kun et eksempel på en brugerdefineret pilespids, men intet om foruddefinerede typer (selvom StreamPlot har en miriade af forskellige indbyggede pilestile).
  • Se dette spørgsmål – det viser, hvordan man definerer brugerdefinerede figurer, og indstil absolut pilestørrelse.

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

Mathematica-grafik

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 ] 

Mathematica-grafik

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

Mathematica-grafik

Mathematica-grafik

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] 

Mathematica-grafik

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] 

Mathematica-grafik

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 GraphicsBox med Graphics: 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *