Necesita ideas para un algoritmo para dibujar formas irregulares con manchas

8

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!

Yttermayn
fuente
2
Ayudaría si adjuntara algunos ejemplos de tales formas, pero por lo que entendí, el algoritmo Marching Squares podría ser lo que está buscando.
Alexander Konstantinov
Por ejemplo, con toda seriedad, piense en las manchas hepáticas: redondeadas, aleatorias, pero generalmente ovoides.
Yttermayn
66
Esta publicación de Mathica.SE tiene algunos ejemplos que pueden resultarle interesantes: Mathica.stackexchange.com/questions/3345/... La respuesta principal básicamente hace lo que está haciendo. otro encuentra el casco convexo de puntos aleatorios y luego interpola una ranura a través de él, pero eso parece un poco complicado ...
Jemmy
Gracias por sus respuestas! Desafortunadamente, creo que podría estar un poco loco. Puede que tenga que resolver algo más.
Yttermayn
44
¿Qué tal comenzar con un círculo cercano al tamaño deseado y luego permutarlo usando ruido perlin? Ya sea moviendo el píxel seleccionado o desvaneciendo / extendiendo el círculo.
FloAr

Respuestas:

1

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.

Rubén
fuente
1

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": Una mancha hecha con ruido blanco

Blob "Ruido rosa": Una gota hecha con ruido rosa

Blob "Ruido browniano": Una gota hecha con 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.

Steven Stadnicki
fuente
(También tenga en cuenta: el hecho de que estas formas son tan simétricas es un artefacto de (a) que los coeficientes de los armónicos segundo y cuarto son tan pequeños, y (b) las fases de los armónicos primero, tercero y quinto - cuánto desplazamos los valores theta, estando tan cerca, en .468, .464 y .443; la mayoría de los 'blobs' no tendrán tanta simetría sobre ellos.)
Steven Stadnicki
0

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.

akaltar
fuente