Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Un Rand

Iniciado por Sacrifai, 13 de Noviembre de 2004, 06:00:58 PM

« anterior - próximo »

Buffon

 pienso igual que los demas.

yo antes tambien dejaba los proyectos a medias, pero cuando has dejado unos cuantos descubres que si no lo acabas resolviendo, nunca sabras como hacerlo.

animo y que la sabiduria te acompañe.

si estas en 4to ESO y ya sabes programar, ole tus huevos, la mayoria de gente en 4to de ESO solo piensa en ****** si mismos en otro sentido, y culturizarse siempre es positivo.

hay un chaval de 16 años que desarrollo un videojuego de politica muy complicado, tanto IA com SIMULADOR y lo dicho, ole sus huevos

Buffon

 si kieres un terreno que sea conexo

yi = y(i-1) * ((-1)*(int)Rand(0,1)) * Rand(0,1);

hay otras  formas de hacerlo, pero es una forma clara y concisa, no hay divisiones, no hay excepciones xD

Pogacha

 
Citaryi = y(i-1) * ((-1)*(int)Rand(0,1)) * Rand(0,1);
Buena idea, pero lo vuelve negativo, supongo que los * eran +:
Citaryi = y(i-1) + ((-1)*(int)Rand(0,1)) + Rand(0,1);
Siguiendo tu idea:

yi = y(i-1) + Rand(0,AMPLITUD) - AMPLITUD/2;

con AMPLITUD 1, 2 o 3 dependiendo de la pendiente maxima que quieras darle!
Conexo pero muy escabroso.

gdl

 Siempre puedes usar una LUT (una tabla) para moldear la función de densidad (qué valores salen con más frecuencia que otros).

Un ejemplo muy muy sencillito

int Genera(void)
{
 static int const LUT[8]={-2,-1,0,0,0,0,1,2};

 return LUT[rand_int(0,7)];//Me he inventado rand_int(), pero está claro lo que hace ¿no?
}


Esta función te devuelve números enteros del -2 al 2, pero uno de cada dos números que devuelve es un cero.

Que quieres que salgan menos ceros, pues pones

{-2,-1,-1,0,0,1,1,2}

Que quieres más positivos que negativos

{-2,-1,0,0,1,1,2,2}

Y así vas moldeando.

A propósito, el orden da igual: {-2,-1,-1,0,0,1,1,2} hace lo mismo que {0,1,-2,-1,0,2,1,-1}

Dos cosas:
- Adecúa el tamaño de tu tabla con lo que necesites/quieras
- Puedes precalcular los valores de la tabla y no tener que escribirlos a mano
- Con algo de paciencia se puede extender este método para flotantes mediante interpolación, aunque en este caso la tabla tiene que estar ordenada

Saludos

Pogacha

 Con esto lo completa, como vez, con un solo rand puedes hacer todo lo que quieras, no necesitas funciones complejas, el tema de la derivacion numerica te vendria bien para entender el tema de las pendientes y la continuidad pero puedes pasarte esto por alto e inventar tus metodos matematicos simples para que la funcion quede adecuada a tus necesidades.
Debes ver ademas el tema de los filtros, para redondear las puntas.
Saludos.

Sacrifai

 Muchas gracias por las respuestas :D, por cierto, ¿sabeis alguna pagina con filtros para rendondear las puntas?

gdl

 
Para redondear las puntas escarpadas del terreno hay que pasar lo que en teoría de la señal se llama un filtro paso bajo o en procesamiento de imágenes un filtro de máscara con lo que se consigue un suavizado. Es una cosa muy tonta de hacer si las especificaciones no son muy estrictas (como en este caso). ;)

Basta con promediar cada valor v[x,y] con los valores vecinos:

nuevo_v[x,y]=0.5*v[x,y]+0.125*v[x-1,y]+0.125*v[x+1,y]+0.125*v[x,y-1]+0.125*v[x,y+1]

¡Y ya está! (uoh)

Notas:
- No uses v[x,y] como destino (nada de v[x,y]=0.5*....) Porque entonces vas a mezclar los valores nuevos con los viejos y se lía. Usa nuevo_v[] como un temporal y luego lo copias a v[]
- Ya imaginaras que esto de v[x,y] no es C++ (a no ser que sobrecargues el operador coma). Probablemente necesitaras algo como v[x+ANCHURA*y] aunque depende de cómo implementes el terreno.
- Por supuesto, hay que tener cuidado en los bordes del terreno.
- Puedes usar los valores v[x+1,y+1], v[x-1,y+1], etc.. pero tampoco es tan interesante. Icluso se pueden usar valores más lejanos, pero sin dejar huecos. Si usas v[x+3,y+1] deberías usar también v[x+2,y+1], v[x+1,y+1], v[x+1,y], etc. De todas las maneras, si lo pruebas, verás que no hay muchos cambios.
- Si te fijas la suma de los coeficientes es uno, eso mantendrá el nivel global del terreno. Aunque puedes hacer experimentos.
- Para que sea un paso bajo: Intenta que los coeficientes más cercanos al centro sean más grandes que los que estén más lejanos. No uses valores negativos en los coeficientes (nada de restas). No varíes los coeficientes bruscamente.

Espero que te sirva para empezar a suavizar esos terrenos. Luego pasaremos a las páginas de tratamiento de señal (es que son durillas de digerir). (nooo)

Saludos.

Buffon

 ostia si que eran + y no * xDDDD ya lo dije, tenia un examen en 10 minutos y contesté muy a saco ;)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.