¿Imitar péndulo en valores de una variable?

Iniciado por Tachikomaia, 13 Abril 2020, 00:42 AM

0 Miembros y 1 Visitante están viendo este tema.

Tachikomaia

Acabó de lograrlo así:
Escena 1
   actions for fotograma 1
      Var = 1;
      Var2 = 20;
      Use = "Var";
   actions for fotograma 2
      if (Var == 11) {
         trace (Var);
         stop ();
      } else if (Use == "Var") {
         trace (Var);
         Var = Var+1;
         Use = "Var2";
      } else {
         trace (Var2);
         Var2 = Var2-1;
         Use = "Var";
      }
   actions for fotograma 3
      gotoAndPlay (2);
Pero antes intentaba otro modo que no me salió y quiero saber cómo sería. Más o menos así:
C = 10

Si C == 10
         trace (C);
         stop ();
sino si C > 0
C++
C*-1
sino
C*-1

goto si
Gracias.

engel lex

que lenguaje es este?

no entiendo que intenta tu codigo

esto se puede hacer mas facil pero no entiendo esto com es un pendulo


lo mas simple para mi sería



C = 1
posicion = 1
WHILE C != 0:
C*=-1
posicion = posicion + C

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Tachikomaia

Uno fácil de entender, Action Script de Macromedia Flash 5.

Había explicado y tras haber logrado algo le di otro inicio al texto y olvidé la explicación.
Lo que quiero que haga el código es dar una serie de números así:
20, 1, 19, 2... hasta llegar al medio, que parece ser 11.

Un péndulo en realidad va reduciendo su movimiento, esto sería al revés, me equivoqué. Si un péndulo estuviese en un eje de X verías como llega a cierto extremo y luego va a otro. Eso es un péndulo... En mi caso es como si alguien estuviese haciendo fuerza, como en una hamaca.


C = 1
posicion = 1
WHILE C != 0:
C*=-1
posicion = posicion + C
A ver.

1era pasada:
C = -1
posicion = 1+-1 = 0

2nda pasada:
C = 1
posicion = 0+1 = 1

3era pasada:
C = -1
posicion = 1+-1 = 0

4ta pasada:
C = 1
posicion = 0+1 = 1

Nope, creo que lo tuyo no funciona como pedí.

Serapis

#3
No queda claro, con exactitud como ha de funcionar tu péndulo...

Típicamente un péndulo va perdiendo valores hasta llegar al equilibrio (0), y luego:
A - Puede tomar valores negativos
B - Puede volver a subir valores (siempre son positivos).
C - Usa valores extremos de modo alternativo.

Por su parte los valores pueden seguir una serie aritmética o geométrica. Lo ideal es que emule la gravedad, por lo que los valores serían los proporcionados por una serie geométrica.

B: En el pseudocodigo se emula el caso B, con series ariméticas de razón 1.
Pendulará de un lado al otro, hasta que alcance finalmente el valor 0.

Funcion PendularB(entero Max)
   entero value
   entero razon = 1
   
   Hacer Mientras (Max <> 0)
       value = Max
       Hacer
           value = (value - razon)
           // cualquier acción posterior
       Repetir Mientras  (value > 0)

       Hacer
           value = (value + razon)
           // cualquier acción posterior
       Repetir mientra  (value < Max)
       
       Max = (Max - razon)
   Repetir
Fin funcion

Es como si hiciera solo la mitad.

A: Como el anterior, pero con el caso A...
Es casi idéntico al anterior solo cambia el límite del primer bucle interno.

Funcion PendularA(entero Max)
   entero value
   entero razon = 1
   
   Hacer Mientras (Max <> 0)
       value = Max
       Hacer
           value = (value - razon)
           // cualquier acción posterior
       Repetir Mientras  (value > -Max)

       Hacer
           value = (value + razon)
           // cualquier acción posterior
       Repetir mientras  (value < Max)
       
       Max = (Max - razon)
   Repetir
Fin funcion

Este otro sería completo recorriendo mabas mitades...

C: La serie cuando alterna entre límites (hacia abajo):

Funcion PendularC(entero Max)
    entero razon = 1

    Hacer Mientras  (Max > razon)
       // cualquier acción posterior
       Max = -(Max - razon)
       // cualquier acción posterior
       Max = -(Max + razon)
   Repetir
