2011-03-10 10 views
5

En Mathematica, localizadores puede ser limitado a ciertas regiones de la pantalla a través de los parámetros de LocatorPane (Ver LocatorPane documentación.)¿Cómo puedo restringir los localizadores a un conjunto de posiciones limitado (pero no regular)?

una lista de tres pares ordenados {{{minX, minY}, {maxX, maxY}, {dX, dY}}} es generalmente la clave para determinar el comportamiento de los localizadores. {minX, minY} y {maxX, maxY} establecen la región. {dX, dY} establece el tamaño de salto: cero para desenfrenado, cualquier otro número positivo para el tamaño de cada salto.

En el código siguiente, {{{-.9, 0}, {1, 0}, {0, 0}}} establece la región y salta para el localizador pts. Los primeros dos pares ordenados limitan los localizadores al intervalo [-9, 1] en la recta numérica. El par ordenado {0, 0} no impone restricciones adicionales en ninguno de los localizadores. Sin embargo, debido a que los valores y solo pueden ser cero, debido a la región definida por los dos primeros elementos, ninguno de los localizadores puede abandonar el eje x.

Me gustaría limitar cada localizador a x-values ​​en myTicks. (En el programa completo, myTicks cambiará con el tiempo dependiendo de las decisiones tomadas por el usuario). Debido a que los tics no están uniformemente espaciados a lo largo de x, el problema no puede resolverse estableciendo un valor constante para el salto x. Y si el valor tuviera en cuenta la posición actual del localizador, el siguiente salto a la izquierda podría tener un tamaño diferente al del salto derecho.

myTicks = {-.9, 0, .1, .2, .45, .79, 1}; 
pts = {{.25, 0}, {.75, 0}}; 

LocatorPane[Dynamic[pts], 
    Graphics[{}, 
    Axes -> {True, False}, 
    PlotLabel -> Row[{"locators at: " , Dynamic[pts[[1, 1]]], " and ", 
     Dynamic[pts[[2, 1]]]}], 
    Ticks -> {myTicks, Automatic}], 
{{{-.9, 0}, {1, 0}, {0, 0}}}] 

Mathematica graphics

Cualquier sugerencia sería apreciado!

+0

Por cierto, utilicé la etiqueta 'mouseevent' porque sospecho que hay algunas sutilezas sobre el comportamiento del mouse que pueden estar involucradas aquí. – DavidC

Respuesta

3

Esto parece funcionar.

myTicks = {-.9, 0, .1, .2, .45, .79, 1}; 

DynamicModule[{p = {.25, 0}, p2 = {.75, 0}}, 
LocatorPane[Dynamic[{p, p2}], 
    Graphics[{}, Axes -> {True, False}, 
    PlotLabel -> 
    Row[{"locators at: ", 
     Dynamic[p[[1]] = Nearest[myTicks, p[[1]]][[1]]], " and ", 
     Dynamic[p2[[1]] = Nearest[myTicks, p2[[1]]][[1]]]}], 
    Ticks -> {myTicks, Automatic}], {{{-.9, 0}, {1, 0}}}, ContinuousAction -> False] 
] 
+0

@ Mr.Wizard Esto funciona muy bien. Me gusta la forma en que mantuviste intacta la personalidad de arrastrar y soltar del localizador: cuando se libera, el localizador salta al tic más cercano, como se desee. – DavidC

+0

@ Mr.Wizard Su implementación realmente funciona más suavemente que la entrada elegida. Pero como ambas respuestas se basaban en 'Nearest', seleccioné la que se envió primero. – DavidC

+0

@David Como le dije a otro usuario, esa es su prerrogativa, pero realmente no puedo entenderlo. Si uno selecciona la primera solución que funciona, y no cambia esa selección si se presenta una mejor, hay menos incentivos para presentar soluciones mejoradas. En este caso, no afirmo que mi solución sea mejor, pero si lo fuera, ¿por qué no seleccionarla? Por cierto, no vi el uso de Belisarius de Nearest (antes de la mía), simplemente tardé más en encontrar una solución que lo usara. –

3

Vamos a probar esto:

pts = {{0, 0}, {10, 0}}; 
myTics = Table[{x, 0}, {x, 0, 10, 5}]; 
LocatorPane[Dynamic[pts], 
ListPlot[myTics, PlotRange -> {{-1, 11}, {-1, 1}}, 
    PlotStyle -> Directive[PointSize[.07], Red], 
    Epilog -> {PointSize[.05], Blue, h = Point[Dynamic[{Nearest[myTics, pts[[1]]]}]], 
      PointSize[.03], Yellow, j = Point[Dynamic[{Nearest[myTics, pts[[2]]]}]], 
      Black, 
       Text[{"locators at: ", Dynamic[h[[1, 1]]], " and ",Dynamic[j[[1, 1]]]}, 
        {5, .5}]}], 
Appearance -> None] 

enter image description here

+0

¡El más cercano es muy útil! (No lo había visto antes). – DavidC

+0

Elegí su entrada porque primero tuvo la idea de usar 'Dynamic [{Nearest [myTics, pts [[1]]]}]'. Tenía la intención de que las garrapatas fueran marcas en lugar de puntos, pero eso es solo una cuestión de cosméticos. – DavidC

+0

@David Saco puntos porque pensé que la imagen en la respuesta es algo más clara. Puede usar lo que quiera (o reemplazar completamente el comando ListPlot []). Prefiero la solución de Mr.Wizard, simplemente porque es visualmente más atractiva. –

Cuestiones relacionadas