일반적인 LaTeX 스타일과 일치하도록 화살촉 모양을 사용자 정의하려면 어떻게해야합니까?

화살촉 모양은 어떻게 제어합니까? LaTeX의 TikZ 패키지에는 미리 정의 된 다양한 화살촉 스타일이 있으며, 그중 일부는 LaTeX 문서로 가져 오는 Mathematica 그림과 일치시키고 싶습니다.

LaTeX 화살표 예

그러나 Mathematica의 기본 화살표 스타일은이 중 어디에도 없습니다. 예 :

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

수익

기본 Mathematica 화살표

이전 버전의 Mathematica에는 화살촉 모양을 제어 할 수있는 옵션이 있었지만 8.0에서는 사라진 것 같습니다.

LaTeX TikZ 화살촉 스타일과 일치하도록 Mathematica 화살촉의 모양을 얻으려면 어떻게해야합니까?

댓글

  • 또한 Mathematica '의 화살표는 내가 할 수있는 논리를 사용하여 LaTeX 화살표와 다르게 크기가 조정됩니다. ' 분별하지 마십시오. 이상적으로는 ' Mathematica 화살표가 LaTeX 화살표와 동일한 방식으로 확장되도록하고 싶습니다. 그러나 그것은 아마도 별도의 질문 일 것입니다.
  • Arrowheads의 문서를 보셨습니까?
  • 예, 당연히. 아무 것도 가까이하지 못했습니다.
  • @Heike : 사용자 지정 화살촉에 대한 한 가지 예만 제공하지만 사전 정의 된 유형에 대해서는 아무것도 제공하지 않습니다 (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} ] ] 

수학 그래픽

필요한 경우 제어점을 쉽게 추가 할 수 있습니다.

화살촉 그래픽은 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.}}]}]} ] *) 

편집
하나 이상의 제어점이 가장 일반적인 모양을 다룹니다.

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 그래픽

댓글

  • 놀랍습니다! 감사합니다!

답변

화살촉 모양의 소스 중 하나는 GraphEdgeShapeFunction 옵션을 사용하여 설정할 수있는 사전 정의 된 화살촉 모양 목록과 함께 제공됩니다. 이러한 도형의 이름은

arrowheadNames = GraphElementData["Edge"]; 

안타깝게도 Arrowheads에서는 그 자체로 쓸모가 없습니다. div>. 다행히 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];
  • 로 바꿉니다.

  • 오류가 있습니다. Headlist는 처음에 작은 l “Headlist”가 끝에 대문자 L “HeadList”로 작성됩니다 …
  • I 이 문제를 해결했습니다, @Phil.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다