Foros del Web » Programando para Internet » Javascript »

Optimizacion de f(x) y aleatoreidad

Estas en el tema de Optimizacion de f(x) y aleatoreidad en el foro de Javascript en Foros del Web. Buenas!!! Recurro a ustede para ver si pueden ayudarme a resolver un problema que vengo teniendo hace poco mas de dos dias. Resulta que el ...
  #1 (permalink)  
Antiguo 21/04/2009, 16:56
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 4 meses
Puntos: 1
Optimizacion de f(x) y aleatoreidad

Buenas!!! Recurro a ustede para ver si pueden ayudarme a resolver un problema que vengo teniendo hace poco mas de dos dias.

Resulta que el cliente me pide que le haga una "intro" al sitio web, donde se abra y se cierre un acordeon y se vayan mostrando distintas fotos. Esto, basicamente, era flash seguro. Pero como no se flash, acudi a algunos de mis conocimientos en javascript, y logre lo siguiente:

http://localhost/dbk/intro.html

Ahora, como podran ver en el codigo que les pongo a continuacion (que es el mismisimo .js del archivo), a) es muy poco optimo, ya que se repite codigo, b) se complica para grandes cantidades de fotografias, c) el cliente requiere que sean aleatorias las fotos, sino aquel que quiere saltear la intro, va a ver siempre la mimsa, y es medio aburrido.

Código:
/* ANIMACION INTRO */
function intro_fx(){
	intro_dentro();
	setTimeout("intro_fuera()",2650);
	setTimeout("cambiar_fondo1()",3300);
	setTimeout("intro_dentro()",3800);
	setTimeout("intro_fuera()",6450);
	setTimeout("cambiar_fondo2()",7100);
	setTimeout("intro_dentro()",7600);
	setTimeout("intro_fuera()",10250);
	setTimeout("cambiar_fondo3()",10900);
	setTimeout("intro_dentro()",11100);

	}


function cambiar_fondo1(){
		document.getElementById('cont_foto_intro').style.background = "url('images/intro/intro02.jpg') no-repeat";
		}
function cambiar_fondo2(){
		document.getElementById('cont_foto_intro').style.background = "url('images/intro/intro03.jpg') no-repeat";
		}
		
function cambiar_fondo3(){
		document.getElementById('cont_foto_intro').style.background = "url('images/intro/fondo_intro.gif') no-repeat";
		}

		
	
function intro_fuera() {
setTimeout ("intro_cero()",650);
setTimeout ("intro_uno()",600);
setTimeout ("intro_dos()",550);
setTimeout ("intro_tres()",500);
setTimeout ("intro_cuatro()",450);
setTimeout ("intro_cinco()",400);
setTimeout ("intro_seis()",350);
setTimeout ("intro_siete()",300);
setTimeout ("intro_ocho()",250);
setTimeout ("intro_nueve()",200);
setTimeout ("intro_diez()",150);

}

function intro_dentro() {
setTimeout ("intro_cero()",50);
setTimeout ("intro_uno()",100);
setTimeout ("intro_dos()",150);
setTimeout ("intro_tres()",200);
setTimeout ("intro_cuatro()",250);
setTimeout ("intro_cinco()",300);
setTimeout ("intro_seis()",350);
setTimeout ("intro_siete()",400);
setTimeout ("intro_ocho()",450);
setTimeout ("intro_nueve()",500);
setTimeout ("intro_diez()",550);


}
	

	/* cont_foto_intro */

function intro_diez () {
document.getElementById('cont_foto_intro').style.width = "464px";
}
function intro_nueve () {
document.getElementById('cont_foto_intro').style.width = "450px";
}
function intro_ocho () {
document.getElementById('cont_foto_intro').style.width = "400px";
}
function intro_siete () {
document.getElementById('cont_foto_intro').style.width = "350px";
}
function intro_seis () {
document.getElementById('cont_foto_intro').style.width = "300px";
}
function intro_cinco () {
document.getElementById('cont_foto_intro').style.width = "250px";
}
function intro_cuatro () {
document.getElementById('cont_foto_intro').style.width = "200px";
}
function intro_tres () {
document.getElementById('cont_foto_intro').style.width = "150px";
}
function intro_dos () {
document.getElementById('cont_foto_intro').style.width = "100px";
}
function intro_uno () {
document.getElementById('cont_foto_intro').style.width = "50px";
}
function intro_cero () {
document.getElementById('cont_foto_intro').style.width = "0";
}
Basicamente las funcione intro_x() le dan a un div un ancho especifico, y lo que hago es ejecutar esas funciones, una luego de la otra, en un lapso muy pequeño de tiempo, de modo que se parezca que se abre gradualmente. Luego, una vez que se abre, espero una cantidad de tiempo x (en este caso, 2 segundos) y lo cierro, y cambia la foto del div, y vuelvo a abrir la solapa, y asi 3 veces.

