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<?php
class ScoreIEPolateLineal {
/*/
* Dos puntos conocidos expresados de la forma [x, y]
* Donde x es el numero de posicion.
* Donde y es la puntuacion de esa posicion.
/*/
private $p1;
private $p2;
/*/
* La pendiente y la ordenada al origen de la recta.
/*/
private $incline;
private $oo;
public function __construct($p1, $p2) {
$this->p1 = $p1;
$this->p2 = $p2;
$this->incline = (($this->p2[1] - $this->p1[1]) / ($this->p2[0] - $this->p1[0]));
$this->oo = ($this->p1[1] - ($this->incline * $this->p1[0]));
}
/*/
* Posicion de la que te interesa saber la puntuacion.
* Si esta dentro del rango [x1, x2] la puntuacion sera interpolada
* Dentro del rango [y1, y2] de forma linel.
* Si esta fuera del rango [x1, x2] la puntuacion sera extrapolada
* Fuera del rango [y1, y2] de forma linel.
/*/
public function calculate($pos) {
return ($this->incline * $pos) + $this->oo; // y = mx + b
}
}
$calculator = new ScoreIEPolateLineal([1,10], [230,1]);
echo "<table><tr><th>Pos</th><th>Puntos</th></tr>";
for($pos = -10; $pos <= 240; $pos++)
echo "<tr><td>$pos</td><td>".$calculator->calculate($pos)."</td></tr>";
echo "</table>";