Локатор выходит за пределы области графика - PullRequest
6 голосов
/ 29 марта 2011

Когда я запускаю следующий код

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 будет находиться в границах первого графика, но вместо этого его можно перемещать вокругвся область 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 ]

7 голосов
/ 29 марта 2011

Если вы изучите 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}]
6 голосов
/ 29 марта 2011

LocatorPane[] отлично справляется с ограничением локатора в регионе.

Это разновидность метода, используемого мистером Волшебником.

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

5 голосов
/ 29 марта 2011

Я не уверен, чего вы пытаетесь достичь.Я вижу ряд проблем, но я не знаю, что решать.Возможно, вы просто хотите простую 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}]}]

Это ответ на обновленный вопрос о вращении трехмерной графики.

Я полагаю, что 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}]
 }]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...