Jak mogę dostosować kształt grotu strzałki, aby pasował do popularnych stylów LaTeX?

Jak mogę kontrolować kształt moich grotów strzał? Pakiet TikZ LaTeXa ma szeroką gamę predefiniowanych stylów grotów strzałek, z których niektóre chciałbym spróbować dopasować do liczb Mathematica, które importuję do dokumentu LaTeX:

Przykłady strzałek LaTeX-a

Jednak domyślny styl grotów strzałek Mathematica nie ma żadnego z nich. Na przykład

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

daje

Domyślna strzałka Mathematica

Wcześniejsze wersje Mathematica miały opcje kontrolowania kształtu grotów strzałek, ale wydaje się, że zniknęły one w wersji 8.0.

Jak mogę dopasować kształt moich grotów Mathematica do stylów grotów LaTeX TikZ?

Komentarze

  • Dodatkowo, strzałki Mathematica ' są skalowane inaczej niż groty strzałek LaTeX-a, używając logiki, którą mogę ' t rozróżnij. Idealnie byłoby, gdyby ' również chciałem upewnić się, że moje strzały Mathematica skalują się w taki sam sposób, jak strzałki LaTeX; ale to być może osobne pytanie.
  • Czy spojrzałeś na dokumentację Arrowheads?
  • Tak, oczywiście. Nic mnie tam nie zbliżyło.
  • @Heike: to tylko jeden przykład niestandardowego grotu strzałki, ale nie ma nic o predefiniowanych typach (chociaż StreamPlot ma wiele różnych wbudowane style strzałek).
  • Zobacz to pytanie – pokaże, jak definiować niestandardowe kształty, i ustaw bezwzględne rozmiary grotów strzałek.

Odpowiedź

Oto Manipulate aby samodzielnie zaprojektować 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 Graphics

Łatwo jest dodać więcej punktów kontrolnych, jeśli zajdzie taka potrzeba.

Grafika grotu strzałki jest umieszczana w zmiennej h. Zauważ, że zawiera on funkcję Opacity dla lepszej widoczności punktów kontrolnych. Musisz to usunąć, jeśli chcesz mieć w pełni nasycony grot strzałki.

Niektóre przykłady wygenerowane za pomocą tego Manipulate przy użyciu:

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 ] 

Grafika matematyczna

Kod grotów strzałek można znaleźć w h. Po prostu skopiuj grafikę lub FullForm, aby zachować ją do późniejszego użytku.

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

EDYTUJ
Jeszcze jeden punkt kontrolny obejmie najpopularniejsze kształty:

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

Grafika matematyczna

Grafika matematyczna

Komentarze

  • Niesamowite! Dzięki!

Odpowiedź

Jednym ze źródeł kształtów grotów strzałek jest Graph który zawiera listę predefiniowanych kształtów grotów strzałek, które można ustawić za pomocą opcji EdgeShapeFunction. Możesz uzyskać nazwy tych kształtów, wykonując coś w rodzaju

arrowheadNames = GraphElementData["Edge"]; 

Niestety, te nazwy same w sobie są bezużyteczne w Arrowheads. Na szczęście istnieje sposób na wyodrębnienie specyfikacji Graphics tych grotów strzałek, konwertując Graph na Graphics używając Show i wyodrębniając dyrektywy 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] 

Grafiki Mathematica

Możesz ich użyć w Arrowheads w następujący sposób:

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

Grafika matematyczna

Komentarze

  • Mogę ' aby ten kod już działał.
  • To samo tutaj, w Mathematica 10.1, ten kod już nie działa.
  • W tym przypadku aby pracować w Mathematica 10, zamień GraphicsBox na Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Wpisano błędnie, lista nagłówków jest zapisana na początku z małym l „Headlist” na końcu z wielką literą L „HeadList” …
  • I już to naprawiłem, @Phil.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *