Ver Mensaje Individual
  #10 (permalink)  
Antiguo 12/08/2015, 10:11
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Hola @kahlito, matematicamente puedes plantear la variacion en la puntuacion como una funcion, para darte un ejemplo voy a asumir que se trata de una funcion lineal, es decir, que la puntuacion varia de forma proporcinal y constante de un punto a otro.

Sabemos que la ecuacion de una funcion lineal es:
y = mx + b
donde b es la ordenada al origen y su formula sale de despejar en la ecuacion anterior:
b = y - mx
y donde m es la pendiente y su formula es:
m = (y2-y1) / (x2-x1);
donde los puntos (x1, y1) y (x2, y2) son conocidos, en el caso del ejemplo estos puntos son: (1, 10) y (230, 1).

Ahora lo que sigue es allar m, por lo tanto:
m = (1 - 10) / (230 - 1) = -0.0393013100436681222707423580786
Ahora lo que sigue es allar b, por lo tanto tomamos un punto cualquiera de los 2 conocidos:
b = 10 - (-0.0393013100436681222707423580786 * 1) = 10.0393013100436681222707423580786

Y listo, la funcion ahora queda:
y = (-0.0393013100436681222707423580786 * x) + 10.0393013100436681222707423580786

Graficamente:


Por supuesto que podria ser una funcion polinomica, logaritmica inversa, senoidal o cualquier otra cosa, to doy el ejemplo con la lineal que es la mas simple y que creo es que necesitas.

Ej de codigo en PHP:
Código PHP:
Ver original
  1. <?php
  2.     class ScoreIEPolateLineal {
  3.         /*/
  4.          * Dos puntos conocidos expresados de la forma [x, y]
  5.          * Donde x es el numero de posicion.
  6.          * Donde y es la puntuacion de esa posicion.
  7.         /*/
  8.         private $p1;
  9.         private $p2;
  10.        
  11.         /*/
  12.          * La pendiente y la ordenada al origen de la recta.
  13.         /*/
  14.         private $incline;
  15.         private $oo;
  16.  
  17.         public function __construct($p1, $p2) {
  18.             $this->p1 = $p1;
  19.             $this->p2 = $p2;
  20.             $this->incline = (($this->p2[1] - $this->p1[1]) / ($this->p2[0] - $this->p1[0]));
  21.             $this->oo = ($this->p1[1] - ($this->incline * $this->p1[0]));
  22.         }
  23.  
  24.         /*/
  25.          * Posicion de la que te interesa saber la puntuacion.
  26.          * Si esta dentro del rango [x1, x2] la puntuacion sera interpolada
  27.          * Dentro del rango [y1, y2] de forma linel.
  28.          * Si esta fuera del rango [x1, x2] la puntuacion sera extrapolada
  29.          * Fuera del rango [y1, y2] de forma linel.
  30.         /*/
  31.         public function calculate($pos) {            
  32.             return ($this->incline * $pos) + $this->oo; // y = mx + b
  33.         }
  34.     }
  35.  
  36.     $calculator = new ScoreIEPolateLineal([1,10], [230,1]);
  37.     echo "<table><tr><th>Pos</th><th>Puntos</th></tr>";
  38.     for($pos = -10; $pos <= 240; $pos++)
  39.         echo "<tr><td>$pos</td><td>".$calculator->calculate($pos)."</td></tr>";
  40.     echo "</table>";
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 13/08/2015 a las 09:47