2011-03-10 39 views
5

在數學,定位器可以通過的LocatorPane參數被約束爲一定畫面區域(參見LocatorPane文檔。)我如何限制定位器到有限的(但不是常規的)位置?

3的列表有序對{{{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跳設置恆定值來解決問題。如果該值考慮了定位器的當前位置,則下一個左側跳可能與右側跳不同。

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

任何建議,將不勝感激!

+0

順便說一下,我使用了'mouseevent'標籤,因爲我懷疑這裏可能涉及到鼠標行爲的一些細微之處。 – DavidC 2011-03-10 18:14:47

回答

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

@ Mr.Wizard這非常好用。我喜歡你保持定位器拖放個性的方式:當發佈時,定位器根據需要跳到最近的刻度。 – DavidC 2011-03-10 19:58:08

+0

@ Mr.Wizard您的實現實際上比所選條目更流暢。但是因爲兩個答案都依賴於「最近的」,我選擇了第一個提交的答案。 – DavidC 2011-03-11 01:57:33

+0

@大衛正如我對另一位用戶說的那樣,這當然是你的特權,但我無法真正理解它。如果選擇有效的第一種解決方案,並且如果出現更好的解決方案則不會改變該選擇,那麼提交改進的解決方案的動力就會降低。在這種情況下,我並不認爲我的解決方案更好,但如果是這樣,爲什麼不選擇它?順便說一句,我沒有看到Belisarius使用Nearest(在我自己之前),我花了很長時間找到一個使用它的工作解決方案。 – 2011-03-11 02:08:15

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

+0

最近的非常有用! (我以前沒有見過)。 – DavidC 2011-03-10 19:53:30

+0

我選擇了你的參賽作品,因爲你首先了解了使用Dynamic [{Nearest [myTics,pts [[1]]]}]'。我原本以爲蜱是蜱而不是分,但這只是化妝品的一個問題。 – DavidC 2011-03-11 01:53:23

+0

@大衛我畫點,因爲我認爲答案中的圖像更清晰。你可以使用任何你想要的(或者完全替換ListPlot []命令)。我更喜歡Mr.Wizard的解決方案,只是因爲它在視覺上更具吸引力。 – 2011-03-11 02:13:45