如何制作圆的有向弧(或有向曲线)?

Dav*_*idC 9 geometry wolfram-mathematica

我想在Mathematica中显示有向圆弧,使用简单的东西Arrow.我能想出的最好的例子就是把它钉Arrow在圆弧的一端.但我怀疑有更直接的方法来达到同样的效果.

start=\[Pi];
Manipulate[
Graphics[{
   Arrow[{{Cos[\[Theta] + If[\[Theta] < start, .01, -.01]], 
           Sin[\[Theta] + If[\[Theta] < start, .01, -.01]]}, 
          {Cos[\[Theta]], Sin[\[Theta]]}}],
   Circle[{0, 0}, 1, {start, \[Theta]}]},
PlotRange -> 2], 
{{\[Theta], .7 start}, 0, 2 start} 
           ]
Run Code Online (Sandbox Code Playgroud)

箭头

Arrow接受BSplineCurves,BezierCurves但我不能让他们留在圆弧上. Tube接受3D曲线的公式,但我无法弄清楚如何让它在2D中工作.

欢迎所有建议.如果您的解决方案适用于任何 2D曲线,那就更好了!


结语:

我从这些建议中学到了很多东西:Mark McClure表明,Arrow在给出一系列积分时,它本身可以处理这些要求.

yoda使用ParametricPlot提供了一个相当通用的解决方案.

我最终发现belisarius的建议最有帮助.他的方法是处理熟悉的图形对象的微小变化.最后,我小心翼翼地选择了一个新对象,arcArrow它采用了以下参数Circle:center,radius,{start,finish}. Unprotect还是吓到我了!无论如何,这就是我的定居点.我还固执地坚持了我原来方法的一些特征.

Manipulate[
 Graphics[{  
   arcArrow[center, radius, {start, end}],
   PointSize[Large], Blue, If[showCenter, Point[center]]},
  PlotRange -> p, ImageSize -> 250],
 {{start, \[Pi]/2}, -2 \[Pi], 2 \[Pi], ImageSize -> Small},
 {{end, 0}, -2 \[Pi], 2 \[Pi], ImageSize -> Small},
 {{radius, 1}, 1/2, 4, ImageSize -> Small},
 {{center, {0, 0}}, {-p, -p}, {p, p}, Slider2D},
 {showCenter, {True, False}},

 Initialization :> {p = 3;
   arcArrow[a_, r_, {start_, end_}] :=
    {Circle[a, r, {start, end}], 
     Arrowheads[Medium],
     Arrow[{a + r {Cos[end + If[end < start, .01, -.01]], 
                   Sin[end + If[end < start, .01, -.01]]}, 
            a + r {Cos[end], Sin[end]}}]} }]
Run Code Online (Sandbox Code Playgroud)

最终版本


abc*_*bcd 8

您还可以将箭头添加到弧的终点,如下所示:

circle[x_] = {Cos[x], Sin[x]};
ParametricPlot[{0.9 circle[x], 0.7 circle[x + Pi/3], 0.4 circle[-x]}, 
 {x, Pi/4, Pi/2}, PlotRange -> {-1, 1}, Axes -> False] 
/.Line[x__] :> Sequence[Arrowheads[.03], Arrow[x]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这可能更容易控制,因为您可以以编程方式设置半径和弧长,并且只需替换最后的箭头.

您还应该看一下在曲线边缘添加箭头的讨论.那里有很多好的方法,也许比这个更好.我个人发现西蒙对他自己的问题的回答是一个非常漂亮的小功能,我在我的小"互联网功能集合"中使用它,并且不止一次地使用它将箭头放在继续在情节之外的图形上.

编辑

我在上面定义它的方式,它在行的末尾放置一个箭头.例如,如果您绘制从L到R的线,则将其放置在右侧和左侧.因此在该示例中,x的正增加是逆时针的,因此是该方向上的箭头.增加负方向将产生顺时针箭头.为了避免第二个绘图命令,我只需更改x-x列表中的第三个函数,它在金色曲线中产生相同的效果.

更一般地,您可以通过更改输入来更改箭头的方向,Arrowheads如下所示:

箭头反过来

在此输入图像描述

两端都有箭头

在此输入图像描述

倒箭头

在此输入图像描述


Mar*_*ure 7

Arrow接受任意长度的点列表.因此,也许是这样的.

Manipulate[Graphics[
  Arrow[Table[{Cos[t], Sin[t]}, {t, 0, T, Sign[T] Pi/100}]],
  PlotRange -> 1.1], {{T, 0}, -2 Pi, 2 Pi}]
Run Code Online (Sandbox Code Playgroud)


Dr.*_*ius 7

使用Circle []:

f[s_Circle] := 
 s /. Circle[a_, r_, {start_, end_}] :>
      ({s,Arrow[{# - r/10^6 {-Sin@end, Cos@end}, #}]} &[a+r {Cos@end, Sin@end}]) 

Graphics@f[Circle[{0, 0}, 1, {4 Pi/3, 2 Pi}]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

重新定义默认的Circle []行为:

Unprotect[Circle];
Circle[a_: {0, 0}, r_: 1, {start_, end_}] :=
  Block[{$inMsg = True},
    {Circle[a, r, {start, end}],
     Circle[a, r, {start, end}] /. 
      Circle[aa_, 
        ar_, {astart_, aend_}] :> (Arrow[If[start < end, #, Reverse@#]] &@
             {# - r/10^6 {-Sin@end, Cos@end}, #} &
               [aa + ar {Cos@aend, Sin@aend}])}
    ] /; ! TrueQ[$inMsg];
Protect[Circle];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述