Estoy buscando dibujar formas irregulares en una cuadrícula x, y, y me gustaría encontrar un método simple y rápido si es posible. Mi única idea hasta ahora es dibujar un montón de círculos de tamaños aleatorios muy cerca uno del otro, pero a una distancia aleatoria aparte de una coordenada más o menos central, luego completar los espacios en blanco. Me doy cuenta de que este es un método torpe y poco elegante, espero que te dé una idea aproximada de los tipos de formas redondeadas y aleatorias con manchas que estoy buscando. Sugiera métodos para lograr esto, no estoy tan interesado en el código. Puedo frenar esa parte yo mismo. ¡Gracias!
2d
algorithm
random
procedural
Yttermayn
fuente
fuente
Respuestas:
Es posible que desee elegir algunos puntos, elegir un vector en cada punto y dibujar una spline a través de ellos. Consulte esta página de Wikipedia para obtener una descripción simple de una spline cúbica (también conocida como spline Irwin-Hall). Ha pasado un tiempo desde que los usé, pero si no recuerdo mal, este fue el más fácil de entender y usar. Si conoce la herramienta de lápiz de Photoshop, esto funciona de manera muy similar (estoy convencido de que Photoshop también usa splines, pero no estoy seguro si es una spline cúbica).
Si está interesado, hay muchas más splines: por ejemplo, las splines de Bezier y las B-splines son interesantes.
Otra cosa que viene a la mente son los conjuntos de niveles, aunque eso probablemente requerirá un poco más de investigación de su parte (para encontrar funciones que satisfagan sus requisitos).
Los conjuntos de niveles son desigualdades en la forma
f (x, y) = c
donde f es alguna función y c es alguna constante.
Esta es una descripción muy general. Es posible que desee completar alguna forma y dibujar todos los píxeles donde
f (x, y) <= c
con algo de color. Por ejemplo, para una forma 2D perfectamente redonda, tiene la ecuación conocida:
x ^ 2 + y ^ 2 <= r ^ 2
Puede escalar los componentes x e y para obtener un elipsoide Con un poco de experimentación e investigación, será posible encontrar algunas formas más funky (supongo).
Editar: un poco de experimentación en wolframalpha.com me dio esto . (creado con el comando 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). No tengo idea si esto es algo como lo que quieres, pero es solo para darte una idea.
fuente
Otro enfoque sencillo es usar su propio ruido de baja frecuencia para dibujar (o definir) una figura en coordenadas polares.
Suponga que desea un blob centrado en el origen, de radio promedio 1; Esto se puede escalar y traducir fácilmente a otras posiciones y tamaños. Imagine con la ecuación simple r = 1: esto definiría un círculo de radio uno en el origen. Para agregarle una pequeña variación, puede cambiar el radio sinusoidalmente: agregue un término de la forma w 1 * sin (θ + θ 1 ), donde w 1 y θ 1 son constantes a las que volveré en un momento. Un término de pecado no hará una gran diferencia, pero tener varios senos diferentes de diferentes frecuencias comenzará a agregar exactamente el tipo de variación 'suave' que sospecho que está buscando. La forma general sería a lo largo de las líneas de r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + θ 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5 * sin (5θ + θ 5 ) - o más términos si lo desea, por supuesto.
Entonces, ¿cómo seleccionamos los valores para w i y θ i ? Bueno, las θs deben seleccionarse al azar de (0,2π); en otras palabras, cada 'onda' en la forma de la superficie debe comenzar en un punto diferente alrededor de la forma. En cuanto a las w, hay varias opciones diferentes. Eligiendo w i al azar de (0, w) (para algunos w fijos que representan la 'variación general' para dar la forma; podría comenzar con w = 0.25 pero experimentar con w = 0.1) por cada i conducirá a so- llamado ruido blanco , donde todas las frecuencias tienen el mismo peso; este será, con mucho, el "más blobbiest", con amplias variaciones en todas las frecuencias. Elegir w i al azar entre (0, w * (1 / i)) - en otras palabras,ruido, donde el peso se desvanece, pero lentamente. Esto también se conoce como ruido 1 / f , y es el ruido 'fractal' más famoso. Finalmente, elegir los pesos al azar entre (0, w * (1 / i ^ 2)) (en otras palabras, dividir cada peso al azar entre i ^ 2) produce ruido browniano : este es el 'más suave' de los tres, con el menor variación de un círculo: generalmente será una forma ovalada.
Estos son ejemplos de los tres, utilizando un 'peso total' de w = 0,25, y utilizando el mismo conjunto de valores aleatorios para el w i y θ i sacado de random.org :
Blob "Ruido blanco":
Blob "Ruido rosa":
Blob "Ruido browniano":
Tenga en cuenta que estos blobs no serán perfectos; en particular, es imposible para ellos acurrucarse sobre sí mismos (ya que por cada θ, en otras palabras, por cada ángulo desde el origen, hay un solo valor r), y si no elige sus pesos correctamente, podrían auto- intersectarse (si se permite que r sea negativa). Pero hacen un trabajo decente de ser convincentemente blobby, y para la mayoría de las aplicaciones de juegos, los usuarios no notarán ningún problema.
fuente
Además de las otras respuestas, podría usar un ruido Perlin con una caída redonda, si modifica un poco la configuración, podría crear fácilmente algunas formas agradables y variadas.
Si desea que su código sea rápido, puede usar una biblioteca de generación de ruido como libnoise (suponiendo que esté usando c ++), que es una biblioteca de generación de ruido, que simplifica las tareas similares, ya que le proporciona un nodo enfoque basado en la generación de procedimientos basados en ruido. También tiene enlaces a otros idiomas.
fuente