Flash ya contiene una implementación de ruido Perlin, a través del método BitmapData.perlinNoise()
. Lo que puede hacer si necesita obtener el ruido como un vector de números (a diferencia de un mapa de bits renderizable) es usar el método BitmapData.getVector()
que devuelve todos los píxeles como un vector de enteros de 32 bits, donde los cuatro bytes representan alfa , rojo, verde y azul respectivamente.
He empleado este mismo patrón en un proyecto yo mismo, con gran éxito. A continuación se muestra la función que escribí y usé.
public static function initNoiseVector(output : Vector.<Number>, baseX : Number, numOctaves : Number, scale : Number, blur : uint = 0) : void
{
var i : uint;
var len : uint;
var sum : uint;
var avg : uint;
var perlin : BitmapData;
var noise : Vector.<uint>;
len = output.length;
perlin = new BitmapData(len, 1);
perlin.perlinNoise(baseX, 1, numOctaves, 0, true, false, 7, true);
if (blur > 0)
perlin.applyFilter(perlin, perlin.rect, new Point(), new BlurFilter(blur, 1, 3));
noise = perlin.getVector(perlin.rect);
// Calculate average
sum = 0;
for (i=0; i<len; i++) {
// Mask out blue channel
sum += noise[i]&0xff;
}
avg = sum/len;
for (i=0; i<len; i++) {
var speed : Number;
// Convert perlin noise color to value between -1 and 1
speed = ((noise[i]&0xff) - avg)/avg;
output[i] = speed * scale;
}
}
Esta función básicamente sólo crea un alto mapa de bits de 1 píxel (ancho definido como la longitud del vector), inicia ruido Perlin escala de grises en ese mapa de bits, opcionalmente se aplica un desenfoque y luego escala los valores de acuerdo con el argumento de la función escala .
La escala se realiza calculando primero el valor promedio (utilizando solo el canal azul, ya que todos los canales serán idénticos debido a que el ruido es en escala de grises). Los valores se normalizan entre -1 y 1, donde el promedio ser 0 y escalado por el factor de escala suministrado.
La función se puede utilizar de la siguiente manera, para recuperar los valores de 1000:
_noise = new Vector.<Number>(1000, true);
PerlinNoiseUtil.initNoiseVector(_noise, 300, 10, randomDev * periodTime, 10);
Espero que esto ayude!
Hola, veo que esta es una vieja pregunta. Puedo ayudar, pero no estoy seguro de entender completamente la pregunta. Hay ruido perlin en Actionscript3: nuevo BitmapData (ancho, alto) .perlinNoise (..) – zehelvion