Como podran ver, no es optimo para nada. Con estos 3 ejemplos de foto, funciona perfectamente, pero el cliente me pidio ahora 30/40 fotos de intro, con lo cual se me complica muchisimo.

Del mismo modo, este codigo no permite que sea aleatoria la visualizacion de las imagenes. Yo estoy haciendo un curso de Algoritmos I, donde vemos Python, y en dicho programa existe un modulo llamado random que, dado un rango de numeros, el programa los mezcla (random.shuffle). Existe algo asi en JS? Y seria posible implementarlo para mi caso??

Quiero decirles que intente hacer funcione con parametros, pero al ponerlos dentro de setTimeout("funcion("parametro")",tiempo) no funcionba, supongo que por el tema de las comillas.

Alguna ayuda?? Desde ya, muchas gracias a todos los que puedan aportar su granito de arena para esta optimizacion, ya sea con codigo, links, o aportes de ideas!!!

Saludos!!

Pablo.
  #2 (permalink)  
Antiguo 21/04/2009, 17:36
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Optimizacion de f(x) y aleatoreidad

1. Haz una sola función a la que le pases como parámetro la url de la imagen
2. Mete las URLs en un array
2.b. Haz todas las imágenes del mismo tamaño
3. Genera un número aleatorio
4. Llama a la función con el elemento del array indicado por el número aleatorio
5. Vuelve al punto 3 al cabo de un rato.

6. Dile a tu cliente, que los visitantes odian las intros, que se la van a saltar siempre, qe nadie va a ver nunca sus 30 fotos y que no merece la pena obligarle al usuario a tener que dar a "saltar intro" sólo porque él quiera poner unas cuantas fotos.

:)
  #3 (permalink)  
Antiguo 21/04/2009, 20:17
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Optimizacion de f(x) y aleatoreidad

Desde ya, venkman muchas gracias por tu ayuda!!!

Ya le pase tu punto de vista acerca de las intros (el cual comparto... no hay intro que no saltee!) a mi cliente, pero de todas formas, tengo que seguir implementando la idea y el luego verá si es muy "pesada" (en el sentido de aburrida) o si vale la pena.

Ahora, te agradeceria que me ayudara con el codigo, pues como dije en el msj anterior, tuve problema utilizando parametros (ya que la forma en que trabajan respecto de python es muy distinta y no logro acostumbrarmee!!).

1)
Código:
function cambiar_fondo(foto){
		document.getElementById('cont_foto_intro').style.background = "url('images/intro/"+ foto + "') no-repeat";
		}
Algo asi?? ahi pongo el nombre de la foto mas la extension, y tendria que andar.

2) Digamos algo asi??

Código:
var fotos = new Array ("foto1.jpg", "foto2.jpg", "foto3.jpg")
3) Ya a partir de aqui no te sigo.

El numero que deberia crear deberia estar entre 0 y n-1, no? Siendo n el numero de fotos? Y luego llamaria, no se... a fotos[aleatorio] ???

Y como te aseguras, por ejemplo, que si tenes 20 fotos, no salga 2 veces la misma antes de que salgan todas?? pq al hacer un numero aleatorio pueden salir la siguiente seria de numoros, x ejemplo:

[1,4,7,2,9,3,0,1...]

y la foto 1 se mostraria de nuevo antes que la 10, supongamos. Eso como lo aseguro, entonces??

Y del mismo modo, como hago para que al cabo de un rato vuelva al punto 3??? Si podrias explicarte con un ejemplo de, aunque sea, pseudocodigo para que puede entenderte mejor, con los casos que he utilizado, la verdad que estaria muy agradecido...

En este mismo foro encontre un codigo muy similar a lo que pretendo, pero no logro entenderlo en su totalidad y por ende, aplicarlo en mi caso en particular. Quizas te sirva para ayudarme en mi caso, ya que dice cada cuento quieres ejecutarlo, etc. Pero no se como ponerle a eso mi efecto de abir/cerrar, y hacerlo que sea el background del div. Si me podrias ayudar ahi, o con tu codigo que intentaste decirme, seria muy bueno!!!


http://www.forosdelweb.com/f13/selec...script-173477/

Muchas gracias por tu ayuda y nuevamente, a todos los que puedan meter su granito de arena, seran realmente bienvenidos!! Gracias!!


Pablo.
  #4 (permalink)  
Antiguo 22/04/2009, 01:59
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Optimizacion de f(x) y aleatoreidad

3. Nada te lo asegura. Si lo que quieres es eso, lo que puedes hacer es:

Código javascript:
Ver original
  1. var fotos = ["foto1.jpg", "foto2.jpg", "foto3.jpg", "foto4.jpg", "foto5.jpg"];
  2. fotos.sort(function(a,b) {return 2*Math.random()-1});
  3. // y ya las tienes desordenadas aleatoriamente sin repetirse:
  4. alert(fotos);
Ahora ya no generas un número aleatorio cada vez sino que las muestras en orden. Por ejemplo, algo parecido a esto:

Código javascript:
Ver original
  1. var fotos = ["foto1.jpg", "foto2.jpg", "foto3.jpg", "foto4.jpg", "foto5.jpg"];
  2. fotos.sort(function(a,b) {return 2*Math.random()-1});
  3. function cambiar_fondo(foto){
  4.     document.getElementById('cont_foto_intro').style.background = "url('images/intro/"+ foto + "') no-repeat";
  5. }
  6. var i = 0;
  7.  
  8. function ciclo() {
  9.     cambiar_fondo(fotos[i]);
  10.     i++;
  11.     if (i >= fotos.length) i = 0;
  12.     setTimeout(ciclo, 3000 * Math.random()+1000); // un tiempo aleatorio entre 1 y 4 segundos.
  13. }
  14. setTimeout(ciclo, 1500); // La primera la dejamos 1.5 segundos

Última edición por venkman; 22/04/2009 a las 02:17
  #5 (permalink)  
Antiguo 22/04/2009, 09:22
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Optimizacion de f(x) y aleatoreidad



Aplausos y mas aplausos! La verdad, justo lo que necesitaba... bah, le hice algunos cambios, pero realmente funciono. Eso es lo que queria hacer, que es lo que hacia yo con las listas de python y hacer listas.sort(), pero no sabia si aca existia. Veo que si :)

Este es el codigo y como lo modifique:

Código:
var fotos = ["fot1.jpg", "fot2.jpg", "fot3.jpg"];
fotos.sort(function(a,b) {return 2*Math.random()-1});


function cambiar_fondo(foto){
    document.getElementById('cont_foto_intro').style.background = "url('images/intro/"+ foto + "') no-repeat";
}
var i = 0;
 
function ciclo() {
	cambiar_fondo(fotos[i]);
	intro_dentro();
	setTimeout("intro_fuera()",3000)
	i++;
    if (i >= fotos.length) i = 0;
    setTimeout(ciclo, 4000);
}
Las funcione intro_dentro() e intro_fuera() hacen que se abra y se cierre la foto, como lo podes ver aca: http://www.prevefilms.com/intro.html

Ahora, lo que no logro hacer, y por mas que me doy vueltas no doy en la tecla, es lo siguiente:

Ponele, que la foto 30.jpg sea SIEMPRE la ultima, ya que va a tener una imagen especial que diga "Entrar al sitio". Y, por ende, que se deje de ejecutar el codigo, digamos, alguna especia de 'break'. Pero no se como hacer que esa sea la ultima foto, ni que se ejecute tantas veces como fotos hay, y que luego deje de funcionar.

Podrias darme una mano ahi?? saludos y gracias!!

Pablo
  #6 (permalink)  
Antiguo 22/04/2009, 09:33
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Optimizacion de f(x) y aleatoreidad

se me ocurrio hacer esto:

Código:
if (i >= fotos.length) 
{ mostrar la foto que siempre va ultima;
break;}
Como ahora no estoy en mi casa no puedo decir si funciona, pero creo que andaria bastante bien, si es que funciona el break en javascript.. que opinas??

saludos y gracias por tu ayuda!!!


Pablo
  #7 (permalink)  
Antiguo 22/04/2009, 10:26
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Optimizacion de f(x) y aleatoreidad



Código:
var fotos = ["fot1.jpg", "fot2.jpg","fot3.jpg", "fot4.jpg", "fot5.jpg", "fot6.jpg", "fot7.jpg", "fot8.jpg", "fot9.jpg"];
var foto_final = ["final.jpg"];
fotos.sort(function(a,b) {return 2*Math.random()-1});


function cambiar_fondo(foto){
    document.getElementById('cont_foto_intro').style.background = "url('images/intro/"+ foto + "') no-repeat";
}
var i = 0;
 
function ciclo() {
	cambiar_fondo(fotos[i]);
	setTimeout("intro_dentro()",1000);
	setTimeout("intro_fuera()",4000)
	i++;
    if (i >= fotos.length) {
	setTimeout("cambiar_fondo(foto_final[0])",5000);
	setTimeout("intro_dentro()",6000);
	return };
    setTimeout(ciclo, 5000);
}

Ya logre resolverlo. No se si con el return es la forma mas "linda", pero por lo menos se que cuando aparece un return, la funcion termina. Y aproveche eso y asi es lo que hice: http://www.prevefilms.com/intro.html

Como ves el efecto??? O sea, en la pagina? Lo ves bien?? O que cambiarias (por ejemplo, no utilizar cambiar el bakground del div y sino cambiar el src de la foto dentro del div, cosa que no se hacer por eso no hice! ;) .. u otra cosa para que se vea mejor?)... desde ya son bienvenidas las opiniones!!! saludos!! y gracias por la ayuda!

Pablo


PD: como haces para poner codigo javascript aqui?? Pq no me aparece esa etiqueta a mi... :S
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:45.