2011-03-29 6 views
6

Cuando ejecuto el siguiente códigoLocalizador sale de la región de la gráfica

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

espero que el control de localizador para estar dentro de los límites de la primera gráfica, pero en su lugar se puede mover alrededor toda la región GraphicsGrid. ¿Hay un error en mi código?

También probé

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

en lugar de

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

pero se comporta completamente equivocado.

ACTUALIZACIÓN

Gracias a todos, este es mi solución final:

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

ACTUALIZACIÓN

Ahora el problema es que no puedo cambiar el tamaño y rotar el gráfico 3d más bajo. ¿Alguien sabe cómo arreglar eso? He vuelto a la solución con dos objetos Slider2D.

+1

¿Hay una razón por la que no acaba de colocar la línea dentro de un 'LocatorPane []'? Eso le hubiera permitido hacer que el localizador se siente precisamente en la ubicación donde tiene un efecto, es decir, el final del segmento de línea. – DavidC

+0

@David Carraher Es solo un pequeño ejemplo. En mi cuaderno necesito dos localizadores que elegirán dos pares de coordenadas xey para los medios de dos distribuciones Binormal que se mostrarán en un gráfico 3d. Entonces estos deberían ser dos gráficos separados. – Max

+0

Por favor vea mi respuesta actualizada. –

Respuesta

5

No estoy seguro de lo que está tratando de lograr. Hay una serie de problemas que veo, pero no sé a qué atenerme. Tal vez solo quieres una construcción simple Slider2D?

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

Esta es una respuesta a la pregunta actualizada sobre 3D rotación gráfica.

Creo que LocatorPane como lo sugirió David es una buena forma de abordar esto. Acabo de poner en una función genérica ya que su ejemplo no se ejecutan en Mathematica 7.

DynamicModule[{pt = {{-1, 3}, {1, 1}}}, 
Column[{ 
    LocatorPane[Dynamic[pt], 
    [email protected][{}, PlotRange -> {{-5, 5}, {-5, 5}}]], 
    [email protected] 
    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}] 
}] 
] 
+0

Utilicé dos objetos Slider2D, pero prefiero tener dos localizadores en el mismo gráfico. – Max

7

Si examina el inputform encontrará que GraphicsGrid devuelve un objeto Graphics. Por lo tanto, el localizador realmente se mueve a lo largo de toda la imagen.

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

Si sólo cambia el GraphicsGrid a una cuadrícula, el localizador se limitará a la primera parte, pero el resultado todavía se ve un poco extraño. Su especificación PlotRange es un poco extraña; no parece corresponder a ningún formato especificado en el Centro de documentación. Tal vez quieras algo como lo siguiente.

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

+1 para 'GraphicsGrid devuelve un objeto Graphics. –

+0

He votado por alto esto, pero no necesita' Locator' en el primer fragmento 'Graphics'; es redundante –

+0

De hecho, Max usó algún tipo de especificación rectangular (BL, TR) para rango, mientras que mma usa una especificación {xrange, yrange} –

6

LocatorPane[] hace un buen trabajo de confinar el localizador a una región.

Esta es una variación del método utilizado por Mr. Wizard.

Column[{ LocatorPane[Dynamic[pt3], 
    [email protected][{}, ImageSize -> 150, PlotRange -> 3]], 
    [email protected][{Line[{{-1, 0}, [email protected]}]}, ImageSize -> {150, 150}, 
    PlotRange -> 3]}] 

locator confined

habría dado por hecho que usted desea que el localizador para compartir el espacio con la línea que controla. De hecho, para ser "conectado" a la línea. Esto resulta ser aún más fácil de implementar.

Column[{LocatorPane[Dynamic[pt3],[email protected][{Line[{{-1, 0}, [email protected]}]}, 
ImageSize -> 150, PlotRange -> 3]]}] 

locator on the line

+0

+1 Gosh! Intenté mover tus localizadores en las imágenes –

+0

En realidad, quería tener dos gráficos. Uno 2d para seleccionar un par de coordenadas xey, y el segundo es 3d para mostrar dos distribuciones binomiales con los medios que corresponden a las coordenadas del localizador. Pero tu solución funciona bien. Gracias. – Max

+0

@belisarius Hago ese tipo de cosas todo el tiempo. – DavidC

Cuestiones relacionadas