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

时间:2011-03-10 18:02:29

标签: 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轴。

我想将每个定位器限制在myTicks中的x值。 (在完整的程序中,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 个答案:

答案 0 :(得分:3)

我们试试这个:

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

答案 1 :(得分: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]
]