La idea Se puede crear un valor pseudo-aleatorio que permanezca constante, basado en las propiedades inherentes de cada característica con algunas operaciones matemáticas. Las propiedades inherentes pueden ser los valores de las coordenadas x-/y (como ya se ha propuesto) o $id
de cada característica. Como usted mencionó, $x
y $y
están demasiado cerca unos de otros para funcionar como una especie de valor "aleatorio".
Pero puede utilizar algunas operaciones matemáticas que convierten cada número en un nuevo valor difícil de predecir que, sin embargo, está calculado y, por lo tanto, es estable (no cambia con el pan/zoom). Puedes utilizar operaciones matemáticas como raíz cuadrada, seno, coseno, tangente, logoritmo, convertir radianes en ángulos y viceversa, etc. Para mejorar el valor "pseudo-aleatorio", sólo tienes que elegir algunos de los dígitos (no todo el número resultante) - digamos tres dígitos para obtener resultados de 0 (000) a 999. Luego escala el resultado al rango que necesitas - como 0 a 999 debe ser convertido linealmente a un valor de 3 a 5 y/o 0 a 360.
La aplicación Digamos que se calcula la raíz cuadrada del valor de la coordenada x y se divide por el valor de la característica id
(o algún logaritmo o seno del id
). Luego, del número real resultante, toma algunos dígitos, digamos tres, usando la función substring para obtener los dígitos de la posición 8 a la 10 (la cuenta de posiciones incluye el número entero, incluyendo el punto de los dígitos y el valor entero antes de él - podrías restar primero el valor redondeado, para obtener sólo las posiciones después del punto decimal). Se obtiene un valor de 0 a 999. Con scale_linear, puedes escalar estos valores a un rango de 3 a 5. La expresión completa se ve así:
scale_linear( substr (sqrt( $x) / $id, 8,3), 0, 999, 3,5)
y respectivamente para la rotación (aquí escogiendo 3 dígitos, empezando por la posición 4):
scale_linear( substr (sqrt( $x) / $id, 4,3), 0, 999, 0,360)
Si sus coordenadas x e y siguen estando demasiado cerca para producir este efecto pseudoaleatorio, puede volver a utilizar substr()
- por ejemplo, sustituir $x
con substr ( $x, 3,4)
para obtener los cuatro dígitos, empezando por la posición 3 (por lo tanto, un número formado por los dígitos de la posición 3,4,5 y 6).
Para obtener la posición inicial de una subcadena, ésta también puede basarse en el valor de la variable $id
de cada característica, junto con scale_linear
(ya que los dígitos están limitados a 15). Para sustituir el valor de 4
en la expresión anterior (la posición a partir de la cual debe comenzar la toma de tres dígitos), podría utilizar esta expresión - basada en el valor de las características $id
, devuelve un número entero de 3 a 13 que puede utilizar como posición inicial para seleccionar tres dígitos:
to_int (scale_linear( $id, 0, count( $id), 3,13))
Aquí también se podrían buscar soluciones más sofisticadas modificando la posición de inicio con una función pseudo-aleatoria basada en el valor del id (como en los ejemplos anteriores), calculando algunas raíces cuadradas, logaritmos o lo que sea y seleccionando un determinado rango (posiciones) para obtener unos valores cuasi-accidentales (difíciles de predecir) que, sin embargo, están calculados y por tanto serán estables.