Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





AYUDA!!! Visual Basic 6.0

Iniciado por DiRtY_DuCk, 28 de Febrero de 2003, 08:52:12 PM

« anterior - próximo »

DiRtY_DuCk

                                Wenas!!!

Tengo que hacer un simulador de gravedad, ha sido mi propuesta para el "proyectillo" de final de trimestre del instituto, 2º de Bachillerato, actualmente tengo esto:

Dim abajo As Boolean



Private Sub cmd1_Click()

   shp1.Top = 0

   tmr1.Enabled = True

   txtVx.Enabled = False

   txtVy.Enabled = False

   abajo = True

End Sub



Private Sub Form_Load()

   abajo = True

   tmr1.Enabled = False

End Sub



Private Sub tmr1_Timer()

   If abajo Then

       If shp1.Top < 176 Then

           shp1.Top = shp1.Top + 10

           

       Else

           abajo = False

       End If

   Else

       If shp1.Top > 0 Then

           shp1.Top = shp1.Top - 10

       Else

           abajo = True

       End If

   End If

End Sub


De momento lo que he conseguido, es que la pelota se desplace en el eje de ordenadas X, hacia abajo sumando 10 a su posicion actual, y al llegar al final de la PictureBox que haga lo contrario, o sea, que suba, restandole 10 a la posicion actual... llevo toda la tarde intentando encontrar como "meter" la gravedad, o sea, que el producto no sea constante, sino, que cuando la pelota vaya en direccion hacia abajo su velocidad sea producto de la gravedad, y cuando rebote, viceversa, asi hasta parar.... la verdad es k no soy novato, soy MUY NOVATO jajaja..y intentando encontrar tutoriales por la red, sobre funcoines gráficas de VB en inet, no he encontrado lo k buscaba... :(

P.D: sabiendo que:

                             · la posicion que "tendria" que tomar la pelota, varia en función de esta fórmula física: X = Xinicial + Vinicial * t + 1/2 * g * t^2, donde t = tiempo y g = gravedad...como poder implementarla al ¿"logaritmo"??


H3LP!!!!

Asias!                                

HgH

                                Si mi memoria no me falla (lo cual es más que posible), esa fórmula es para movimientos rectilineos uniformemente acelerados (creo). En este caso no creo que te vaya a servir. (Por favor, si alguien cree que si, que me contradiga sin cortarse ni un pelo, que hace mucho tiempo que no me miro nada de física ;-) )

Consideraciones físicas aparte y dejando de lado las fórmulas matemáticas, básicamente lo que tienes que hacer es, a la velocidad, sumarle a cada frame, un valor constante (de aceleración).
Sería algo como (en pseudocódigo)



Posicion_Y = 0;

Posicion_X = Aquí la que tu quieras

Velocidad = 0;

Constante_Gravedad = x; (Donde x es el valor que tu quieras para la gravedad)



mientras no (condicion de fin)

Velocidad = Velocidad + Constante_Gravedad;

Posicion_Y = Posicion_Y + Velocidad;

si (Posicion_Y>Alto_Maximo)

 Posicion_Y = Alto_Maximo;

 Velocidad = -Velocidad/Constante_de_desgaste (La pelota está rebotando en el "suelo" y puede tener rozamiento, rigidez, blah,blah,blah)

fin si

Dibujar_Pelotita(Posicion_X,Posicion_Y)

Comprobar_condicion_fin

fin mientras  



Esto te simularía de una forma bastante simplona la gravedad. Ten en cuenta que no contempla un rebote contra un límite superior.

En fin, espero que esta chapuza te aclare un poco...

Saludos

PD: ehhh, perdona que te corrija, pero no es "logaritmo", es algoritmo ;-)                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

Mars Attacks

                                Otra más sencilla: dale a la altura el valor absoluto de la función senoidal de una variable que vaya desde 0 hasta 2*pi. Si quieres que además se frene, puesssss multiplica después de cada "rebote" el valor resultante del seno por alguna variable de fricción o lo que quieras (tomará valores entre 1 y 0: 1 saltará en toda su extensión, 0 no saltará).



v=1.0;

