4 votos

¿Fórmula para producir números entre 0 y 255?

Estoy escribiendo un programa que necesita para hacer un ciclo a través de los números entre 0 y 255 determinada posición X del ratón. Si el número dado va a 255, la diferencia debe ser restado, como en 0,1,2...255,254,253...3,2,1,0,1,2,3,4...255,254...

Por ejemplo

Given  Output
  1      1
  2      2
 255    255
 256    254
 509     0
 510     1

He estado jugando con diferentes fórmulas (x mod 255) está cerca pero cuando pasa a través de 255, va directo a 0 en lugar de 254.

Otra que se me ocurrió fue round( 127.5*cos(x/16)+127.5 ) produjo un número decente , pero no lo suficientemente bueno.

Estoy haciendo esto demasiado complicado? ¿Qué es una fórmula que puede producir números como este?

8voto

Pyrofoux Puntos 773

He aquí una solución que funciona para $5$ en lugar de $255$, pero he extendido fácilmente a su necesidad en la final.

Vamos a empezar con una función de $f(x) = x$. Para $1$ $9$consigue :

$1,2,3,4,5,6,7,8,9$

A continuación, con $x-5$, se obtiene :

$-4,-3,-2,-1,0,1,2,4,5$

Con $\sqrt{(x-5)^2}$ consigue :

$4,3,2,1,0,1,2,3,4$

A continuación, $5-\sqrt{(x-5)^2}$ le da :

$1,2,3,4,5,4,3,2,1$.

Para $5$, la fórmula final es $f(x) = 5-\sqrt{(\bmod(x,9)-5)^2}$ Para $255$, su fórmula final es, a continuación,$f(x) = 255-\sqrt{(\bmod(x,509)-255)^2}$ !

PS : te vi usando PHP así que aquí está el PHP equivalente :

return 255-abs((x%509)-255)

5voto

GDumphart Puntos 1587

Utilizar esta:

 output = abs(mod(input + 252,508)-253)+1;
 

Funciona y cumple todas tus especificaciones, lo probé en Matlab.

3voto

David K Puntos 19172

Voy a definir $f(x)$ a ser el resultado de la función dada $x.$ Es decir, $$\begin{eqnarray} f(1) &=& 1, \\ f(2) &=& 2, \\ f(255) &=& 255, \\ f(256) &=& 254, \\ \end{eqnarray}$$ y así sucesivamente. También asumo que se supone que tienen un $f(0) = 0$ si $0$ está en el dominio de la función.

Si sigues paso a paso hacia abajo de la salida de $254$ (determinado$256$), sin saltarse cualquiera de los números, y que permiten la salida para ir todo el camino hacia abajo a $0,$ a continuación, la adición de $1$ $x$reduce el $f(x)$ $1,$ la adición de $2$ $x$reduce el $f(x)$ $2,$ y añadiendo $253$ $x$reduce el $f(x)$ $253.$ Es decir, $$\begin{eqnarray} f(257) &=& 253, \\ f(258) &=& 252, \\ f(509) &=& 1, \\ f(510) &=& 0, \\ f(511) &=& 1, \\ f(512) &=& 2, \\ \end{eqnarray}$$ y así sucesivamente, ya que quiero empezar a contar hacia arriba de nuevo una vez que llegue a $0.$

Debe ser claro que el período de su función es exactamente $510.$ Es decir, una vez que lleguen a la salida $0,$ tomará $510$ pasos adicionales (incremento de el valor dado por $1$ cada vez) para llegar a la próxima salida de $0.$

La siguiente función que va a realizar el trabajo:

$$f(x) = |((x + 254) \mod 510) - 254|$$

You can test it with the following PHP code:

<?
for($x = 0; $x <= 1025; $x++) {
      echo($x . "  ->  " . abs((($x + 254) % 510) - 254)) . "\n";
}
?>

Look particularly at the output for inputs near $255,$ near $510,$ near $765,$ y cerca de $1020.$

1voto

Aleks Vlasev Puntos 2735

Esto es lo que puedes hacer. Comienza con la onda triangular usando la definición

PS

La función que necesitas es

PS

dónde $$x(t,a) = \frac{2}{a}\left(t-a\left\lfloor\frac{t}{a}+\frac{1}{2}\right\rfloor\right)(-1)^{\left\lfloor\tfrac{t}{a}+\tfrac{1}{2}\right\rfloor}$. Esto simplifica a

PS

1voto

Tacet Puntos 1247

Mira un ejemplo más pequeño,$3$ en lugar de$255$.

 x = 1 2 3 4 5 6 7 8 9 10
v:  1 2 3 2 1 2 3 2 1 2...
 

El período más pequeño aquí es 1 2 3 2 . Deje que$(a_n)_{0..3}$ sea una secuencia de 4 elementos,$(a_n) = (1,2,3,2)$ numerado desde cero ($a_0 = 1$). La respuesta es $f(x) = a_{\left(x-1 \mod 4\right)}$.

Por supuesto, si no desea realizar esta secuencia en la memoria, puede realizar una función similar sin ella. Dejar $m = 255*2 - 2$.

$$ f (x) = \ left \ {\begin{array}{l l} x & x < 255\\ 255 - (x-255) & x \in [255; m] \\ f((x-1 \mod{m})+1) & x > m\\ \end {array} \ right. $$

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X