Fin funcion



Salida de B:
5  4  3  2  1  0  1  2  3  4  5
4  3  2  1  0  1  2  3  4
3  2  1  0  1  2  3
2  1  0  1  2
1  0  1

Salida de A:
5  4  3  2  1  0 -1 -2 -3 -4 -5 -4 -3 -2 -1  0  1  2  3  4  5
4  3  2  1  0 -1 -2 -3 -4 -3 -2 -1  0  1  2  3  4
3  2  1  0 -1 -2 -3 -2 -1  0  1  2  3
2  1  0 -1 -2 -1  0  1  2
1  0 -1  0  1

Salida de C:
12 -11  10 -9  8 -7  6 -5  4 -3  2 -1

Tachikomaia

Cita de: NEBIRE en 13 Abril 2020, 02:57 AMNo queda claro, con exactitud como ha de funcionar tu péndulo...
Está quieto pero alguien lo agarró, llevó el peso, el coso colgante, al extremo, y entonces ahora se va frenando de a poco. Empezó en el punto 20 y llega al -20, luego al 19...
Algo así. Que pierda velocidad sólo de un lado es una asunción, propuesta, imaginación.

CitarTípicamente un péndulo va perdiendo valores hasta llegar al equilibrio (0)
¡Ajá!

CitarA - Puede tomar valores negativos
B - Puede volver a subir valores (siempre son positivos).
C - Usa valores extremos de modo alternativo.
No tengo mucha idea, este simplemente frena. Como una hamaca, la empujas y luego de a poco frena.

CitarPor su parte los valores pueden seguir una serie aritmética o geométrica. Lo ideal es que emule la gravedad, por lo que los valores serían los proporcionados por una serie geométrica.
No sé bien de qué hablas... No creo que esto requiera realismo, sólo que un valor vaya de extremo a extremo pero cada vez que vaya a volver a uno se quede un poco atrás.

CitarB: En el pseudocodigo se emula el caso B, con series ariméticas de razón 1.
Pendulará de un lado al otro, hasta que alcance finalmente el valor 0.
Lo 1ero no sé pero sí quedará en 0.
Los casos de negativo son más fáciles, pero necesito evitarlos por ahora. Por eso el valor "parado" acá es 11.

La salida debe ser 20, 1, 19, 2...
X, Y, X-1, Y+1, X-2, Y+2...

Serapis

#5
Cita de: Tachikomaia en 13 Abril 2020, 07:37 AM
Los casos de negativo son más fáciles, pero necesito evitarlos por ahora. Por eso el valor "parado" acá es 11.
Un valor negativo deja de serlo cuando se le suma un valor igual. Si a toda la serie se le suma el mínimo alcanzable, el resultado es equivalente... es como mover un grafico en la pantalla verticalmente, la forma dle gráfico, no cambia solo su posición en él.

El puntó máximo o mínimo eso es cosa del valor que se le pase a la función. Si le pasas 5, 5 será el máximo, si le pasas 387 ese será el máximo, si necesitas 11, pués pasa ese valor. esto no debería ser preciso de explicar ni siquiera objeto de discusión.

Cita de: Tachikomaia en 13 Abril 2020, 07:37 AM
La salida debe ser 20, 1, 19, 2...
X, Y, X-1, Y+1, X-2, Y+2...
Entonces es la serie del ejemplo 3... aplicando lo antedicho en el párrafo previo sobre los negativos:
Te ponía esta salida, para C:
12 -11  10 -9  8 -7  6 -5  4 -3  2 -1

Como no se quieren valores negativos, y el maximo es 12, el mínimo será a lo sumo -11, luego basta sumar a todos +11, por comodidad puede dar igual sumar +12
12+12; -11+12;  10+12; -9+12; 8+12... etc... -1+12
resultando:
24 1 22 3 20 ... 11
como se puede ver, no es exactamente el resultado esperado, salta de 2 en 2 en vez de 1 en 1,

// basta tocar un poco la función y cambiar solo la línea:
Max = -(Max + razon)
// por esta otra, para que en cada ciclo solo descuente 1
Max = -(Max + 0)

