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

Wolfram mathematica 如何将定位器约束到有限(但不是常规)的位置集?,wolfram-mathematica,mouseevent,Wolfram Mathematica,Mouseevent,在Mathematica中,可以通过定位器窗格的参数将定位器约束到某些屏幕区域(请参阅文档) 三个有序对的列表通常是确定定位器行为的关键{minX,minY}和{maxX,maxY}设置区域{dX,dY}设置跳转大小:0表示无限制,任何其他正数表示每个跳转的大小 在下面的代码中,{{{-.9,0},{1,0},{0,0}}设置定位器的区域和跳转pts。前两个有序对将定位器限制在数字行上的间隔[-9,1]。有序对{0,0}对两个定位器都没有附加约束。但是,由于y值只能为零,由于前两个项目定义的区域

在Mathematica中,可以通过
定位器窗格
的参数将定位器约束到某些屏幕区域(请参阅文档)

三个有序对的列表通常是确定定位器行为的关键
{minX,minY}
{maxX,maxY}
设置区域
{dX,dY}
设置跳转大小:0表示无限制,任何其他正数表示每个跳转的大小

在下面的代码中,
{{{-.9,0},{1,0},{0,0}}
设置定位器的区域和跳转
pts
。前两个有序对将定位器限制在数字行上的间隔[-9,1]。有序对
{0,0}
对两个定位器都没有附加约束。但是,由于y值只能为零,由于前两个项目定义的区域,两个定位器都不能自由离开x轴

我想将每个定位器限制为
myTicks
中的x值。(在完整程序中,myTicks将随时间变化,具体取决于用户所做的决定。)由于ticks沿x的间隔不均匀,因此无法通过为x跳跃设置常量值来解决此问题。如果将该值考虑到定位器的当前位置,则下一个左跳可能与右跳的大小不同

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

如有任何建议,将不胜感激

让我们试试这个:

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]

这似乎有效

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]
]

顺便说一下,我使用了
mouseevent
标记,因为我怀疑这里可能涉及到一些关于鼠标行为的微妙之处。Nearest非常有用!(我以前没有见过)。我选择您的条目是因为您首先了解了使用
Dynamic[{Nearest[myTics,pts[[1]]]}]
。“我本来想让蜱虫成为蜱虫而不是点,但那只是化妆品的问题。@David我画点是因为我觉得答案中的图像更清晰一些。”。您可以随意使用(或完全替换ListPlot[]命令)。我更喜欢Wizard先生的解决方案,只是因为它在视觉上更吸引人。@Mr.Wizard这非常有效。我喜欢您保持定位器拖放特性完好无损的方式:释放定位器时,定位器会根据需要跳转到最近的刻度。@Mr.Wizard您的实现实际上比选择的条目工作得更顺利。但是因为两个答案都依赖于最近的,所以我选择了第一个提交的。@David,正如我对另一个用户说的,这当然是你的特权,但我不能真正理解它。如果一个人选择了第一个有效的解决方案,并且在提出更好的解决方案时没有改变选择,那么提交改进的解决方案的动机就会减少。在这种情况下,我并不认为我的解决方案更好,但如果是,为什么不选择它呢?顺便说一句,我没有看到belisarius(在我自己之前)使用了Nearest,我只是花了更长的时间使用它来找到一个有效的解决方案。@Mr.I Agreement//go@Mr.Wizard@belisarius我可以改变我的决定吗?你的论点听起来是正确的。我确实认为Wizard先生的解决方案更加完美;他把蜱虫当作蜱虫来保存。我的回答主要是根据有效解决方案的顺序。