Как я могу ограничить локаторы ограниченным (но не регулярным) набором позиций? - PullRequest
5 голосов
/ 10 марта 2011

В Mathematica локаторы могут быть ограничены определенными областями экрана с помощью параметров LocatorPane (см. Документацию LocatorPane .)

Список из трех упорядоченных пар {{{minX, minY}, {maxX, maxY}, {dX, dY}}} обычно является ключом к определению поведения локаторов. {minX, minY} и {maxX, maxY} установить регион. {dX, dY} устанавливает размер прыжка: ноль для неограниченного, любое другое положительное число для размера каждого прыжка.

В приведенном ниже коде {{{-.9, 0}, {1, 0}, {0, 0}}} устанавливает регион и переходы для локатора pts. Первые две упорядоченные пары ограничивают локаторы интервалом [-9, 1] в числовой строке. Упорядоченная пара {0, 0} не накладывает дополнительных ограничений ни на один из локаторов. Однако, поскольку значения y могут быть только нулевыми, из-за области, определенной первыми двумя элементами, ни один локатор не может покинуть ось X.

Я бы хотел ограничить каждый локатор значениями x в myTicks. (В полной программе myTicks будет меняться со временем в зависимости от решений, принятых пользователем.) Поскольку отметки не распределены равномерно вдоль x, проблему нельзя решить, установив постоянное значение для x-jump. И если бы значение учитывало текущую позицию локатора, следующий левый прыжок мог бы иметь размер, отличный от правого прыжка.

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

Будем благодарны за любые предложения!

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Это похоже на работу.

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]
]
3 голосов
/ 10 марта 2011

Давайте попробуем это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...