Y la salida será (cambiando a 10 como el valor máximo):
1: 10 -9  9 -8  8 -7  7 -6  6 -5  5 -4  4 -3  3 -2  2 -1
Eliminando números negativos:
2: 20  1  19  2  18  3  17  4  16  5  15  6  14  7  13  8  12  9
Con una ligera modificación para que ascienda nuevamente hasta el tope:
3: 20  1  19  2  18  3  17  4  16  5  15  6  14  7  13  8  12  9  11  10  10  11  9  12  8  13  7  14  6  15  5  16  4  17  3  18  2  19

El pseudocodigo sería (compara los cambios con el previo):

Funcion Pendular3(entero Max, buleano NoNegativos)
   entero razon, pos, value
   
   si NoNegativos = True
       pos = Max
   fin si

   value = (Max + pos)
   razon = 1
   Hacer mientras (value > razon)  // caso 3, ó (Max > razon) para un rango más corto (caso 2).
       imprimir value             // cualquier acción posterior
       Max = -(Max - razon)
       value = (Max + pos)
       imprimir value             // cualquier acción posterior
       Max = -(Max + 0)        // + razon)
       value = (Max + pos)
   repetir
fin funcion

el resultado de este código es, el último dado:
20  1  19  2  18  3  17  4  16  5  15  6  14  7  13  8  12  9  11  10  10  11  9  12  8  13  7  14  6  15  5  16  4  17  3  18  2  19


Cita de: Tachikomaia en 13 Abril 2020, 07:37 AM
Está quieto pero alguien lo agarró, llevó el peso, el coso colgante, al extremo, y entonces ahora se va frenando de a poco. Empezó en el punto 20 y llega al -20, luego al 19...
Algo así. Que pierda velocidad sólo de un lado es una asunción, propuesta, imaginación.
No tengo mucha idea, este simplemente frena. Como una hamaca, la empujas y luego de a poco frena.
No sé bien de qué hablas... No creo que esto requiera realismo, sólo que un valor vaya de extremo a extremo pero cada vez que vaya a volver a uno se quede un poco atrás.
Una serie aritmética o progresión aritmética, es basicamente una línea recta, imagina puntos, se salta de un punto a otro siempre a íntérvalos iguales, llamados razón.
La progresión aritmética es una suma:
Dados un término inicial y final, y pedidos 'x' puntos intermedios entre ellos, se define la razón como:
razon = (maximo - minimo) /(x+1)
ejemplo, sea el máximo 30, el mínimo 10 y los puntos intermedios 3:
razon = (30-10)/ (3+1) = 20/4 = 5.
siendo el valor inicial 10, los siguientes 3 intermedios serán:  15, 20, y 25 y el final es 30.
La serie aritmética es tremendamente fácil, tanto que no es preciso hacer cuentas, se hace de cabez salvo que se trate de numeros grandes con decimales etc..., o se trate de hallár el enésimo miembro de la serie...
así: 2,4,6, 8, 10, 12... la razón es 2.
0.3, 0.7, 1.1, 1.5 ... la razón es 0.4
23,30,37,44,51... la razón es 7

La series geométricas tienen exactamente las mismas fórmulas que la sritmética, con uns simple salvedad (remplazo)... donde las fórmulas de las series aritméticas son sumas, en la geométrica son multiplicaciones, donde restas, divisiones, donde multiplica, potencia, donde divide, raíz. Y entonces todo lo dicho para una vale para la otra.
Por eso, es bueno empezar primero dominando las series aritméticas que son muy asequibles... y luego con esa pequeña aclaración es tremendamente fácil asumir las progresiones geométricas.
Las series geométricas, dibujan curvas... en tu caso que es pendular implica que un lado es casi o cuasi espejo un lado respecto del otro.
sea el valor inicial 10 y el final 90 y se quiera 6 medios interpolados... (6 puntos entre medias) la razón vendrá dada por la fórmula:
razon = raiz (x+1) de (max/min)= sq7(90/10) = 1.3687
valores de la serie:  el valor inicial: 10 los 6 interpolados entre dicha distancia:  13.68738  18.73444  25.64254  35.09792  48.03986  65.75398 y el máximo:  89.99998
es decir 10 se multiplica por la razon 10 * 1.3687 = 13.68...
el siguiente término se consige multiplicando el obtenido por la razón y así sucesivamente... es un bucle con el número de términos a iterar que se precisan....