mientras v>0.0

 para x=0 hasta 360

   altura=abs(sen(rad(x))*v;

   dibuja_tu_monigote;

 finpara

 v=v-0.05 (ó v=v/2.0, etc);

finmientras;

                               

DiRtY_DuCk

                                Gracias chicos!, me han servido de mucho vuestras ayudas....y he podido conseguir el efecto gravedad mientras la pelota (shp1) va en direccion "al suelo", la pelota acelera cada vez que aumenta su posición :):):), ahora me queda conseguir ese mismo efecto al revés...es decir, que cuando suba, le reste la gravedad, y me estoy peleando con VB porque no m sale!, se keda parada!  :enfadado:  :enfadado: , pero weno, con paciencia saldrá  :D  :P , esta es la variación de código que he hecho:

Dim t As Double

Dim abajo As Boolean



Private Sub cmd1_Click()

   shp1.Top = 0

   tmr1.Enabled = True

   txtVx.Enabled = False

   txtVy.Enabled = False

   abajo = True

   t = 0

End Sub



Private Sub Form_Load()

   abajo = True

   tmr1.Enabled = False

End Sub



Private Sub tmr1_Timer()



t = t + 0.1

Dim g As Double

g = 9.81



   If abajo Then

       If shp1.Top < 176 Then

           shp1.Top = 1 / 2 * g * (t ^ 2)

       Else

           abajo = False

       End If

   Else

       If shp1.Top > 0 Then

           shp1.Top = shp1.Top - 3

       Else

           abajo = True

       End If

   End If

End Sub





En fín, si alguien tiene alguna sugerencia, bienvenida sea :)

Salu2!!!!

P.D: HgH.....en qué estaria pensando....JAJAJAAJ, tantas matemáticas me van a matar, decir logaritmo en vez de algoritmo....JJAJAJAAJ, madre mia, a la hogueeeeeeeera (yo eh? ) xD                                

Mars Attacks

                                ¿Podrías explicar un poco el código? No entiendo exactamente qué entiendes tú que tiene que hacer si es menor que 176 (¿por qué 176?¿qué es 176?) o si es mayor que 0.                                

DiRtY_DuCk

                                jejeje, cierto, es k soy un novatillo en esto, y tendria que haber puesto comentarios, jejeje, ahora os paso el código con comentarios :):


Dim t As Double

Dim abajo As Boolean ' variable que calcula cuando la pelota tiene que ir hacia arriba y cuando hacia abajo.



Private Sub cmd1_Click()

   shp1.Top = 0 'posición inicial de la pelota, en Visual Basic, arriba del todo es 0, conforme baja, aumenta.

   tmr1.Enabled = True 'esto activa el reloj cuando hago click en el botón.

   txtVx.Enabled = False 'desactica la caja de text, que de momento no tiene funcion alguna.

   txtVy.Enabled = False ' "

   abajo = True 'activa la variable al clickar el botón

   t = 0 'valor inicial del "tiempo"

End Sub



Private Sub Form_Load()

   abajo = True

   tmr1.Enabled = False 'al cargar el formulario, el tiempo está inactivo.

End Sub



Private Sub tmr1_Timer()



t = t + 0.3 'lo que hace, es k siempre suma 0.3 al "tiempo".

Dim g As Double

g = 9.81





   If abajo Then

       If shp1.Top < 176 Then 'Si la pelota está en una posición menor que 176 (el limite de la pictureBox, donde quiero que rebote) va hacia abajo, aumentando con la gravedad.

           shp1.Top = 1 / 2 * g * (t ^ 2) 'algoritmo que hace acelerar la pelota.

       Else

           abajo = False 'si es mayor que 176 desactiva abajo y la dirección de la pelota.

       End If

   Else

       If shp1.Top > 0 Then

           shp1.Top = shp1.Top + 3 'todavía no tengo el agoritmo que me de el inverso :S

       Else

           abajo = True 'si la posición vuelve a ser menor que 176, vuelve a activar abajo, y la pelota sube.

       End If

   End If

   

End Sub





Espero que lo entendáis :)

Gracias!                                

Mars Attacks

                                A ver, creo que te has dejado justo la variable que te resolvería esos problemas, que es la variable de la velocidad.
Al principio, v=0. La posición es
shp1.Top = shp1.Top+v*t + 1 / 2 * g * (t ^ 2)

después calculas la posición anterior y la actual, la divides entre el tiempo y obtienes la nueva velocidad para la siguiente iteración.

Cuando llega a 176, lo único que tienes que hacer es que esa velocidad que lleva sea "al revés", es decir, en lugar de v*t será -(v*t) y, como la aceleración hará que decrezca esa velocidad, también llevará sentido negativo

