Estoy intentando tener dos paneles, el izquierdo mostrando un gráfico y dos localizadores, el derecho una versión ampliada en el área definida por los localizadores.problema de interactividad dinámica
He intentado
ClearAll[mndpt];
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
Module[{z, iters},
iters = 0.;
z = c;
While[(iters < maxiter) && ([email protected] < 2),
iters++;
z = z^2 + c];
Sqrt[iters/maxiter]],
{{z, _Complex}},
CompilationTarget \[Rule] "C",
RuntimeOptions \[Rule] "Speed"];
y hacer
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],
[email protected]{x, p1[[1]], p2[[1]]}, [email protected]{y, p1[[2]], p2[[2]]},
PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80,
ColorFunction \[Rule] "Rainbow"]}}],
{{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]
El panel de la derecha no lo hace entonces funcionar:
Mi pregunta es, ¿por qué es esto así? Como puede ver, se queja de que "DensityPlot :: pllim: Especificación de rango {x, -1,0} no es de la forma {x, xmin, xmax}." Lo cual me resulta desconcertante. De hecho, generalmente estoy desconcertado. Que esta pasando? ¿Algún tipo de problema de alcance? ¿Problema de evaluación? ¿Y cómo puedo hacer que funcione? Esto es probablemente simple, pero nunca entendí realmente este frontend.
EDITAR: Resulta que esta pregunta se debió a un (agudo) momentáneo aumento en la estupidez de mi parte. Como señaló Simon en un comentario, eliminar los dos Dynamics
(que había agregado en un esfuerzo ciego para que esto funcione) hace que todo funcione bien. Es decir,
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}]
hace lo correcto:
Entonces, ¿quién sabe qué otra cosa que hice las primeras veces de modo que no funcionaba.
Por otro lado, el mensaje en el caso original, a saber, "DensityPlot :: pllim: especificación de rango {x, -1,0} no es de la forma {x, xmin, xmax}." Era más misterioso. Creo que ha sido explicado por Leonid, también en un comentario (en resumen, prueba ClearAttributes[Dynamic, ReadProtected]
luego ??Dynamic
y puedes ver que hay una definición Dynamic/:MakeBoxes[BoxForm`x$_Dynamic,StandardForm]:=
, etc.). Como mi comprensión de la programación frontend es insignificante, no trataré de explicarla aquí, así que si alguien publica una respuesta explicando eso, sería apreciado.
Suelta los dos 'Dynamic's y todo funciona bien. – Simon
@Simon oh wow, gracias! Los había puesto allí porque "no funcionó" y comencé a agregar cosas al azar hasta que funcionó. Quién sabe lo que hice ... Pon tu comentario como respuesta para poder aceptarlo. Además, si tiene alguna idea de por qué el 'Dynamic' lo estropea, me gustaría saberlo. – acl
@Simon OK, probablemente sea porque 'Dynamic' tiene el atributo' HoldFirst'. ¿O? – acl