Wolfram mathematica 如何将定位器约束到有限(但不是常规)的位置集?
在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值只能为零,由于前两个项目定义的区域
定位器窗格
的参数将定位器约束到某些屏幕区域(请参阅文档)
三个有序对的列表通常是确定定位器行为的关键{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先生的解决方案更加完美;他把蜱虫当作蜱虫来保存。我的回答主要是根据有效解决方案的顺序。