Hola, a todos.
Hacía bastante tiempo que no pasaba por aquí, así que, lo primero de todo, saludos.
Y lo segundo, el problema.
Estoy haciendo un programa JavaScript para dibujar en un gráfico la relación del Corrimiento al Rojo de la luz de una Supernova de tipo 1a con su magnitud estelar.
Este trabajo lo hicieron Perlmutter y otros astrofísicos en 1997, a partir de la observación de unas 40 galaxias, y consiguieron un gráfico como el siguiente:

Como veis, para un valor de z de 0 a 1 se observan unas magnitudes que llegan hasta 24~25.
Yo estoy haciendo un programa que haga lo mismo, peo no a partir de observaciones, sino de cálculo.

Mi idea es generar el gráfico pudiendo introducir un valor de z de 1 a 99 y dibujar el gráfico correspondiente para varios supuestos de cálculo.
Me explico, determinar la distancia a una galaxia no es tarea sencilla, se han hecho varias suposiciones y cada una de ellas dará lugar a una curva distinta. En mi gráfico, por ejemplo, hay dos líneas, una está basada en la expansión cosmológica del universo y la otra en el efecto dopler, pero en su momento quiero añadir las curvas correspondientes a otros dos métodos distintos, lo cual dará lugar a otras dos curvas, que aún no sé lo similares o distintas que van a ser.
Hasta ahora me he encontrado con dificultades que con más o menos tiempo y estudio he podido resolver, pero una opción que quería añadir al programa me ha hecho estrellarme contra un muro. Vamos, esto

Aunque el primer gráfico de Perlmutter es correcto y bastante explicativo, la versión del gráfico que se ha hecho más popular es la siguiente.

Es el mismo gráfico, los mismos datos, pero en este último la escala de z no es lineal, sino logarítmica.
Pues bien, en mi programa quiero añadir la opción de ver ambas escalas, la lineal o la logarítmica, y la lineal ya la tengo, pero...
¡¡no consigo la escala logarítmica!!
Os diré el proceso que sigo para que veáis por donde voy:
// Leer Datos de Formulario
TipoEscala = Formu.Escala.value;
vZ = Valor(Formu.tZ.value);
LogMaxZ = Math.log10(vZ);
EscalaLogZ = gAncho / LogMaxZ;
gAncho es el ancho del gráfico en píxeles.
Un problema, si se introduce como z el valor de 1, su logaritmo sería 0, lo cual me daría una curva plana, y sería aún peor si introducen un valor menor de 1, como 0'5, porque entonces daría un valor negativo, así que supongo que en la fórmula debería poner Math.log10(vZ+1). Creo.
Voy a tener cuatro funciones, para dibujar cuatro curvas distintas, y en cada una de ellas voy a recorrer el gráfico, desde 0 hasta gAncho, y para cada píxel conseguiré el valor que le corresponde de z.
Como ejemplo:
function DibujaCurvaMOnda()
{
var x, z, m;
Dibujo.lineWidth = "1";
Dibujo.strokeStyle = "blue";
m=CalculaMOnda(CalculaZ(1));
Dibujo.beginPath();
Dibujo.moveTo(gX,gY+gAlto-m*EscalaM);
for (x=1;x<gAncho;x++)
{
z=CalculaZ(x);
m=CalculaMOnda(z);
Dibujo.lineTo(gX+x,gY+gAlto-m*EscalaM);
}
Dibujo.stroke();
}
Es sencillo ¿verdad?
Y ahora el problema:
function CalculaZ(x)
{
var z;
if (TipoEscala == "Lin")
z=vZ*x/gAncho;
else
{
¡¡¡^*ç¨Ç*//$%&!!!
}
return z;
}
En fin, como veis, si la escala es lineal, la solución es bastante fácil, vZ*x/gAncho, pero si se elige la escala logarítmica ¿cómo calculo z a partir de x?
Lo he intentado de varias formas, y el caso es que creo que debería ser sencillo, pero no lo consigo.
¿podríais echarme una mano?