[SOLUCIONADO] Problema matemático (vigésimo quinta edición xD)

Iniciado por Eleкtro, 14 Marzo 2013, 22:28 PM

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

Eleкtro

Espero que alguien me pueda ayudar con esto...


Tengo un Timer donde debo realizar una operación.

Estos son los elementos:

Código (vbnet) [Seleccionar]
   Dim Time_Measure As String = "M"
   Dim Time_Out As Integer = 1
   Dim Current_Volume As Single = 1
   Dim Target_Volume As Single = 0.80


"Time_Measure" es un string y se refiere a segundos, minutos u horas. (S,M,H)
"Time_Out" es la cantidad "X" de "Time_Measure" (Ejemplo: 30 segundos, 1 minuto, o 5 horas)
"Current_Volume" es un valor single indefinido de 0 a 1
"Target_Volume" es otro valor single de 0 a 1

Lo que necesito hacer es calcular la relación de tiempo EN MILISEGUNDOS para disminuir un valor de "0.01" progresívamente desde al valor de "Current_Volume" hasta alcanzar el valor de "Target_Volume"

Por poner un ejemplo, si tengo estos valores:

Código (vbnet) [Seleccionar]
   Dim Time_Measure As String = "M"
   Dim Time_Out As Integer = 1
   Dim Current_Volume As Single = 1.0
   Dim Target_Volume As Single = 0.0


Traducido:
1 minuto
Current volume: 100
Target volume: 0

...Entonces deberé disminuir Cada 600 milisegundos un valor de 1 a "current volume" para alcanzar el valor de "target volume".

Para eso, con una función que hice, primero convierto los "segundos, minutos u horas" elegidas, a milisegundos, y lo divido por 100:
Código (vbnet) [Seleccionar]
Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / 100

Pero luego ya no sé como calcular el resto de la operación teniendo en cuenta el valor de "Current_Volume" y "target_Volume"... :
Mi intento:
Código (vbnet) [Seleccionar]

* MS / targetvolume * currentvolume
Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / (100 - Target_Volume) * (100 - CInt(Audio_Device.AudioEndpointVolume.MasterVolumeLevelScalar * 100))


Creo que consigo un valor aproximado en mis estimaciones, pero no el exacto, me falta colocar bien algún factor que no sé...

¿Alguna ayuda porfavor?








Keyen Night

Y la pregunta general es entonces, ¿En cuanto tengo que aumentar X valor para que llegue a Y en Z tiempo durante W periodos?

Tienes que sumar en cada periodo W (el Interval del Timer), la diferencia entre X y Y dividido por el tiempo Z, todas estas variables se recomiendan Double o Long.

Por ejemplo:

De 0.0 (X) a 1.0 (Y), hay una diferencia de 1.0 si se quiere llegar en un tiempo de 1 segundo (Z) en 10 periodos de 100 milisegundos (W), entonces:

Colocando el Interval del Timer en W (100 milisegundos), hay que sumar 1.0 / (Z / W) en cada periodo.

Pero no estás recurriendo a las mejores practicas; define siempre el tiempo en milisegundos, no en minutos, ni en horas, eso es menos especifico y tiende a errores. Para dar formato u obtenerlo, si así lo deseas, usa TimeSpan.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Eleкtro

Gracias por contestar.

Cita de: Keyen Night en 15 Marzo 2013, 01:21 AMla pregunta general es entonces, ¿En cuanto tengo que aumentar X valor para que llegue a Y en Z tiempo durante W periodos?

Que bien explicada, eso es lo que quiero, aunque el periodo es indefinido, creo que es lo que intento calcular también.

CitarTienes que sumar en cada periodo W (el Interval del Timer), la diferencia entre X y Y dividido por el tiempo Z, todas estas variables se recomiendan Double o Long.
De 0.0 (X) a 1.0 (Y), hay una diferencia de 1.0 si se quiere llegar en un tiempo de 1 segundo (Z) en 10 periodos de 100 milisegundos (W), entonces:

Colocando el Interval del Timer en W (100 milisegundos), hay que sumar 1.0 / (Z / W) en cada periodo.

He intentado seguir los pasos que me indicas pero me he perdido, consigo un resultado que no es :

PD: en este ejemplo defino el periodo pero también lo intento calcular, un periodo relativo para disminuir/aumentar un valor de "1" progresívamente, o quizás me estoy liando yo solo, no sé.

