Я пытаюсь создать две панели: на левой панели изображены графика и два локатора, на правой - увеличенная версия в области, определенной локаторами.
Я пробовал
ClearAll[mndpt];
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
Module[{z, iters},
iters = 0.;
z = c;
While[(iters < maxiter) && (Abs@z < 2),
iters++;
z = z^2 + c];
Sqrt[iters/maxiter]],
{{z, _Complex}},
CompilationTarget \[Rule] "C",
RuntimeOptions \[Rule] "Speed"];
и сделать
Manipulate[
Grid[
{{DensityPlot[mndpt[x + y*I, 200],
{x, -2, 1}, {y, -1.5, 1.5},
PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80,
ColorFunction \[Rule] "Rainbow"],
DensityPlot[mndpt[x + y*I, 200],
Dynamic@{x, p1[[1]], p2[[1]]}, Dynamic@{y, p1[[2]], p2[[2]]},
PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80,
ColorFunction \[Rule] "Rainbow"]}}],
{{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]
Правая панель не работает:
Мой вопрос: почему это так? Как видите, он жалуется на то, что «DensityPlot :: pllim: спецификация диапазона {x, -1,0} не имеет форму {x, xmin, xmax}.», Что я нахожу озадачивающим. На самом деле я в целом озадачен. Что здесь происходит? Какая-то проблема с ограничениями? Вопрос оценки? И как мне заставить его работать? Это, наверное, просто, но я никогда не понимал этого интерфейса.
РЕДАКТИРОВАТЬ: Оказывается, этот вопрос был из-за (надеюсь, мгновенный) резкое увеличение глупости с моей стороны. Как указал Саймон в комментарии, удалив два Dynamics
(который я добавил в слепой попытке сделать эту работу) заставляет все работать нормально. То есть
Manipulate[
Grid[
{{DensityPlot[mndpt[x + y*I, 200],
{x, -2, 1}, {y, -1.5, 1.5},
PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80,
ColorFunction \[Rule] "Rainbow"],
DensityPlot[mndpt[x + y*I, 200],
{x, p1[[1]], p2[[1]]},{y, p1[[2]], p2[[2]]},
PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80,
ColorFunction \[Rule] "Rainbow"]}}],
{{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]
поступает правильно:
Итак, кто знает, почему еще я делал первые несколько раз, чтобы это не сработало.
С другой стороны, сообщение в исходном случае, а именно: «DensityPlot :: pllim: спецификация диапазона {x, -1,0} не имеет форму {x, xmin, xmax}.» Было более загадочным , Я думаю, что это было объяснено Леонидом, также в комментарии (вкратце, попробуйте ClearAttributes[Dynamic, ReadProtected]
, затем ??Dynamic
, и вы можете видеть, что есть определение Dynamic/:MakeBoxes[BoxForm`x$_Dynamic,StandardForm]:=
и т. Д.). Поскольку мое понимание программирования на внешнем интерфейсе незначительно, я не буду пытаться объяснить это здесь, поэтому, если кто-то опубликует ответ, объясняющий это, это будет оценено.