如何制作一个圆弧(或曲线)的方向箭头?

9

我想在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} 
           ]

arrow

Arrow可以接受BSplineCurvesBezierCurves,但我无法让它们保持在圆弧上。 Tube可以接受3D曲线公式,但我不知道如何使其在2D中工作。

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


结语:

我从这些建议中学到了很多:

Mark McClure表明,当给出点列表时,Arrow本身可以处理要求。

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

最终,我发现belisarius的建议最有帮助。 他的方法是在熟悉的图形对象的微小变化上进行操作。 最后,我谨慎地选择定义一个新对象arcArrow,它使用Circle的参数:中心、半径、{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]}}]} }]

final version



1
这个链接可能会引起兴趣,特别是Bill Rowe提供的解决方法。 - 681234
@TomD 是的。他们正在讨论我提出的问题。其中一个解决方案与我想出的相对应。另一个与Mark McClure的建议相匹配。有趣的是,当我想到“Line”(或“Arrow”)时,脑海中浮现的是非常分段的图像。我没有考虑过非常小的线段! - DavidC
3个回答

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

这可能更容易控制,因为您可以通过编程方式设置半径和弧长,然后只需在最后替换箭头即可。
您还应该查看关于在曲线边缘添加箭头的讨论。那里有很多好方法,也许比这个好。我个人发现Simon的答案对他自己的问题是一个相当聪明的小函数,我在我的“互联网功能”集合中使用了它超过一次,在图表上放置箭头。 编辑 如上所述,它将箭头放在线的末端。例如,如果从L到R绘制一条线,则将其放置在右侧和左侧。因此,在示例中,x的正增量是逆时针的,因此在该方向上的箭头。负方向的增量会产生顺时针箭头。为了避免第二个绘图命令,我只需在列表中的第三个函数中将x更改为-x,这样就在金色曲线中产生了相同的效果。
更一般地说,您可以通过更改输入到Arrowheads来改变箭头的方向,如下所示: 箭头走另一个方向 enter image description here 两端都有箭头 enter image description here 倒置箭头头部 enter image description here

非常好!它可以处理任何参数图。在使用 InputForm@ParametricPlot[{0.9 circle[x], 0.7 circle[x + Pi/3], 0.4 circle[-x]}, {x, Pi/4, Pi/2}, PlotRange -> {-1, 1},Axes -> True] 查看底层代码后,我才明白延迟替换规则的作用是什么,发现其中有Line。同时感谢提供关于箭头的有趣链接。 - DavidC

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

@Mark 谢谢。这肯定比我的方法更优雅。 - DavidC
@Mark 只有逆时针箭头吗? - DavidC
@Mark。是的,我明白了。但是因为我想通过滑块来控制它,所以不清楚如何实现。谢谢你的帮助。 - DavidC
@David - 请查看使用Groovy的Sign函数控制步骤方向的编辑代码。 - Mark McClure
嗯...我没有看到闪烁的屏幕。在我的大型Mac上,箭头只是在t=0时变成了一个点。可以编写一个函数,根据t生成一个Graphics对象,并在t=0处生成特定的结果。通过这种方式,您可以生成任何特定的特殊图片。 - Mark McClure
显示剩余2条评论

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

输入图像描述

编辑

重新定义默认的 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];

enter image description here


@David 请看编辑部分,重新定义默认 Circle[ ] 的行为。 - Dr. belisarius
@belisarius 这种格式肯定比 f[] 更自然。不过我在想:为什么不使用 circle 而不是 Circle?这样做难道不会搞乱 Circle 的定义吗? - DavidC
@David 我确实这样做了。我重新定义了 **Circle[ ]**,这样所有的弧线都会显示箭头,而不需要进行任何其他程序修改 :) - Dr. belisarius
@belisarius 为什么你要添加 Protect[Plot] 这行代码,如果是 Circle 被你取消保护了呢? - DavidC
@David 因为我从另一个笔记本中复制粘贴了代码。害羞! - Dr. belisarius
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接