Преобразуйте Динамическое [] конструкция к числовому списку

Я пытался соединить что-то, что позволяет мне извлекать точки из ListPlot для использования их в дальнейших вычислениях. Мой текущий подход должен выбрать точки с Локатором []. Это хорошо работает для отображения точек, но я не могу выяснить, как извлечь численные значения из конструкции с головой, Динамичной []. Ниже автономный пример. Путем перетаскивания серого локатора необходимо смочь выбрать точки (обозначенный розовым локатором и сохраненный в q, список двух элементов). Это - вторая строка ниже графика. Теперь я хотел бы передать q[[2]] функции или возможно просто отобразить его. Однако обработки Mathematica q как единственный объект с головой Dynamic, и таким образом принятие второго участия невозможно (следовательно сообщение об ошибке). Может любой проливать свет на то, как преобразовать q в обычный список?

EuclideanDistanceMod[p1_List, p2_List, fac_: {1, 1}] /; 
   Length[p1] == Length[p2] := 
  Plus @@ (fac.MapThread[Abs[#1 - #2]^2 &, {p1, p2}]) // Sqrt;
test1 = {{1.`, 6.340196001221532`}, {1.`, 
    13.78779876355869`}, {1.045`, 6.2634018978377295`}, {1.045`, 
    13.754947081416544`}, {1.09`, 6.178367702583522`}, {1.09`, 
    13.72055251752498`}, {1.135`, 1.8183153704413153`}, {1.135`, 
    6.082497198000075`}, {1.135`, 13.684582525399742`}, {1.18`, 
    1.6809452373465104`}, {1.18`, 5.971583107298081`}, {1.18`, 
    13.646996905469383`}, {1.225`, 1.9480537697339537`}, {1.225`, 
    5.838386922625636`}, {1.225`, 13.607746407088161`}, {1.27`, 
    2.1183174369679234`}, {1.27`, 5.669799095595362`}, {1.27`, 
    13.566771130126131`}, {1.315`, 2.2572975468163463`}, {1.315`, 
    5.444014254828522`}, {1.315`, 13.523998701347882`}, {1.36`, 
    2.380307009155079`}, {1.36`, 5.153024664297602`}, {1.36`, 
    13.479342200528283`}, {1.405`, 2.4941312539733285`}, {1.405`, 
    4.861423833512566`}, {1.405`, 13.432697814928654`}, {1.45`, 
    2.6028066447609426`}, {1.45`, 4.619367407525507`}, {1.45`, 
    13.383942212133244`}};
DynamicModule[{p = {1.2, 10}, q = {1.3, 11}},
 q := Dynamic@
   First@test1[[
     Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ test1, 
      1, #1[[2]] < #2[[2]] &]]];
 Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
      Graphics@Locator[Dynamic[p]], 
      Graphics@
       Locator[q, Appearance -> {Small}, 
        Background -> Pink]}]}, {Dynamic@p}, {q},{q[[2]]}}]]
7
задан Michael Pilat 6 May 2010 в 14:05
поделиться

2 ответа

После небольшого дополнительного исследования выяснилось, что ответ вращается вокруг того факта, что Dynamic [] является оболочкой для обновления и отображения выражения. Любые вычисления, которые вы хотите динамически обновлять, должны быть помещены в оболочку: например, вместо выполнения чего-то вроде q = Dynamic [p] + 1 следует использовать что-то вроде Dynamic [q = p + 1; q]}] . В моем примере, где я хотел разделить q на две части, вот обновленный код:

DynamicModule[{p = {1.2, 10}, q = {1.3, 11}, qq, q1, q2}, 
 q := Dynamic[
   qq = First@
     test1[[Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ 
         test1, 1, #1[[2]] < #2[[2]] &]]];
   {q1, q2} = qq;
   qq
   ];
 Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
      Graphics@Locator[Dynamic[p]], 
      Graphics@
       Locator[q, Appearance -> {Small}, 
        Background -> Pink]}]}, {Dynamic@p}, {Dynamic@q}, {Dynamic@
     q1}}]]

Если мне все еще что-то не хватает или есть более чистый способ сделать это, я приветствую любые предложения. ..

2
ответ дан 7 December 2019 в 07:41
поделиться

Есть несколько способов извлечения значений из динамического выражения. Вам, вероятно, понадобится Параметр (документация) , который преобразует все динамические значения в их значения во время оценки Настройка .

In[75]:= Slider[Dynamic[x]] (* evaluate then move the slider *)

In[76]:= FullForm[Dynamic[x]]
Out[76]//FullForm= Dynamic[x]

In[77]:= FullForm[Setting[Dynamic[x]]]
Out[77]//FullForm= 0.384`

Вот немного более сложный пример:

DynamicModule[{x},
  {Dynamic[x], Slider[Dynamic[x]], 
    Button["Set y to the current value of x", y = Setting[Dynamic[x]]]}
]

Если вы оцените приведенное выше выражение, переместите ползунок и затем нажмите кнопку, текущее значение x , установленное ползунком, будет присвоено ] y . Если вы затем снова переместите ползунок, значение y не изменится, пока вы снова не обновите его, нажав кнопку.

Вместо присвоения переменной вы, конечно, можете вставлять значения в записную книжку, вызывать функцию, экспортировать файл и т. Д.

5
ответ дан 7 December 2019 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: