关于plot:单位球面上的Mathematica RegionPlot?

Mathematica RegionPlot on the surface of the unit sphere?

我在 Mathematica 中使用 RegionPlot3D 来可视化一些不等式。由于不等式在坐标中是齐次的,因此它们由它们与单位球面的交点唯一这给出了我想绘制的球体表面上的一些二维区域。我的问题是怎么做?

如果需要,我非常乐意提供一些 Mathematica 代码;虽然我相信答案应该独立于我试图绘制的区域的细节。

提前致谢!

更新:如果有人感兴趣,我最近完成了一篇论文,我在下面使用 Sasha 的答案来制作一些情节。这篇论文是对称 M 理论背景,上周发表。它包含如下图:

F-moduli

再次感谢!


请查看RegionFunction。您可以在 ParametricPlot3D.

中逐字使用您的不等式

1
2
3
4
5
6
Show[{ParametricPlot3D[{Sin[th] Cos[ph], Sin[th] Sin[ph],
    Cos[th]}, {th, 0, Pi}, {ph, 0, 2 Pi},
   RegionFunction ->
    Function[{x, y, z}, And[x^3 < x y z + z^3, y^2 z < y^3 + x z^2]],
   PlotRange -> {-1, 1}, PlotStyle -> Red],
  Graphics3D[{Opacity[0.2], Sphere[]}]}]

enter


这是我能想到的最简单的想法(感谢 belisarius 提供的一些代码)。

  • 使用球坐标(使用 ??=q, ??=f)将不等式投影到球体上。
  • 将它们绘制为平坦区域图。
  • 然后将其绘制为球体的纹理。

这里有几个 3 阶齐次不等式

1
2
3
4
5
6
ineq = {x^3 < x y^2, y^2 z > x z^2};

coords = {x -> r Sin[q] Cos[f], y -> r Sin[q] Sin[f], z -> r Cos[q]}/.r -> 1

region = RegionPlot[ineq /. coords, {q, 0, Pi}, {f, 0, 2 Pi},
  Frame -> None, ImagePadding -> 0, PlotRangePadding -> 0, ImageMargins -> 0]

flat

1
2
3
ParametricPlot3D[coords[[All, 2]], {q, 0, Pi}, {f, 0, 2 Pi},
 Mesh -> None, TextureCoordinateFunction -> ({#4, 1 - #5} &),
 PlotStyle -> Texture[Show[region, ImageSize -> 1000]]]

animation


Simon 击败了我,但这里有一个类似的想法,基于较低级别的图形。我处理形式为 Ax>0.

的线性齐次不等式

1
2
3
4
5
6
7
8
9
10
11
A = RandomReal[{0, 1}, {8, 3}];
eqs = And @@ Thread[
    A.{Sin[phi] Cos[th], Sin[phi] Sin[th], Cos[phi]} >
        Table[0, {Length[A]}]];
twoDPic = RegionPlot[eqs,
    {phi, 0, Pi}, {th, 0, 2 Pi}];
pts2D = twoDPic[[1, 1]];
spherePt[{phi_, th_}] := {Sin[phi] Cos[th], Sin[phi] Sin[th],
    Cos[phi]};
rpSphere = Graphics3D[GraphicsComplex[spherePt /@ pts2D,
   twoDPic[[1, 2]]]]

让我们将它与 RegionPlot3D.

进行比较

1
2
3
4
5
rp3D = RegionPlot3D[And @@ Thread[A.{x, y, z} >
      Table[0, {Length[A]}]],
 {x, -2, 2}, {y, -2, 2}, {z, -2, 2},
   PlotStyle -> Opacity[0.2]];
Show[{rp3D, rpSphere}, PlotRange -> 1.4]

1
2
3
4
5
SphericalPlot3D[0.6, {\\[Phi], 0, \\[Pi]}, {\\[Theta], 0, 2 \\[Pi]},
 RegionFunction ->
  Function[{x, y, z},
   PolyhedronData["Cube","RegionFunction"][x, y, z]], Mesh -> False,
 PlotStyle -> {Orange, Opacity[0.9]}]