Tomando un ejemplo más pequeño: minimo 1, máximo = 20, con 15 puntos entre medias:
Valores de la serie:  1  1.205909  1.454215  1.753651  2.114743  2.550186  3.075291  3.70852  4.472136  5.392987  6.503449  7.842565  9.457416  11.40478  13.75312  16.585  20

Si uno se dedica a programar, no le bastan las 4|6 operaciones fundamentales de las matemáticas, debe dominar al menos las series, logarítmos y algunas cosas mas... es como si un taxista no supiera para que sirve el cambio de marchas.

Adjunto un par de imágenes para que se vea la diferencia entre ambas series:

Serie aritmética:


Serie geométrica, mismos valores usados en la serie aritmética:

Nota que la gráfica se crea tomando los valores dados como puntos para un eje, el otro eje asume los valores del orden que ocupa cada término, 0,1,2,3,4...
Juega con los signos para orientar a derecha/izquierda, arriba/abajo el resultado del gráfico.

Terminar de ajustar el código a los valores precisos que tu necesitas es algo que te corresponde a ti. Haz las modificaciones oportunas una vez lo entiendas.

Tachikomaia

Cita de: NEBIRE en 13 Abril 2020, 19:05 PM
Un valor negativo deja de serlo cuando se le suma un valor igual. Si a toda la serie se le suma el mínimo alcanzable, el resultado es equivalente... es como mover un grafico en la pantalla verticalmente, la forma dle gráfico, no cambia solo su posición en él.
Vale, comprendido. Luego sigo, es que tu post es como haber dado una ciudad a quien pedía una simple casa, me cuesta entender o procesar.

Lo bueno también es que me hiciste reir. Lamentablemente estoy rodeado de perros rabiosos y medio contagiado de eso.

Tachikomaia

Ahora estoy metido con tablas así que quizá esté peor para entender. Pero las tablas tienen mucho que ver con esto. Se trata de distintas formas de variar un candidato o más de uno.
Lo más normal es
1, 2, 3... infinito.

Más avanzado es cuando se le pone un límite, simplemente porque es más código.

Más avanzado es cuando los 2 extremos aparecen 1ero y se va aproximando al centro. Es lo que pedí en este tema.
Ej: 1, 20, 2, 19.

Más avanzado sería cuando hace 4 cosas "por turno", que son:
1- Elegir el extremo mayor nunca usado.
2- Elegir el extremo menor nunca usado.
X- Elegir el centro (esto sólo se aplica una vez si hay centro).
3- Elegir el valor mayor nunca usado más cercano al centro.
4- Elegir el valor menor nunca usado más cercano al centro.
Ej: 1, 20, 11, 12, 10,
2, 19, 13, 9,
etc

También tengo que pensarlo si son 2 candidatos o más.

