定位器离开图形区域

时间:2011-03-29 02:12:43

标签: wolfram-mathematica

当我运行以下代码时

pMin = {-3, -3};
pMax = {3, 3};
range = {pMin, pMax};
Manipulate[
 GraphicsGrid[
  {
   {Graphics[Locator[p], PlotRange -> range]},
   {Graphics[Line[{{0, 0}, p}]]}
   }, Frame -> All
  ],
 {{p, {1, 1}}, Locator}
]

Mathematica graphics

我希望Locator控件在第一个Graph的范围内,但它可以在整个GraphicsGrid区域内移动。我的代码中有错误吗?

我也试过

{{p, {1, 1}}, pMin, pMax, Locator}

而不是

{{p, {1, 1}}, Locator}

但它表现完全错误。

更新

感谢大家,这是我的最终解决方案:

Manipulate[
 distr1 = BinormalDistribution[p1, {1, 1}, \[Rho]1];
 distr2 = BinormalDistribution[p2, {1, 1}, \[Rho]2];
 Grid[
  {
   {Graphics[{Locator[p1], Locator[p2]}, 
     PlotRange -> {{-5, 5}, {-5, 5}}]},
   {Plot3D[{PDF[distr1, {x, y}], PDF[distr2, {x, y}]}, {x, -5, 5}, {y, -5, 5}, PlotRange -> All]}
   }],
 {{\[Rho]1, 0}, -0.9, 0.9}, {{\[Rho]2, 0}, -0.9, 0.9},
 {{p1, {1, 1}}, Locator},
 {{p2, {1, 1}}, Locator}
 ]

Mathematica graphics

更新

现在的问题是我无法调整大小并旋转下方的3d图形。有谁知道如何解决这个问题? 我回到了两个Slider2D对象的解决方案。

3 个答案:

答案 0 :(得分:7)

如果检查InputForm,您会发现GraphicsGrid返回一个Graphics对象。因此,定位器确实在整个图像中移动。

GraphicsGrid[{{Graphics[Circle[]]}, {Graphics[Disk[]]}}] // InputForm

如果你只是将GraphicsGrid更改为Grid,定位器将被限制在第一部分,但结果仍然看起来有点奇怪。你的PlotRange规范有点奇怪;它似乎与文档中心中指定的任何格式不对应。也许你想要的东西如下。

Manipulate[
 Grid[{
   {Graphics[Locator[p], Axes -> True,
     PlotRange -> {{-3, 3}, {-3, 3}}]},
   {Graphics[Line[{{0, 0}, p}], Axes -> True,
     PlotRange -> {{-3, 3}, {-3, 3}}]}},
  Frame -> All],
 {{p, {1, 1}}, Locator}]

答案 1 :(得分:6)

LocatorPane[]可以很好地将定位器限制在一个区域内。

这是Wizard先生使用的方法的变体。

Column[{ LocatorPane[Dynamic[pt3],
   Framed@Graphics[{}, ImageSize -> 150, PlotRange -> 3]],
   Framed@Graphics[{Line[{{-1, 0}, Dynamic@pt3}]}, ImageSize -> {150, 150}, 
     PlotRange -> 3]}]

locator confined

我原本假设您希望定位器与它控制的行共享空间。事实上,要“附加”到线上。事实证明这更容易实现。

Column[{LocatorPane[Dynamic[pt3],Framed@Graphics[{Line[{{-1, 0}, Dynamic@pt3}]},
 ImageSize -> 150, PlotRange -> 3]]}]

locator on the line

答案 2 :(得分:5)

我不确定你想要实现的目标。我看到了很多问题,但我不知道该解决什么问题。也许你只想要一个简单的Slider2D构造?

DynamicModule[{p = {1, 1}}, 
 Column@{Slider2D[Dynamic[p], {{-3, -3}, {3, 3}}, 
    ImageSize -> {200, 200}], 
   Graphics[Line[{{0, 0}, Dynamic[p]}], 
    PlotRange -> {{-3, 3}, {-3, 3}}, ImageSize -> {200, 200}]}]

这是对有关3D图形旋转的更新问题的回复。

我相信大卫建议的LocatorPane是一个很好的方法来解决这个问题。我只是放入一个泛型函数,因为你的例子不能在Mathematica 7上运行。

DynamicModule[{pt = {{-1, 3}, {1, 1}}},
 Column[{
   LocatorPane[Dynamic[pt], 
     Framed@Graphics[{}, PlotRange -> {{-5, 5}, {-5, 5}}]],
   Dynamic@
    Plot3D[{x^2 pt[[1, 1]] + y^2 pt[[1, 2]],
           -x^2 pt[[2, 1]] - y^2 pt[[2, 1]]},
        {x, -5, 5}, {y, -5, 5}]
 }]
]