Autor
|
Tema: [SOLUCIONADO] Problema matemático (vigésimo quinta edición xD) (Leído 4,052 veces)
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.878
|
Espero que alguien me pueda ayudar con esto... Tengo un Timer donde debo realizar una operación. Estos son los elementos: 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: 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: 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: * 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?
|
|
« Última modificación: 16 Marzo 2013, 15:37 pm por EleKtro H@cker »
|
En línea
|
|
|
|
Keyen Night
Desconectado
Mensajes: 496
Nothing
|
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.
|
|
|
En línea
|
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
Ex-Staff
Conectado
Mensajes: 9.878
|
Gracias por contestar. la 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. 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. 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é. 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
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. 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.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.878
|
¿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...
|
|
« Última modificación: 15 Marzo 2013, 18:31 pm por EleKtro H@cker »
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
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.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.878
|
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... 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. Lo que pasa es que dependiendo de si quiero disminuir o aumentar el valor, deberé intercambiar "X" por "Y" en la resta, aquí: Hacemos 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: 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!
|
|
« Última modificación: 16 Marzo 2013, 15:36 pm por EleKtro H@cker »
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
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 saludos!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Microsoft celebra el vigésimo aniversario de Windows NT
Noticias
|
wolfbcn
|
0
|
1,147
|
28 Julio 2013, 01:46 am
por wolfbcn
|
|
|
Publicada la quinta píldora formativa del proyecto Thoth ¿Qué es la tríada CIA?
Noticias
|
wolfbcn
|
0
|
1,152
|
15 Julio 2014, 21:28 pm
por wolfbcn
|
|
|
Más de una quinta parte de la población española no ha usado jamás un ordenador
Noticias
|
wolfbcn
|
0
|
1,311
|
23 Julio 2014, 02:14 am
por wolfbcn
|
|
|
La tecnofobia será el detonante de la quinta oleada de terrorismo
Noticias
|
wolfbcn
|
4
|
1,696
|
18 Junio 2019, 01:58 am
por El_Andaluz
|
|
|
Así enviaron a morir al Ebro a los 27.000 de la Quinta del biberón
Foro Libre
|
Machacador
|
0
|
1,543
|
17 Febrero 2020, 11:09 am
por Machacador
|
|