一般的なLaTeXスタイルに一致するように矢印の形状をカスタマイズするにはどうすればよいですか?

矢じりの形を制御するにはどうすればよいですか? LaTeXのTikZパッケージには、さまざまな定義済みの矢印スタイルがあり、そのうちのいくつかは、LaTeXドキュメントにインポートするMathematicaの図と一致させたいと思っています:

LaTeXの矢印の例

しかし、Mathematicaのデフォルトの矢印のスタイルは、これらのどれにもほど遠いものです。例:

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

歩留まり

デフォルトのMathematica矢印

以前のバージョンのMathematicaには矢じりの形を制御するオプションがありましたが、8.0ではなくなったようです。

Mathematicaの矢じりの形をLaTeXTikZの矢じりのスタイルに合わせるにはどうすればよいですか?

コメント

  • さらに、Mathematica 'の矢印は、LaTeXの矢印とは異なる方法でスケーリングされ、可能なロジックを使用しています。 ' t識別します。理想的には、' Mathematicaの矢印がLaTeXの矢印と同じように拡大縮小されるようにしたいです。しかし、それはおそらく別の質問です。
  • Arrowheadsのドキュメントを見たことがありますか?
  • はい、当然です。そこに私を近づけるものは何もありませんでした。
  • @Heike:これはカスタム矢印の例を1つだけ示していますが、事前定義されたタイプについては何も示していません(StreamPlotには無数の異なるものがあります組み込みの矢印スタイル)。
  • この質問を参照してください。カスタム形状の定義方法とおよび矢印の絶対サイズを設定します。

回答

ここにManipulate自分で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グラフィックス

必要に応じて、コントロールポイントを簡単に追加できます。

矢じりのグラフィックは変数hに配置されます。コントロールポイントの視認性を高めるために、Opacity関数が含まれていることに注意してください。完全に飽和した矢じりが必要な場合は、これを削除する必要があります。

このManipulateで生成されたいくつかの例:

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グラフィックス

矢印の頭のコードは、h。グラフィックまたはFullFormをコピーして、後で使用できるように保存してください。

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

編集
もう1つのコントロールポイントが最も一般的な形状をカバーします:

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グラフィックス

Mathematicaグラフィックス

コメント

  • すごい!ありがとう!

回答

鏃形のソースの1つはGraphこれには、オプションEdgeShapeFunctionを使用して設定できる事前定義された矢印の形状のリストが付属しています。これらの形状の名前は、次のようにして取得できます。

arrowheadNames = GraphElementData["Edge"]; 

残念ながら、これらの名前だけではArrowheads。幸い、GraphGraphicsGraphics仕様を抽出する方法があります。 div> Showを使用して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] 

Mathematicaグラフィックス

これらは、Arrowheadsで次のように使用できます。

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

Mathematicaグラフィックス

コメント

  • できます'このコードはもう機能しません。
  • 同じように、Mathematica 10.1では、このコードはもう機能しません。
  • このためMathematica 10で動作させるには、GraphicsBoxGraphicsに置き換えます:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • タイプミスがあります。ヘッドリストは最初に小さなl「ヘッドリスト」で始まり、最後に大文字のL「ヘッドリスト」で書かれています…
  • I 修正しました、@ Phil。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です