2 votos

Capa de puntos con tamaño y rotación aleatorios

Tengo una capa de puntos que representa árboles. Esta capa utiliza un símbolo SVG.

He fijado el tamaño con rand(3, 5) en unidad de mapa (yo estoy en metros). Y la rotación con rand(0, 359) . Con esto, mi mapa parece un poco más "natural".

Mi problema es que la aleatoriedad se recalcula cada vez que me acerco y me alejo. Quiero que cada nuevo punto utilice el SVG con un tamaño entre 3 y 5 metros, y una rotación entre 0 y 359. Pero una vez hecho, no se mueven más.

¿Es posible con el generador de geometría? Si es así, ¿cómo?

La razón es que si envío un mapa a mis clientes y me piden que sólo cambie el título, por ejemplo, no quiero que se modifiquen también todos mis símbolos.

3voto

chhh Puntos 1154

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)

enter image description here

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.

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