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

Geometry 如何制作圆的有向圆弧(或有向曲线)?,geometry,wolfram-mathematica,Geometry,Wolfram Mathematica,我想在Mathematica中显示一个有向圆弧,使用像箭头那样简单的东西。我能想到的最好的例子就是在圆弧的一端钉上一个箭头。但我怀疑有一种更直接的方法可以达到同样的效果 start=\[Pi]; Manipulate[ Graphics[{ Arrow[{{Cos[\[Theta] + If[\[Theta] < start, .01, -.01]], Sin[\[Theta] + If[\[Theta] < start, .01, -.01]]},

我想在Mathematica中显示一个有向圆弧,使用像
箭头那样简单的东西。我能想到的最好的例子就是在圆弧的一端钉上一个
箭头。但我怀疑有一种更直接的方法可以达到同样的效果

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



箭头
接受任意长度的点列表。因此,也许是这样的

Manipulate[Graphics[
  Arrow[Table[{Cos[t], Sin[t]}, {t, 0, T, Sign[T] Pi/100}]],
  PlotRange -> 1.1], {{T, 0}, -2 Pi, 2 Pi}]

也可以向圆弧的端点添加箭头,如下所示:

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

这可能更容易控制,因为您可以通过编程方式设置半径和弧长,并在最后替换箭头

你还应该看看关于的讨论。这里有很多好方法,也许比这更好。我个人发现他自己的问题是一个非常漂亮的小函数,我在我的小“来自互联网的函数”集合中有这个函数,并且不止一次地用它在图上放置箭头,这些图在情节之外继续

编辑

按照我在上面定义的方式,它在线条的末端放置了一个箭头。例如,如果绘制一条从L到R的直线,则会将其放置在右侧,反之则放置在左侧。所以在这个例子中,x的正增长是逆时针的,因此箭头指向那个方向。负方向的增加将产生顺时针箭头。为了避免第二个plot命令,我在列表中的第三个函数中将
x
更改为
-x
,这在金色曲线中产生了相同的效果

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

反方向的箭头

两端的箭头

反向箭头


使用圆圈[]

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

编辑

重新定义默认圆[]行为:

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];
取消保护[圆];
圆[a:{0,0},r::1,{start,end}]:=
块[{$inMsg=True},
{圆[a,r,{开始,结束}],
圈[a,r,{开始,结束}]/。
圆圈,
(箭头[If[start

@马克,谢谢。这当然比我的方法更优雅。我想要实现的路径实际上是一条圆弧链,其中圆心和半径经常改变参数。一张表格可以很容易地累积这些变化;它只需要更多的点(尽管这些点是由一组稍微不同的参数产生的)。@只标记逆时针方向的箭头?@David为什么只按时钟方向?如果在
Sin[t]
前面放置一个减号,您会发现箭头朝另一个方向移动。您可以用任何要生成各种曲线的公式替换
{Cos[t],Sin[t]}
。@标记。是的,我明白了。但是因为我想通过一个滑块来控制它,所以不清楚如何实现它。谢谢你的帮助。这可能会引起兴趣,特别是比尔·罗的解决办法。@TomD是的。他们正在讨论我提出的问题。其中一个解决方案与我提出的方案一致。另一个符合马克·麦克卢尔的建议。有趣的是,当我想到
(或
箭头
)时,我想到了非常分段的图像。我没有想到真正的小片段!一种非常直接、干净的方法。你手拿一个图形对象(圆弧)。它返回带有箭头的弧。@David就是这个意思。如果您的程序是用Circle[]构建的,则不必更改它。您还可以重新定义Circle[]来实现此目的automagically@David请参见编辑以重新定义默认圆[]behavior@belisarius这种格式肯定比
f[]
更自然。然而,我想知道:为什么不使用
circle
而不是
circle
?“你不冒着弄乱圆圈定义的风险吗?”大卫,我就是这么做的。我重新定义了Circle[],这样您的所有圆弧都将显示箭头,而无需任何其他程序修改:)非常好!它处理任何参数化绘图。直到我用
InputForm@ParametricPlot[{0.9圈[x],0.7圈[x+Pi/3],0.4圈[-x]},{x,Pi/4,Pi/2},绘图范围->{-1,1},轴->真]
并找到
。还感谢您提供有关箭头的有趣链接。
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];