Cum pot personaliza forma vârfului de săgeată pentru a se potrivi stilurilor comune LaTeX?

Cum controlez forma capetelor săgeții mele? Pachetul TikZ al LaTeX are o mare varietate de stiluri predefinite de vârf de săgeată, dintre care unele aș dori să încerc să le potrivesc pentru cifrele Mathematica pe care le import într-un document LaTeX:

Exemple de săgeți LaTeX

Dar stilul implicit al vârfului de săgeată al lui Mathematica nu se apropie de niciunul dintre acestea. De exemplu,

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

produce

Săgeată implicită Mathematica

Versiunile anterioare ale Mathematica aveau opțiuni pentru controlul formei vârfurilor de săgeată, dar acestea par să fi dispărut în 8.0.

Cum pot obține forma vârfurilor de săgeată Mathematica pentru a se potrivi cu stilurile LaTeX TikZ de săgeată?

Comentarii

  • În plus, săgețile Mathematica ' sunt scalate diferit de vârfurile săgeților LaTeX, folosind o logică pe care o pot ' t discern. În mod ideal, ' aș dori să mă asigur, de asemenea, că săgețile mele Mathematica scalează la fel ca săgețile LaTeX; dar aceasta este probabil o întrebare separată.
  • Ați analizat documentația Arrowheads?
  • Da, desigur. Nimic nu m-a apropiat.
  • @Heike: asta oferă doar un exemplu pentru o vârf de săgeată personalizat, dar nimic despre tipurile predefinite (deși StreamPlot are o miriadă diferită stiluri de săgeată încorporate).
  • Consultați această întrebare – va arăta cum să definiți forme personalizate, și setați dimensiunile absolute ale vârfului de săgeată.

Răspuns

Iată un Manipulate pentru a vă crea 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} ] ] 

Grafică Mathematica

Este ușor să adăugați mai multe puncte de control dacă apare nevoia.

Grafica cu vârful săgeții este plasată în variabila h. Rețineți că conține o funcție Opacity pentru o mai bună vizibilitate a punctelor de control. Trebuie să eliminați acest lucru dacă doriți să aveți un cap de săgeată complet saturat.

Câteva exemple generate cu acest Manipulate folosind:

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 ] 

Grafică Mathematica

Codul pentru capetele săgeții poate fi găsit în h. Doar copiați grafica sau FullForm pentru a o stoca pentru o utilizare ulterioară.

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
Încă un punct de control va acoperi cele mai frecvente forme:

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

Grafică Mathematica

Grafică Mathematica

Comentarii

  • Uimitor! Mulțumim!

Răspuns

O sursă de forme de vârf de săgeată este Graph care vine cu o listă de forme de vârf de săgeată predefinite pe care le puteți seta folosind opțiunea EdgeShapeFunction. Puteți obține numele acestor forme făcând ceva de genul

arrowheadNames = GraphElementData["Edge"]; 

Din păcate, aceste nume de la sine sunt inutile în Arrowheads. Din fericire există o modalitate de a extrage Graphics specificațiile acestor vârfuri de săgeți prin conversia unui Graph în Graphics folosind Show și extragerea directivelor Arrowheads:

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] 

Grafică Mathematica

Puteți utiliza acestea în Arrowheads după cum urmează:

grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All] 

Grafică Mathematica

Comentarii

  • Pot ' nu mai funcționează acest cod.
  • La fel și aici, pe Mathematica 10.1, acest cod nu mai funcționează.
  • Pentru aceasta pentru a lucra în Mathematica 10, înlocuiți GraphicsBox cu Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Există o greșeală de scriere, Headlist-ul este scris la început cu un mic „Headlist” la sfârșit, cu un „L HeadList” cu majuscule …
  • I l-am remediat, @Phil.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *