在Mathematica中绘制点

10

我正在尝试在Mathematica中在以下图片中绘制一些点:

ParametricPlot3D[
   {{u, v, (Cos[u] + Cos[v])/3}, {u, -1, (Cos[u] + Cos[0])/3}, 
   {5, v, (Cos[4] + Cos[v])/3}}, {u, -4, 4}, {v, 0, 8}, Axes -> False, 
 Boxed -> False, BoxRatios -> {8, 8, 1.5}]

Mathematica图形

(它们应该只是表面上的点)

我试图使用ListPointPlot3D手动输入点的坐标,然后使用Show组合它们。但由于某种原因,这种方法不起作用。有什么建议吗?

另外,我想为我绘制的点沿着x方向添加小矢量以切线表面,但我不知道如何做到这一点,所以非常感谢您提供建议!


顺便说一下,欢迎来到StackOverflow。请记得通过点击答案旁边的复选标记接受最佳答案来回答您的问题。一旦您的声望提高了一些,您就可以做一些像赞同好的答案(和问题)以及评论不是您自己的帖子之类的事情。您可能还有兴趣查看StackExchange网络中专门的Mathematica用户站点的建议:http://area51.stackexchange.com/proposals/15787/mathematica - Verbeia
3个回答

8
也许这会帮助您开始解决问题。它在表面上绘制了三个随机点。您可以通过设置nPoints来更改点数。我不知道如何沿x轴绘制切线。但是当您弄清楚后,可以使用箭头,正如@Verbeia建议的那样。
nPoints = 3;
Show[ParametricPlot3D[{
       {u, v, (Cos[u] + Cos[v])/3}, 
       {u, -1, (Cos[u] + Cos[0])/3}, {5,  v, (Cos[4] + Cos[v])/3}}, 
       {u, -4, 4}, {v, 0, 8}, Axes -> False, 
       Boxed -> False, BoxRatios -> {8, 8, 1.5},
       PlotStyle -> Directive[Opacity[0.5]]],

     Graphics3D[{Red, PointSize[.025], 
         Point[Table[{u1 = RandomReal[{-3, 3}], v1 = RandomReal[{1, 7}], 
         (Cos[u1] + Cos[v1])/3}, {nPoints}]]}]]

点的分布

编辑

以下动态变化使用了 @belisarius 的贡献:

Manipulate[
Show[ParametricPlot3D[{{u, v, (Cos[u] + Cos[v])/3} },
  {u, -4, 4}, {v, 0, 8}, Axes -> False, Boxed -> False, 
  BoxRatios -> {8, 8, 1.5},
  Mesh -> None,
  ImageSize -> {400, 300},
  PlotRange -> {{-4, 4}, {0, 8}},
  PlotRangePadding -> {{0, 1.4}, {0, 0}},
  PlotStyle -> Directive[Opacity[0.5]]],
Graphics3D[({Red, PointSize[.025], 
  Point@f[pt[[1, 1]], pt[[1, 2]]], Black, 
  Arrow[{f[pt[[1, 1]], pt[[1, 2]]], 
  f[pt[[1, 1]], pt[[1, 2]]] + D[f[t, pt[[1, 2]]], t] /. 
   t -> pt[[1, 1]]}]}]],
Grid[{{
  LocatorPane[Dynamic[pt],
  Dynamic[Graphics[{},
   PlotRange -> {{-4, 4}, {0, 8}},
   Frame -> True,
   ImageSize -> 160,
   FrameTicks -> {Range[-4, 4], Range[0, 8], None, None},
   FrameLabel -> {"u", "v"},
   GridLines -> {Range[-4, 4], Range[0, 8]},
   GridLinesStyle -> Directive[LightGray]]],
   {{-4, 0}, {4, 8}}]}}],
  {{pt, {{1, 2}}}, ControlType -> None},

  Initialization :> {f[u_, v_] := {u, v, (Cos[u] + Cos[v])/3};}]

Manipulate


5

针对箭头

f[u_, v_] := {u, v, (Cos[u] + Cos[v])/3};
Show[ParametricPlot3D[{f[u, v]}, {u, -4, 4}, {v, 0, 8},
         Axes -> False,  Mesh -> None, Boxed -> False, BoxRatios -> {8, 8, 1.5}, 
         PlotStyle -> Directive[Opacity[0.5]]], 
 Graphics3D@
  Table[{Red, PointSize[.025], Point@f[u, v], 
         Black, Arrow[{f[u, v], f[u, v] + D[f[t, v], t] /. t -> u}]}, 
  {u, -4, 4, 2}, {v, 0, 8, 2}]]

图片描述

如果要在任意方向上获取箭头 a = { a1, a2 },而不是 x,则可以执行以下操作:

Dot[{a1,a2}.#] & /@ D[f[u, v], {{u, v}}]
(*
-> {a1, a2, -(1/3) a1 Sin[u] - 1/3 a2 Sin[v]}
*)

编辑

包括衍生品和正常产品:

f[u_, v_] := {u, v, (Cos[u] + Cos[v])/3};
Show[
 Graphics3D@
  Table[{Red, PointSize[.025], Point@f[u, v], Black, Arrowheads[.02], 
    Arrow[{f[u, v], f[u, v] + D[f[t, v], t] /. t -> u}], 
    Arrow[{f[u, v], f[u, v] + D[f[u, t], t] /. t -> v}],
    Arrow[{f[u, v],  f[u, v] +
                     Cross[D[f[t, v], t] /. t -> u, 
                           D[f[u, t], t] /. t -> v]}]}, 
  {u, -4, 4, 2}, {v, 0, 8, 2}], 

 ParametricPlot3D[{f[u, v]}, {u, -4, 4}, {v, 0, 8}, 
     Axes -> False, Mesh -> 3, MeshStyle -> {{Opacity[0.1], LightBlue}}, 
     Boxed -> False, BoxRatios -> {8, 8, 1.5}, 
     PlotStyle -> Directive[Opacity[0.5]]]]

enter image description here


那样就很完美地完成了整个画面。 - DavidC
你似乎很擅长这个。+1 - Mr.Wizard

1

您可以使用 Graphics3D[listofpoints] 将绘图与点结合起来,其中 listofpoints 是一个 T*3 矩阵列表,并使用类似 Graphics3D[Arrow[{{1, 1, -1}, {2, 2, 0}, {3, 3, -1}, {4, 4, 0}}]] 的构造来表示箭头。如果它们都是 Graphics3D 对象,则应该能够使用 Show 将它们组合在一起。

抱歉,我现在不在 Mathematica 安装附近,无法为您提供示例。


你的意思是像 Graphics3D[Point[{1, 1, 1}]] 这样吗?因为它仍然不让我组合它们。 - alice314159
@alice314159 - 请检查你评论中的代码是否能够独立运行。如果可以,但它们无法组合在一起,那么可能存在一些更深层次的错误,除非我接近Mathematica安装,否则无法帮助你解决。 - Verbeia
它确实可以工作,但由于某种原因我无法绘制多个点(然后就会出错)。我明天再试一次。 - alice314159
1
@alice 我猜测你遇到了多个点的问题,可能是因为你正在使用 Graphics[Point[one], Point[two], ...] 语法,需要将所有的点都封装在一个列表中:Graphics[{Point[one], Point[two], ...}] 或者使用 "multi-point" 的形式 Graphics[Point[{one, two, ...}]] - Brett Champion
@BrettChampion - 或者说,Graphics3D[Point[{one, two, ...}]] - Verbeia
由于某种原因,我总是很难记得在“Graphics3D”上打“3D”,但对于“Plot3D”却没有问题... - Brett Champion

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