Hvordan kan jeg tilpasse pilspissformen til å matche vanlige LaTeX-stiler?

Hvordan kontrollerer jeg formen på pilhodene mine? LaTeX «s TikZ-pakke har et bredt utvalg av forhåndsdefinerte pilspisser, hvorav noen jeg vil prøve å matche for Mathematica-figurer jeg importerer til et LaTeX-dokument:

LaTeX pileksempler

Men Mathematicas standard pilspissstil kommer ikke i nærheten av noen av disse. For eksempel

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

gir

Standard Mathematica-pil

Tidligere versjoner av Mathematica hadde muligheter for å kontrollere pilenes form, men de ser ut til å være borte i 8.0.

Hvordan kan jeg få formen til Mathematica-pilene mine til å matche LaTeX TikZ-pilspilene?

Kommentarer

  • I tillegg skaleres Mathematica ' pilene på en annen måte enn LaTeX pilspisser, ved hjelp av en logikk jeg kan ' t skjelne. Ideelt sett vil jeg ' også sørge for at Mathematica-pilene mine skaleres på samme måte som LaTeX-pilene gjør; men det er kanskje et eget spørsmål.
  • Har du sett på dokumentasjonen til Arrowheads?
  • Ja, naturlig. Ingenting der fikk meg i nærheten.
  • @Heike: det gir bare ett eksempel for en tilpasset pilspiss, men ingenting om forhåndsdefinerte typer (selv om StreamPlot har en miriade av forskjellige innebygde pilstiler).
  • Se dette spørsmålet – det vil vise hvordan du definerer egendefinerte former, og angi absolutte pilspissstørrelser.

Svar

Her er et Manipulate for å designe deg 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-grafikk

Det er enkelt å legge til flere kontrollpunkter hvis behovet oppstår.

Grafikken til pilspissen er satt i variabelen h. Merk at den inneholder en Opacity -funksjon for bedre synlighet av kontrollpunktene. Du må fjerne det hvis du vil ha et fullstendig mettet pilhode.

Noen eksempler generert med dette Manipulate ved å bruke:

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-grafikk

Koden for pilhodene finnes i h. Bare kopier grafikken eller FullForm for å lagre den for senere bruk.

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
Ett kontrollpunkt til vil dekke de vanligste figurene:

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-grafikk

Mathematica-grafikk

Kommentarer

  • Utrolig! Takk!

Svar

En kilde til pilspissformer er Graph som kommer med en liste over forhåndsdefinerte pilspissformer som du kan angi ved hjelp av alternativet EdgeShapeFunction. Du kan få navnene på disse figurene ved å gjøre noe sånt som

arrowheadNames = GraphElementData["Edge"]; 

Dessverre er disse navnene ubrukelige i Arrowheads. Heldigvis er det en måte å trekke ut Graphics spesifikasjonene til disse pilspissene ved å konvertere en Graph til Graphics bruker Show og trekker ut Arrowheads -direktivene:

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-grafikk

Du kan bruke 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-grafikk

Kommentarer

  • Jeg kan ' For ikke å få denne koden til å fungere lenger.
  • Samme her, på Mathematica 10.1, fungerer ikke denne koden lenger.
  • For dette for å jobbe i Mathematica 10, erstatt GraphicsBox med Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Det er feil skriving, Headlist skrives i begynnelsen med en liten l «Headlist» på slutten med store L «HeadList» …
  • I har fikset det, @Phil.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *