Hogyan testreszabhatom a nyílhegy alakját, hogy megfeleljen a közös LaTeX stílusoknak?

Hogyan szabályozhatom a nyílfejek alakját? A LaTeX TikZ csomagja sokféle előre definiált nyílhegystílust tartalmaz, amelyek közül néhányat szeretnék megpróbálni egyeztetni a Mathematica alakjaival, amelyeket LaTeX dokumentumba importálok:

LaTeX nyílpéldák

De a Mathematica alapértelmezett nyílhegy-stílusa közel sem éri ezeket. Például

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

megadja

Alapértelmezett Mathematica nyíl

A Mathematica korábbi verzióiban lehetőség nyílt a nyílhegy alakjának szabályozására, de úgy tűnik, hogy ezek a 8.0 verzióban már eltűntek.

Hogyan tudom elérni, hogy a Mathematica nyílhegyeim alakja megfeleljen a LaTeX TikZ nyílhegy stílusainak?

Megjegyzések

  • Ezenkívül a Mathematica ' nyilai eltérően vannak méretezve, mint a LaTeX nyílhegyei, egy logikával ' t megkülönbözteti. Ideális esetben ' azt is szeretném biztosítani, hogy a Mathematica nyilaim ugyanúgy méretezzenek, mint a LaTeX nyilai; de ez talán külön kérdés.
  • Megnézte a Arrowheads dokumentációját?
  • Igen, természetesen. Semmi sem került a közelembe.
  • @Heike: ez csak egy példát ad egy egyedi nyílhegyre, de semmit az előre definiált típusokról (bár StreamPlot különféle miriad vannak beépített nyílstílusok).
  • Lásd ezt a kérdést – megmutatja, hogyan definiálhatók az egyéni alakzatok, és állítsa be az abszolút nyílhegy-méreteket.

Válasz

Itt van egy Manipulate Arrow tervezése:

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 grafika

Könnyű további vezérlőpontokat hozzáadni, ha erre szükség van.

A nyílhegy grafikája a h változóba kerül. Vegye figyelembe, hogy tartalmaz egy Opacity függvényt a vezérlőpontok jobb láthatósága érdekében. Ezt el kell távolítania, ha teljesen telített nyílfejet szeretne kapni.

Néhány példa ezzel a Manipulate alkalmazással generálva:

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 grafika

A nyílfejek kódja a h. Csak másolja a grafikát vagy a FullForm -t, hogy később tárolja.

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.}}]}]} ] *) 

SZERKESZTÉS
Még egy vezérlőpont fedi le a leggyakoribb alakzatokat:

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 grafika

Mathematica grafika

Megjegyzések

  • Elképesztő! Köszönöm!

Válasz

A nyílhegy formáinak egyik forrása a Graph amely egy előre definiált nyílhegy-alakzatok listáját tartalmazza, amelyeket a EdgeShapeFunction opcióval állíthat be. Ezeknek az alakzatoknak a nevét oly módon szerezheti be, hogy

arrowheadNames = GraphElementData["Edge"]; 

Sajnos ezek a nevek önmagukban haszontalanok a Arrowheads. Szerencsére van mód úgy kinyerni a nyílhegyek Graphics specifikációit, ha egy Graph -t Graphics a Show használatával és a Arrowheads irányelvek kibontásával:

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 grafika

Ezeket a Arrowheads fájlban az alábbiak szerint használhatja:

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

Mathematica grafika

Megjegyzések

  • Tudok ' ez a kód már nem működik.
  • Ugyanez itt, a Mathematica 10.1-en, ez a kód már nem működik.
  • Ehhez a Mathematica 10 használatához cserélje le a GraphicsBox szöveget Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Van egy elgépelés, az elején a Headlistet írják, a végén egy kis l „Headlist” -nel nagy L-es „HeadList” -nel …
  • I kijavítottuk, @Phil.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük