Foros del Web » Creando para Internet » Flash y Actionscript »

Como hacer una parabola

Estas en el tema de Como hacer una parabola en el foro de Flash y Actionscript en Foros del Web. Hola amigos que tal Estoy intentando hacer una parabola, pero no tengo la idea concreta de como puedo hacerlo. Al evaluar la funcion f(x) = ...
  #1 (permalink)  
Antiguo 08/01/2005, 12:32
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Como hacer una parabola

Hola amigos que tal

Estoy intentando hacer una parabola, pero no tengo la idea concreta de como puedo hacerlo. Al evaluar la funcion f(x) = ax2 + bx + c, los valores los meto a un arreglo. Pero el problema es que al momento de graficar no se como hacerlo, es decir, la duda es que no se como colocar los puntos exactamente en la pantalla, lo tengo que hacer por pixeles o Coordenadas o en que?
Alguien pudiera explicarme

Agradezco anticipadamente su valiosa ayuda.

Atte. Curiel.
  #2 (permalink)  
Antiguo 08/01/2005, 14:46
Avatar de rod524  
Fecha de Ingreso: agosto-2004
Mensajes: 517
Antigüedad: 19 años, 8 meses
Puntos: 0
Hola,

La forma más sencillo de hacer eso es mediante ActionScipt, sin usar gráficos ni nada más que ActionScript. (bueno los gráficos los usarás para los ejes etc).

A continuación un ejemplo que fuciona:

1. Abre un documento nuevo en blanco, y convierte los 4 primeros frames en keyframes vacíos.

2. en el frame (1) pega lo siguiente:



//Valor inicial de X.
i = 0;
// Valor final de X.
j = 10;

// Valores iniciales de constantes.
a = 1;
b = 0;
c = 0;

ZoomX = 5; // sólo para cambiar la apariencia (ancho de la gráfica).

//coordenadas donde estará 0,0 en el MovieClip.
Xorigen = 100;
Yorigen = 300;

Xold = Xorigen + i;
Yold = Yorigen - ((a * X * X) + (b * X) + c);


3. En el Frame (2) pega lo sigiente:

if (Number(i == ((j*10)+1))){gotoAndStop(4);
}
X = (i * .1);
Xnew = (X * ZoomX) + Xorigen;
Ynew = Yorigen - ((a * X * X) + (b * X) + c);
this.createEmptyMovieClip("parabola",i);
this.parabola.lineStyle(.1, 0xF92B00,100);
this.parabola.moveTo(Xold, Yold);
this.parabola.lineTo(Xnew, Ynew);
Xold = Xnew;
Yold = Ynew;
i++;



4. En el frame (3) pega:



gotoAndPlay(2);



5. En el frame (4) pega:


stop();


Y listo, ejecuta el documento y deberá graficar una parábola de línea roja cuyo origen 0,0 se encuentra en 100, 300 de tu stage.

para adecuarla a tus necesidades deberas entender el código y modificarlo a tu gusto, espero que esto te haya sido de ayuda.

Salidos.
  #3 (permalink)  
Antiguo 08/01/2005, 23:32
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Mucha Gracias Rod524

Segui los pasos que me das y me grafica la parabola que me dices, solo que la parte derecha, estudio bien el codigo para entenderle y ver que me consulte su parte simetrica a la izquierda y para cualquier duda te consulto mas tarde.

Atte. Curiel
  #4 (permalink)  
Antiguo 08/01/2005, 23:35
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Perdón es que me cree la parte simetrica a la izquierda

Saludos.
Atte. Curiel
  #5 (permalink)  
Antiguo 09/01/2005, 12:20
Avatar de rod524  
Fecha de Ingreso: agosto-2004
Mensajes: 517
Antigüedad: 19 años, 8 meses
Puntos: 0
Revisando el código me doy cuenta que ciertamente no estaba listo para graficar la parte negativa, con unas correcciones ha quedado así:

1. Sustituye el Frame (1) con este nuevo código:

// Valor inicial de X.
i = -150;
// Valor final de X.
j = 150;

// Valores iniciales de constantes.
a = 1;
b = 0;
c = 0;

ZoomX = 5; // sólo para cambiar la apariencia (ancho de la gráfica).

//coordenadas donde estará 0,0 en el MovieClip.
Xorigen = 100;
Yorigen = 300;

X = (i * .1);
Xold = Xorigen + (X * ZoomX);
Yold = Yorigen - ((a * X * X) + (b * X) + c);


2. Sustituye el Frame (2) con este nuevo código:

if (Number(i == (j+1))){gotoAndStop(4);
}
X = (i * .1);
Xnew = (X * ZoomX) + Xorigen;
Ynew = Yorigen - ((a * X * X) + (b * X) + c);
this.createEmptyMovieClip("parabola",i+1000);
this.parabola.lineStyle(.1, 0xF92B00,100);
this.parabola.moveTo(Xold, Yold);
this.parabola.lineTo(Xnew, Ynew);
Xold = Xnew;
Yold = Ynew;
i++;



3. Los Frames (3) y (4) quedan iguales.

Para grafica la parte negativa hay que indicar que se empieza en la parte de los negativos, en este caso se indicó
i = -150 y termina en la parte positiva j = 150;

Dado que lo que se grafica no es realmente una curva sino una sucesión de lineas rectas (diferencial de X) que está dado por X = i * 0.1 entonces con estos valores iniciales NO se grafica de -150 a 150, sino de -15 a 15.

Pero eso ya son cuestiones matemáticas y los valores e interpretación matemáticas será el trabajo que deberás ajustar, nuevamente, interpretándo el codigo arriba presentado.

Así, en esta ocasión al ejecutar el archivo en flash, deberá graficar una parábola simétrica que abre hacia arriba.

Como TIP para entender el código hay que tener en cuenta que mientras, matemáticamente el eje Y crece hacia arriba, en el caso de flash y otros paquetes de diseño el eje Y crece hacia abajo!!


Suerte.
  #6 (permalink)  
Antiguo 10/01/2005, 13:52
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Muchas Gracias Rod524

He probado el codigo y ahora si funciona bien, le voy a hacer una prueba de escritorio en papel siguiendo los valores de las variables para entender de que manera funciona el codigo. Y para cualquier cosa te pregunto mas tarde.

Atte. Curiel
P.D. Gracias por el Tip, eso no lo sabía.
  #7 (permalink)  
Antiguo 10/01/2005, 18:20
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Que tal Rod524

Después de seguir el codigo me surge la siguiente duda en las dos siguientes lineas
Xold = Xorigen + (X * ZoomX);
Yold = Yorigen - ((a * X * X) + (b * X) + c);

Corrigeme si estoy mal, ¡estas instrucciones son para colocar el punto en el lugar exacto de acuerdo a los valores que se pusieron como centro (100,300) del MC?

Por otro lado, al graficar la parte positiva, ésta se seguía graficando y no se detenía, por lo que no quedaba a la par con la positiva por lo que solo le agregue la sentencia else quedando de la siguiente forma:

if (Number(i == (j+1))){gotoAndStop(4);
}else{
X = (i * .1);
Xnew = (X * ZoomX) + Xorigen;
Ynew = Yorigen - ((a * X * X) + (b * X) + c);
this.createEmptyMovieClip("parabola",i+1000);
this.parabola.lineStyle(.1, 0xF92B00,100);
this.parabola.moveTo(Xold, Yold);
this.parabola.lineTo(Xnew, Ynew);
Xold = Xnew;
Yold = Ynew;
i++;
}

Ambas partes simétricas se grafican en la misma altura, es decir quedan a la par, pero me manda el siguiente error:

Un Script de ésta pelicula está provocando que el reproductor de flash se ejecute lentamente, so continua ejecutándose, su Pc podría no responder.

De antemano mil gracias.

Atte. Curiel
  #8 (permalink)  
Antiguo 10/01/2005, 22:32
Avatar de rod524  
Fecha de Ingreso: agosto-2004
Mensajes: 517
Antigüedad: 19 años, 8 meses
Puntos: 0
El codigo se ejecuta evaluando X, inicia en x = -150 y recorre todos los puntos con incremente de 0.1 hasta 150. (como se tiene X = i * 0.1) entonces grafica para el rango -15 a 15.

cada incremento de 0.1 nuevo calcula su posición para f(x), o sea "Y".

la forma en que trabaja es calculando un punto nuevo cuyas coordenadas son (Xnew, Ynew) y entonces la instrucción de dibujar una línea le dice que empiece a dibujar la lína en las coordenadas viejas (Xold, Yold) hacia las nuevas (Xnew, Ynew).

Al final del frame (2) las coordenadas nuevas se convierten en las coordenadas viejas para que la siguiente linea empice desde ahí:

Xold = Xnew;
Yold = Ynew;

Y en la siguiente itaración se calculan nuevas coordenadas y así continuamente hasta que " i " que se va incrementando en cada iteración sea igual a "j +1", cuando esto pasa, el "if" lo envia al frame (4) que es un stop y finaliza de graficar.

Como se indicó arriba, cada linea empieza en coordenadas viejas Xold, Yold y finaliza en las nuevas coordenadas Xnew, Ynew.

La situación es que, al tratar de graficar la primera linea no contamos con coordendas viejas, así que hay que obtenerlas de algún lado, en este caso el código que te ocasiona la duda:

Xold = Xorigen + (X * ZoomX); <<= Xold para 1er linea.
Yold = Yorigen - ((a * X * X) + (b * X) + c); <<= Yold para 1er linea

ese código se encuentra en el frame (1), el cual se utiliza para inicializar los valores a utilizar en el programa. El frame (1) se ejecuta 1 vez, y nuca más se vuelve a ocupar.

en cambio, el frame (2) realiza toda la acción de calcular nuevos puntos, definir los viejos puntos para nuevas líneas y graficar la parábola.

el frame (3) siempre va a regresar al frame (2) para un nuevo cálculo y nueva línea.

Creo no poder ser más específico.

Saludos.
  #9 (permalink)  
Antiguo 10/01/2005, 22:43
Avatar de rod524  
Fecha de Ingreso: agosto-2004
Mensajes: 517
Antigüedad: 19 años, 8 meses
Puntos: 0
ah, me olvidava, ese error lo saca flash cuando hay un codigo que produce un loop infinito....

el codigo de la parabola simetrica estaba bien, no necesitaba modificaciones, intenta con valores diferentes de i y j, como i = -4, j = 3 o los que sean, incluso con un decimal como i = 2.4 y j = 3.5 etc. y ajusta así hasta que quede simetrica como la necesites.

tambien puedes cambiar los valores de a, b, o c, eso hara que la gráfica suba o baje en el eje y.


Suerte nuevamente.
  #10 (permalink)  
Antiguo 10/01/2005, 23:17
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Hola Rod524

Perdón por insistir, tu explicación está muy bien detallada y le entiendo perfectamente, pero como te decia en el post de arriba, se comienza a graficar la parte negativa (de arriba hacia abajo), después empieza a graficar la parte positiva (de abajo hacia arriba), pero cuando llega el momento en que debe detenerse para que quede a la misma altura de donde empezo a graficarse la parte negativa, no lo hace y se sigue derecho. Esto logre solucionarlo poniendole la sentencia else como en el codigo que puse un post arriba, pero me manda este error:

Un Script de ésta pelicula está provocando que el reproductor de flash se ejecute lentamente, so continua ejecutándose, su Pc podría no responder.

Gracias anticipadas y espero no desesperarte.

Atte. Curiel
  #11 (permalink)  
Antiguo 11/01/2005, 11:23
Avatar de rod524  
Fecha de Ingreso: agosto-2004
Mensajes: 517
Antigüedad: 19 años, 8 meses
Puntos: 0
En el Frame (2) cambia:

if (Number(i == (j+1))){gotoAndStop(4);

por:

if (Number(i == j)){gotoAndStop(4);

y usa el resto del código original, no requiere modificaciones, tal vez hiciste un cambio que provoca que se cicle en un loop infinito y provoque el error que mencionas.

Con este pequeño cambio y siempre que le des valores iniciales simétricos a i y a j la parábola debe ser simétrica.

Te recomiendo que empieces nuevamente con un arcvhivo vacío desde el inicio, con el codigo que te di y el cambio que te menciono aquí.
  #12 (permalink)  
Antiguo 11/01/2005, 21:37
 
Fecha de Ingreso: enero-2003
Mensajes: 251
Antigüedad: 21 años, 3 meses
Puntos: 0
Hola rod524

Después de darte tanta lata, por fin quedo la parabola, tenías razón yo creo que el cansancio y sueño me hicieron hacer cosas que no debía haber hecho con el código, por lo que hoy lleve a cabo tu sugerencia de empezar nuevamente la pelicula y hacerle el cambio necesario en I=J y te cuento que funciona correctamente.

Una vez mas muchisimas gracias por la paciencia.

Atte. Curiel
  #13 (permalink)  
Antiguo 15/01/2005, 17:44
Avatar de wcfenix  
Fecha de Ingreso: agosto-2004
Ubicación: Lima
Mensajes: 168
Antigüedad: 19 años, 7 meses
Puntos: 0
Wow, sorprendente q flash haga las matematicas muy bien. El curso que odiaba en el cole...
__________________
"No te preocupes si no funciona bien. Si todo estuviera correcto, serías despedido de tu trabajo" - Ley de mosher
Blog [ http://www.tecnoaventuras.com ]
  #14 (permalink)  
Antiguo 15/01/2005, 22:16
 
Fecha de Ingreso: noviembre-2003
Mensajes: 4
Antigüedad: 20 años, 5 meses
Puntos: 0
Circunferencia

Dado que he seguido el tema con atención, me permito preguntarte como lo haría para generar, de la misma manera que generas la parábola, una circunferencia. He intentado cambios en el código, pero sin suerte alguna. La verdad es que no entiendo cabalmente el AS. Ojalá puedas ayudarme. Salud!!
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 20:25.