Código (vbnet) [Seleccionar]
Public Class Form1

    Dim Desde As Integer = 0 ' X
    Dim Hasta As Integer = 100 ' Y
    Dim Periodo As Integer = 100 ' W
    Dim MS As Long = 60000 ' Z
    Dim Diferencia As Integer = (Desde - Hasta)

    Private Sub Test(sender As Object, e As EventArgs) Handles MyBase.Load
        'Dim intervalo = MS / Periodo
        Dim intervalo = Periodo + Diferencia / (MS / Periodo)
        MsgBox(intervalo)
        Timer1.Interval = intervalo
    End Sub

End Class



CitarPero no estás recurriendo a las mejores practicas; define siempre el tiempo en milisegundos, no en minutos, ni en horas, eso es menos especifico y tiende a errores. Para dar formato u obtenerlo, si así lo deseas, usa TimeSpan.

lo hago así, uso timespan (ticksper "X"...)para convertir el tiempo en MS, el valor de segundos/minutos/horas es un entero, no tengo error alguno al hacer esa conversión a MS.








Eleкtro

#3
¿Nada?, ¿Alguien me puede ayudar a resolver del todo esa operación?

Es para poder terminar esta aplicación, la cual pienso compartir, y sólo me falta eso...

Aquí podeis entender mejor los factores de la operación que necesito realizar:



Uso las variables que he comentado en los posts de arriba, y el problema es que siempre se pasa (o no llega) al tiempo escojido, porque calculo mal la operación...

Agradecería mucho una ayuda más para esto.
Saludos...








$Edu$

Si intentas explicarlo de nuevo, con un ejemplo claro, intento ayudarte si quieres, pero en el primer post no hablabas de periodo y ahora si. No se para que necesitas el periodo, solo necesitas el valor de Interval para el Timer.

Olvidando los milisegundos, etc, que son cosas que veras luego tu, el problema es este:

Tenemos un valor X que queremos que llegue al valor Y en Z tiempo.

por ejemplo:

x = 50
y = 20
z = 100 seg

Hacemos la diferencia de x e y = 50 - 20 = 30.
Ahora hacemos z/30 = 100/30 = 3,33333...
El intervalo del Timer sera 3,33333.... seg = 3333,33.. milisegundos

Asi que cada 3333,33.... milisegundos, a 50 se le restara 1 hasta llegar a 20, por lo tanto este Timer se ejecutara 30 veces cada 3333,33... milisegundos.

Puse ese ejemplo para que veas que podras tener problemas con numeros periodicos y muchas cosas mas (na mentira, salio sin darme cuenta xD) pero tendrias que usar otro tipo de variable que no sea integer por eso mismo, aunque no se que valores usaras.
Tal vez no es esto lo que pides, debo haber entendido mal, pero como dije antes, si dejas una buena explicacion te ayudo.

Eleкtro

#5
Me salvaste $Edu$ :)

La verdad es que yo ya estaba empezando a no entender ni mi própio problema ni lo que debía obtener xD, pero lo entendiste bien, era eso lo que necesitaba...

Cita de: $Edu$ en 15 Marzo 2013, 23:23 PMAsi que cada 3333,33.... milisegundos, a 50 se le restara 1 hasta llegar a 20, por lo tanto este Timer se ejecutara 30 veces cada 3333,33... milisegundos.

Lo que pasa es que dependiendo de si quiero disminuir o aumentar el valor, deberé intercambiar "X" por "Y" en la resta, aquí:
Cita de: $Edu$ en 15 Marzo 2013, 23:23 PMHacemos la diferencia de x e y = 50 - 20 = 30.

¿Estoy en lo cierto?, supongo que sí, porque he hecho las mediciones de lo que tarda el proceso, y parece que funciona corréctamente:

Código (vbnet) [Seleccionar]
   If Fade_IN Then
           Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / (CInt(Target_Volume * 100) - CInt(Audio_Device.AudioEndpointVolume.MasterVolumeLevelScalar * 100))
       Else
           Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / (CInt(Audio_Device.AudioEndpointVolume.MasterVolumeLevelScalar * 100) - CInt(Target_Volume * 100))
       End If


Bueno, gracias de nuevo,
un saludo!








$Edu$

No se bien que hacen tus funciones, que valores tendran las variables, etc, pero si algunos valores tendran decimales o peor aun, numeros periodicos (vaya uno a saber que elige el usuario) tendras que corregir esos posibles bugs, pero vamos, no entiendo bien que es lo que hara tu programa, pero tal vez no te importe tanta precision y te da lo mismo que no se demore 100 segundos por ejemplo, sino 99,9999 xD

Eso lo veras tu :P saludos!