shp1.Top = shp1.Top -(v*t) - 1 / 2 * g * (t ^ 2)

Todo esto hasta que v=0, momento en el que volverá a empezar. Si quieres que cada vez rebote menos, pues multiplicas esa v por una constante de rebote (entre 1 y 0) sólo cuando haya rebotado en el suelo (no mientras suba o bajo):

shp1.Top = shp1.Top -(v*t)*cterebote - 1 / 2 * g * (t ^ 2)

No sé si te habré liado un poco. Yo sí me he liado a mí mismo, así que no sé hasta qué punto te he puesto cosas que no funcionarán. Prueba a ver :)                                

AgeR

                                No sé si te funcionará, mi cerebro no está muy esplendido hoy, pero igual lo solucionas más fácilmente con esto (no tengo ni idea de VB) :


If abajo Then

       If shp1.Top < 176 Then

           shp1.Top = 1 / 2 * g * (t ^ 2)

       Else

           abajo = False

           t = 0

       End If

   Else

       If shp1.Top > 0 Then

           shp1.Top = 176 - (1/2 * g * (t^2) )

       Else

           abajo = True

           t = 0

       End If

   End If



Ya te digo que no sé si funcionará, te lo digo así a ojo.
Suerte!                                

DiRtY_DuCk

                                [ Contestando a AgeR ]

Probando eso que me dices, lo que consigo es el mismo esfecto de gravedad pero inversado, es decir, cuando la pelota llega al "suelo", vuelve a tener velocidad cero, y al ir subiendo incrementa su velocidad... por lo tanto, no m sirve, pero MUCHAS GRACIAS  :D  :D

[ Contestando a Mars Attack ]

Todavía no he probado lo de la velocidad, aunque se me ocurrió a mi también, ahora mismo lo pruebo y te digo algo :D :D, por cierto, no entiendo lo que es constante de rebote, ni porque es 1 o 0 ¿?, a ver si m lo puedes aclarar un poco :D

GRACIASSS                                

DiRtY_DuCk

                                Gracias Mars Attack, creando una variable V, y dandole el valor (sabiendo que x = shp1.top), v= x -(x-1)/t - (t-1), y aplicandola a la formula del movimiento acelerado consigo crear el rebote de la pelota!!! :D, pero ahora solo me falta que pierda altura, pues siempre llega a la misma :S:S:S, si me explicases eso de la cte de rebote...te lo agradeceria mucho!!!

GRACIAS!                                

Mars Attacks

                                Perdona por el nombre, es lo primero que me ha venido a la cabeza. En realidad sería una constante de elasticidad, que haría que el rebote del cuerpo fuera más o menos fuerte. Es decir, un cuerpo al chocar contra otro, pierde una parte de su energía cinética (por la estructura molecular del material entre otras cosas). Si el cuerpo es, digamos, de goma blanda (como las pelotitas estas que rebotan endiabladamente) el choque es muy elástico: la constante debería valer casi 1 (luego te explico por qué entre 1 y 0). Si el cuerpo es deee plastilina, por ejemplo, el choque es muy inelástico (tiras la plastilina al suelo y verás como no rebota): la constante debería valer casi 0.
El valor entre 1 y 0 sirve para hacer que en el caso de que sea un choque elástico (cte=1) la velocidad con la que rebota permanezca prácticamente igual, y en caso de ser inelástico (cte=0) se "absorba" toda la velocidad (v*0=0). Un choque medianamente elástico, conservará la mitad de esa velocidad (v*0.5=v/2) y así sucesivamente. Puedes controlar esa constante hasta que te guste la forma de rebotar. Cada vez que choque, se "absorberá" parte de esa energía y cada vez rebotará menos (si pones un valor por encima de 1, cada vez rebotará más ;))                                

Mars Attacks

                                Lo único que tienes que hacer es: cuando la pelota llegue al suelo hacer v=v*cte_elastica; (ojo: SÓLO en el momento en el que rebota).

y continuar con lo mismo que hacías hasta entonces.                                

DiRtY_DuCk

                                Pos muchas graciassss, si consigo esto, casi casi ya tendre "emulada" la gravedad en la cordenada X (de momento), luego empezaré con angulos y cordenadas Y :D...

Gracias a todos!                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.