[quote author=NEBIRE link=topic=503936.msg2219197#msg2219197 date=1586739457]Típicamente un péndulo va perdiendo valores hasta llegar al equilibrio (0), y luego:
Tipicamente, luego se queda en 0 xD

CitarA - Puede tomar valores negativos
B - Puede volver a subir valores (siempre son positivos).
C - Usa valores extremos de modo alternativo.
C no es una 3era opción sino combinable con A o B.

CitarPor su parte los valores pueden seguir una serie aritmética o geométrica. Lo ideal es que emule la gravedad, por lo que los valores serían los proporcionados por una serie geométrica.
No sé, esto es más bien imaginario.

B: En el pseudocodigo se emula el caso B, con series ariméticas de razón 1.
Pendulará de un lado al otro, hasta que alcance finalmente el valor 0.

CitarSalida de B:
5  4  3  2  1  0  1  2  3  4  5
4  3  2  1  0  1  2  3  4
3  2  1  0  1  2  3
2  1  0  1  2
1  0  1
Esto espero que se haya entendido que no quiero. Porque los problemas asumo que se suelen solucionar mediante extremos o centros, y el método conque aparecen ahí no es acorde a lo que asumo.
Ni siquiera es un péndulo en el sentido de que esté señalando los valores extremos alcanzados. Más bien parece señalar todos los valores por los que pasa.

Soy horrible para entender codes, pero como dije es que ya estoy enfocado en otro problema.

CitarSalida de C:
12 -11  10 -9  8 -7  6 -5  4 -3  2 -1
Será que es parecido a un péndulo, nada más.
12, -12, 11, -11...

Cita de: NEBIRE en 13 Abril 2020, 19:05 PM
Un valor negativo deja de serlo cuando se le suma un valor igual. Si a toda la serie se le suma el mínimo alcanzable, el resultado es equivalente... es como mover un grafico en la pantalla verticalmente, la forma dle gráfico, no cambia solo su posición en él.
Estoy pensando en esto porque necesito que siempre sea positivo. Si antes puse ejemplos negativos es porque como dije son más fáciles de usar. Acá no sé si me estás planteando usar un "parche" o no. No quisiera un parche si es innecesario.

CitarComo no se quieren valores negativos, y el maximo es 12, el mínimo será a lo sumo -11, luego basta sumar a todos +11
Suena a parche pero también que diste en el clavo, lo pensaré.

como se puede ver, no es exactamente el resultado esperado, salta de 2 en 2 en vez de 1 en 1,

Citar// basta tocar un poco la función y cambiar solo la línea:
Max = -(Max + razon)
// por esta otra, para que en cada ciclo solo descuente 1
Max = -(Max + 0)
De todo lo leído, al menos entiendo que un +0 es innecesario xD

Lo demás otro día quizá, es too much for me.

Serapis

Cita de: Tachikomaia en 21 Abril 2020, 03:15 AM
12, -12, 11, -11...
Estoy pensando en esto porque necesito que siempre sea positivo. Si antes puse ejemplos negativos es porque como dije son más fáciles de usar. Acá no sé si me estás planteando usar un "parche" o no. No quisiera un parche si es innecesario.
Suena a parche pero también que diste en el clavo, lo pensaré.
Qué parche ni qué niño muerto...

Simplemente es una demostración explícita de que una serie como:  -3, -2, -1 es equivalente a cualquier otro trío de valores seguidos, en el rango que se precise, con solo sumar el valor adecuado para meterlo dentro del rango deseado...
Si tu precisas que sean valores 86, 87 y 88, pués trasladar los valores de -3, -2, -1 es sumar 89. Eso se hace en la propia fórmula/función que obtiene los valores, como una variable más, de hecho la mayor parte de las veces, típicamente se puede integrar en alguna constante, que sí o sí YA SE UTILIZA en la propia función, luego ni parche, ni sobrecarga...

Cita de: Tachikomaia en 21 Abril 2020, 03:15 AM
De todo lo leído, al menos entiendo que un +0 es innecesario xD
A la hora de explicar, conviene poner las obivedades, porque si uno pone la solución óptima no hay forma de qué mucha gente entienda de donde rayos sale tal o cual cosa... ese 0 representa una variable, o una constante, se deja en el código SIEMPRE, para que con el tiempo si se ha de modificar por mantenimiento se vea...
TAMPOCO supone ninguna sobrecarga inútil, un compilador cuando se encuentra constantes cuyo valor es 0, lo elimina y si se encuentra una expresión con más de 1 constantes afectadas por la misma prioridad, las reúne y simplifica, así esto:
x = 6 + b + 23 + 7 - c - 3
entonces el compilador lo resumirá como:
x = 33 + b - c
Un intérprete, en cambio lo tiene que resolver sobre la marcha, peor en tal caso no tiene sentido quejarse de que no se amás óptimo sumar 4 constantes cuando un intérprete es como mínimo entre 20 y 100 veces más lento que el mismo código compilado. Es decir es ridículo quejarse por instrucciones que consumen 1 ciclo de reloj, cuando el propio sistema utilizado es 40 veces más elnto que compilado.

Por lo demás como nunca planteas problemas específicos y siempre sueles dar vaguedades mal concretadas y definidas resulta a menudo confuso tratar de entender que es exactamente lo que precisas y todavía más complicado tratar de que lo entiendas, porque careces de conceptos básicos, elementales, necesarios para adentrarse en la programación.
..y como ya te he aconsejado en más de una ocasión que te olvides de ActionScript en favor de casi cualquier otro lenguaje de programación (mejor que eso) y que aprendas como mínimo principios básicos de programación, pués no me repetiré para insistirte en lo mismo, eso es ya cosa tuya.