如何将定位器约束到有限(但不常规)的位置?

Dav*_*idC 5 wolfram-mathematica mouseevent

在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}}}]
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

任何建议,将不胜感激!

Mr.*_*ard 3

这似乎有效。

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]
]
Run Code Online (Sandbox Code Playgroud)