Bueno, aquí esta una beta que pongo como ejemplo.
Ayudas para mejorarlo, dudas o cometarios, por favor.
- Reproduce el borde de cualquier figura, con la paleta de Flash
USO:
- Dibujar cualquier figura con las herramientas de flash, o importar
un archivo permitido por Flash,(el ejemplo acepta transparencias)
- Importarlo en vinculación attach como "ejemplo".
Notas:
Está concebido para almacenar datos en un Array exportable para
usar en otro SWF sin que sea necesario importar luego la imagen original.
La function dibujar() aclara de forma implícita el camino para ello.
Para ello se pueden usar varios métodos que no son objeto del ejemplo.
El array es : st y es una colección de puntos en tres dimensiones del Array
st[color][forma][puntos] * En este ejemplo, aunque se puede utilizar otro sistema
de almacenamiento de cadena mucho más reducido y con optimización de lineas.
Solo interpreta colores de la paleta SWF asi que imágenes con otros colores
deberan ser tratadas (con el Flash u otros programas externos) antes de importarlos.
Puede ocurrir que si la imagen es muy "pesada" el render pida detener script
decir no hasta que termine de calcular la figura. Eso es debido precisamente a que
está diseñado para encontrar los bordes y DESPUES dibujar y no hacerlo simultaneamente
es decir, ir calculando y dibujando.
Si existen el el dibujo lineas simples, las lee de ida y vuelta pues está concebido
el script para hacer de guia de otros MC´s , API de dibujo o como borde de relleno y
por lo tanto ha de ser una figura cerrada con origen=final.
Es totalmente dinámico.
ejemplo en:
http://www.telecable.es/personales/terepardo1/SWFs/buscabordes_beta%200.html(tarda un poco por la causa citada)
Código :
// CONTORNOS DE FIGURAS EN COLOR by TESEO
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.display.BitmapData;
ROJO = 0xffff0000; NEGRO =-16777216; NOTRANS=0xff000000;
pt=[]; z=[]; cl=[]; st=[]; sx=[]; a1=0; ac=0; clr=[];
c_a1=0; c_g=0; c_ac=0; grueso=0;
p=new Array (1,1,1,0,-1,-1,-1,0,-1,0,1,1,1,0,-1,-1,6,0,0,2,2,4,4,6);
for (d=0 ; d<8 ; d++){pt[d] = new Point (p[d], p[d+8]); z[d]=p[d+16]};
mc2 = createEmptyMovieClip("mc2", this.getNextHighestDepth());
mc0=attachMovie("ejemplo","mc0",100);
mc0._visible=false;
RM=new Rectangle(0, 0,mc0._width ,mc0._height);RS=RM;
marco=new BitmapData(mc0._width,mc0._height,true,0);
//mc = this.createEmptyMovieClip("mc",99 );//no necesario , solo para ver en debug
//mc.attachBitmap(marco, 100);//no necesario , solo para ver en debug
marco.draw(mc0);
marco.threshold(marco,RM,new Point(0,0),"<",NOTRANS,0,NOTRANS,true);
do{RM=buscaColores(RM);} while (RM);
// si quitamos -1 a length también pasamos el borde total (pasa el 0)
for ( ac=0 ; ac< clr.length-1 ; ac++){ pasaColor(clr[ac]);}
marco.dispose();marco2.dispose();// liberar la memoria de los bitmap de ayuda
dibujar();
clearInterval(ID);
ID=setInterval (this, "dibujar",5);
function buscaColores(RM){
for (j=0 ; j< RM.height ; j++){
for (i=0; i< RM.width ; i++){
PT = new Point(RM.x+i,RM.y+j);
clr[ac]= marco.getPixel32(PT.x,PT.y)//+
if((clr[ac]+1)%51==0){ // los colores de la paleta básica de flash.
marco.threshold(marco,RS,new Point(0, 0),"==",clr[ac],0);
RM = marco.getColorBoundsRect(NOTRANS,0,false);//reducir la busqueda
ac++;
return (RM);
}
}
}
}
function pasaColor(color){ //pasar 0 para el contorno total no transparente
marco2=new BitmapData(mc0._width, mc0._height,true,0);
marco=new BitmapData(mc0._width+2,mc0._height+2,true,0);
marco2.draw(mc0);
marco.copyPixels(marco2,new Rectangle(0,0,mc0._width,mc0._height),new Point(1,1),true);
RO=new Rectangle(0, 0,marco.width ,marco.height);
//mc = this.createEmptyMovieClip("mc",99 );//no necesario , solo para ver en debug
//mc.attachBitmap(marco, 100);//no necesario , solo para ver en debug
RT=RO; st[ac]=[]; tp=[]; a1=0; //clr[ac]=color;
color==0 ? marco.threshold(marco,RO,new Point(0,0),"!=",0,NEGRO)
: marco.threshold(marco,RO,new Point(0,0),"!=",color,0);
color!=0 ? marco.threshold(marco,RO,new Point(0,0),"==",color,NEGRO): null;
RO = marco.getColorBoundsRect(NEGRO,0,false);// reducir la busqueda de color
do{RO=buscaBordes(RO);} while (RO);
for(var g= 0 ; g< a1; g++){tp[g]=st[ac][g][0].x;}
sx[ac] = tp.sort(-8); //ordenar para dibujar cada color de izquierda a derecha
return (st);
}
function buscaBordes(RO){
flag=1;
if(RO.isEmpty()){
marco.floodFill(0,0,ROJO);
marco.threshold(marco, RT, new Point(0, 0), "==",0,NEGRO);
marco.threshold(marco, RT, new Point(0, 0), "!=",NEGRO,0);
RO = marco.getColorBoundsRect(NEGRO,0,false)//reduce area de busqueda
if(RO.isEmpty()){return false}
}
else (RO = bordes(RO));
return (RO);
}
function bordes(RO){
for ( j=0 ; j< RO.height ; j++){
for ( i=0; i< RO.width ; i++){
PT = new Point(RO.x+i,RO.y+j);
if(marco.getPixel32(PT.x,PT.y)== NEGRO){
PO=PT; st[ac][a1]=[];
st[ac][a1].push(PT);// almacena 1er punto de cada borde y al bucle
do {bucle(PT,flag)}
while(!(PO.equals(PT)))
for (var ii=0 ; ii< st[ac][a1].length ; ii++){
marco.floodFill(st[ac][a1][ii].x,st[ac][a1][ii].y,ROJO);//solo para lineas de 1 pixel
marco.setPixel32(st[ac][a1][ii].x,st[ac][a1][ii].y,ROJO);//solo para lineas de 1 pixel
}
RO = marco.getColorBoundsRect(ROJO,NEGRO);//reduce area de busqueda
a1++;
return(RO);
}
}
}
RO = marco.getColorBoundsRect(0,ROJO);
return(RO);
}
function bucle(punto,flag2){
for (var k= flag2 ; k < 8+flag2 ; k++){
PT=punto.add (pt[k%8]);
if(marco.getPixel32(PT.x,PT.y)== NEGRO){
st[ac][a1].push(PT);// almacena todos siguientes puntos de cada forma
flag = z[k%8];
return;
}
}
}
function dibujar(){
for(var j = 0 ; j < 10 ; j++){ //para dibujar 10 puntos en cada llamada de setInterval
if(c_ac < ac){
if(c_a1 < sx[c_ac].length){
if(c_g < st[c_ac][sx[c_ac][c_a1]].length-1 ){
mc2.lineStyle(grueso, clr[c_ac], 100);
c0=st[c_ac][sx[c_ac][c_a1]][c_g]; c1=st[c_ac][sx[c_ac][c_a1]][c_g+1];
mc2.moveTo(c0.x,c0.y ); mc2.lineTo(c1.x,c1.y);
c_g++;
}
else{
c_a1++;
c_g=0;
}
}
else{
c_ac++;
c_a1=0;
c_g=0;
}
}
if(c_ac >= ac){
mc0._visible= true // para ver el MC al terminar
mc0._x=200;
clearInterval(ID);
return;
}
}
}