Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problema de matemáticas / lógica

Iniciado por El preguntón, Julio 27, 2017, 07:23:22 PM

Tema anterior - Siguiente tema


Hola,
 


No sé ni por dónde empezar a programar esto, pero aquí va el planteamiento:
 


Tengo dos variables floats, las cuales vamos a llamar A y B. La variable A, va de 0 a 1; la variable B va de -180 a 180. Mediante unos controles, puedo hacer variar la primera variable A entre estos dos valores.
 


La duda es cómo hacer lo que voy a explicar a continuación: cuando A sea 0, B será -180; cuando A sea 1, B será 180. Así pues, ¿Cuál será el valor de B si por ejemplo A es igual a 0.15? ¿Qué operación matemática o función de las que tiene Mathf me podrían servir para hacer esto?
 


Gracias de antemano y un saludo.


mejor haces que a y b tengan valores entre 0f y 1f, luego calculas:


a1 = -180 + a * 360
 
b1 = -180 + (1f - a) * 360
 
 

Julio 27, 2017, 10:00:19 PM #2 Ultima modificación: Julio 27, 2017, 10:05:45 PM por Caesar
La palabra que buscar es "interpolar"
 
A            B
 
0         -180
 
x              y
 
1            180
 
 
 
[x-0]/[1-0] = [y - (-180)]/[180-(-180)]
 
x = (y +180)/360  : para hallar A
 
y = 360x -180      : para hallar B
 
Asi que cuando A vale 0.15; reemplazando B = 360*(0.15) - 180, B= -126

Julio 27, 2017, 10:40:47 PM #3 Ultima modificación: Julio 27, 2017, 10:43:47 PM por TheBullet
¿No os liáis un poco con las respuestas? Lo más fácil es utilizar Mathf.Lerp, que como dice @Caesar interpola entre dos números: https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html" ipsnoembed="true" rel="external nofollow">https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
 

B = Mathf.Lerp(-180.0f, 180.0f, A);

 
Saludos

Julio 27, 2017, 10:51:32 PM #4 Ultima modificación: Julio 27, 2017, 10:55:14 PM por lightbug
Ya que @TheBullet liquido en sencillez jaja solo agrego: para generalizar si tuvieras cualquier A podes plantear la ecuacion de un recta, en este caso:
 

 
Edito: cualquier A de 0 a x, si es negativo el Bmin de la ordenada estaria mal
 
 

Cita de: TheBullet date=1501188047¿No os liáis un poco con las respuestas? Lo más fácil es utilizar Mathf.Lerp, que como dice @Caesar interpola entre dos números: https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html" ipsnoembed="true" rel="external nofollow" target="_blank">https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
   
   

B = Mathf.Lerp(-180.0f, 180.0f, A);

   
      Saludos
   


no tan rapido, el tercer parametro tiene que ser un valor entre 0...1, y no lo es

Cita de: Braltor date=1501188730no tan rapido, el tercer parametro tiene que ser un valor entre 0...1, y no lo es
   


Si, vale de 0 a 1:
 
Cita de: El preguntón date=1501176202La variable A, va de 0 a 1;
   


 


Las matematicas no es el fuerte de la gente por lo visto xDDD
 
No se que funciones de la libreria Mathf permiten hacer lo que se quiere conseguir, tampoco tengo ahora en mente las funciones que hay
 
Con el sueño que hay la cabeza no me da para mucho, pero que para conseguir lo que quiere conseguir @El preguntón tampoco se necesita ninguna funcion ... una simple ecuacion, y lo de simple nunca mejor dicho, es suficiente para saber el resultado de la variable B en funcion de lo que valga en cada momento la variable A. La operacion seria la siguiente :
 
B = 360 * A - 180;
 
Poniendo algunos valores a la variable A como ejemplo tendriamos que ...
 
B = 360 * 0 - 180 = -180 (Cuando A vale 0, B valdra -180)
 
B = 360 * 0.5f - 180 = 0 (Cuando A vale 0.5, B valdra 0)
 
B = 360 * 1 - 180 = 180 (Cuando A vale 1, B valdra 180)
 
y cualquier valor que se le ponga a la variable A entre 0 y 1 dara el valor exacto de la variable B sin necesidad de ninguna funcion.

Cita de: Braltor date=1501189638ok



Impresionante sencillez, gracias por la ayuda de todos vosotros que así he podido ver las diferentes formas de resolver este problema. Ahora me da rabia pensar que no había caído en una ecuación tan fácil.

Cita de: Braltor date=1501188730no tan rapido, el tercer parametro tiene que ser un valor entre 0...1, y no lo es
   


Si que lo es, pero si no lo fuera es tan fácil como utilizar Mathf.Clamp: https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html
 

float newA = Mathf.Clamp(A, 0.0f, 1.0f);
B = Mathf.Lerp(-180.0f, 180.0f, newA);

 
Teniendo las funciones que hacen todas las operaciones es tontería hacerlas a mano, el código se ve más claro y es más difícil que haya errores. Al menos es lo que yo pienso...

Julio 28, 2017, 07:12:15 PM #13 Ultima modificación: Julio 28, 2017, 07:12:38 PM por lightbug
Cita de: Arthure date=1501191781y cualquier valor que se le ponga a la variable A entre 0 y 1 dara el valor exacto de la variable B sin necesidad de ninguna funcion.
   

Cita de: Arthure date=1501191781tampoco se necesita ninguna funcion ... una simple ecuacion, y lo de simple nunca mejor dicho, es suficiente para saber el resultado de la variable B en funcion de lo que valga en cada momento la variable A
   


Eso que acabas de poner ahi Arthure es una funcion , B(A) , tambien es una ecuacion por el "=" como bien dijiste, solo que interesan (para corroborar que esta bien la funcion) dos valores, para A = 0 y para A = 1.
 
 
 
Cita de: GSG3D date=1501220805Como que es una simple regla de 3 :P
   


Aca tendrias que tener en cuenta las deltas (para la pendiente o la proporcion) y no los valores puntuales (sino un cero te rompe la regla), y ademas tener en cuenta que la ordenada en este caso no es cero, entonces la regla de tres simple de toda la vida (para 1 manzana dos naranjas... para 5 manzanas?) no se si se aplica directamente, seguro habria que sumar o restar algo al final del camino. El resultado derecho de la regla te daria una delta, si luego le sumas la ordenada (-180) te deberia dar el valor. En la realidad sirve mucho porque muchas cosas las contas desde cero, entonces parece que fueran valores puntuales cuando en realidad son deltas o valores absolutos, no se si se entiende.
 
Un Ej de la funcion del Post:
 


  •    0.5 delta en horizontal----> 180(delta en vertical o pendiente)


  •    0.15 (valor de interes) ---> X = (0.15 * 180 )/0.5 - 180(ordenada) = -126


Osea es mas facil hacer la funcion
 
 
 
 

Etiquetas: