elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] Problema matemático (vigésimo quinta edición xD)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Problema matemático (vigésimo quinta edición xD)  (Leído 4,079 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
[SOLUCIONADO] Problema matemático (vigésimo quinta edición xD)
« en: 14 Marzo 2013, 22:28 pm »

Espero que alguien me pueda ayudar con esto...


Tengo un Timer donde debo realizar una operación.

Estos son los elementos:

Código
  1.    Dim Time_Measure As String = "M"
  2.    Dim Time_Out As Integer = 1
  3.    Dim Current_Volume As Single = 1
  4.    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
  1.    Dim Time_Measure As String = "M"
  2.    Dim Time_Out As Integer = 1
  3.    Dim Current_Volume As Single = 1.0
  4.    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
  1. 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
  1. * MS / targetvolume * currentvolume
  2. 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 Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Problema matemático (vigésimo quinta edición xD)
« Respuesta #1 en: 15 Marzo 2013, 01:21 am »

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
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema matemático (vigésimo quinta edición xD)
« Respuesta #2 en: 15 Marzo 2013, 08:24 am »

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.

Citar
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é.

Código
  1. Public Class Form1
  2.  
  3.    Dim Desde As Integer = 0 ' X
  4.    Dim Hasta As Integer = 100 ' Y
  5.    Dim Periodo As Integer = 100 ' W
  6.    Dim MS As Long = 60000 ' Z
  7.    Dim Diferencia As Integer = (Desde - Hasta)
  8.  
  9.    Private Sub Test(sender As Object, e As EventArgs) Handles MyBase.Load
  10.        'Dim intervalo = MS / Periodo
  11.        Dim intervalo = Periodo + Diferencia / (MS / Periodo)
  12.        MsgBox(intervalo)
  13.        Timer1.Interval = intervalo
  14.    End Sub
  15.  
  16. End Class


Citar
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
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema matemático (vigésimo quinta edición xD)
« Respuesta #3 en: 15 Marzo 2013, 18:27 pm »

¿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 Desconectado

Mensajes: 1.842



Ver Perfil
Re: Problema matemático (vigésimo quinta edición xD)
« Respuesta #4 en: 15 Marzo 2013, 23:23 pm »

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
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema matemático (vigésimo quinta edición xD)
« Respuesta #5 en: 16 Marzo 2013, 15:11 pm »

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:

Código
  1.    If Fade_IN Then
  2.            Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / (CInt(Target_Volume * 100) - CInt(Audio_Device.AudioEndpointVolume.MasterVolumeLevelScalar * 100))
  3.        Else
  4.            Timer.Interval = Convert_Time(Time_Out, Time_Measure, MS) / (CInt(Audio_Device.AudioEndpointVolume.MasterVolumeLevelScalar * 100) - CInt(Target_Volume * 100))
  5.        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 Desconectado

Mensajes: 1.842



Ver Perfil
Re: [SOLUCIONADO] Problema matemático (vigésimo quinta edición xD)
« Respuesta #6 en: 16 Marzo 2013, 15:58 pm »

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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines