Einzelnen Beitrag anzeigen
Alt 29-10-2009, 20:48   #19 (permalink)
labrar
Isch kucke
 
Registriert seit: Jan 2005
Beiträge: 1.616
Okay ich bin schon einen großen Schritt weiter.

Klasse:
PHP-Code:
import flash.display.BitmapData;
import flash.geom.Point;
class 
shape2vector{
    
    private var 
from:MovieClip;
    private var 
nodes;
    private var 
nodesIn;
    
    public function 
DRAW(){
        var CLASS:
shape2vector=this;
        var 
nodes=CLASS.nodes;
        var 
nodesIn=CLASS.nodesIn;
        CLASS.
from.createEmptyMovieClip("testd",20);
        var 
testd=CLASS.from.testd;
            
testd.beginFill(0x000000,100);
            var 
c=nodes[0].split("|");
            
testd.moveTo(c[0],c[2]);
            var 
num=nodes.length;
            
            for(var 
i=0;i<nodes.length;i++){
                
                var 
c=nodes[i].split("|");
                    
testd.lineTo(c[1],c[2]);
                
                }
            for(var 
a=num;a>0;a--){
                
                var 
c=nodes[a].split("|");
                if(!
isNaN(c[0])&& !isNaN(c[2])){
                    
testd.lineTo(c[0],c[2]);
                }
            }
            var 
c=nodesIn[0].split("|");
            
testd.moveTo(c[0],c[2]);
            var 
num=nodesIn.length;
            
            for(var 
i=0;i<nodesIn.length;i++){
                
                var 
c=nodesIn[i].split("|");
                    
testd.lineTo(c[1],c[2]);
                
                }
            for(var 
a=num;a>0;a--){
                
                var 
c=nodesIn[a].split("|");
                if(!
isNaN(c[0])&& !isNaN(c[2])){
                    
testd.lineTo(c[0],c[2]);
                }
            }
        }
    
    private function 
simple(array){
        var CLASS:
shape2vector=this;
        var 
star=array[0];
        var 
end=star;
        for(var 
i=0;i<array.length;i++){
            if(
end<array[i]){end=array[i];}
            }
        
            
            
            
            if(!
isNaN(star) && !isNaN(end)){
            return 
star+"|"+end;
            }
    }
    private function 
simpleAll(arrayA,arrayB){
        var CLASS:
shape2vector=this;
            var 
backray=new Array();
            var 
checker=arrayA[0];
            
backray.push(arrayA[0]+"|"+arrayB[0]);
            for(var 
i=0;i<arrayB.length;i++){
                if(
arrayA[(i+1)]==checker){}else{
                    
backray.push(arrayA[i]+"|"+arrayB[i]);
                    }
                    
checker=arrayA[i];
                }
                return 
backray;
            }

    
    public function 
shape2vector(from,mc){
        
        var CLASS:
shape2vector=this;
        CLASS.
from=from;
        var 
bound=mc.getBounds(from);
        var 
widt=bound.xMax-bound.yMax;
        var 
heig=bound.yMax-bound.yMin;
        
from.createEmptyMovieClip('mcdragger',from.getNextHighestDepth());
        var 
mcdragger=from.mcdragger;
        
mcdragger.lineStyle(1,0xFFFFFF,100);
        
mcdragger.moveTo(0,0);
        
mcdragger.lineTo(1,1);
        var 
threshold 1;
        var 
thisBitmap:BitmapData = new BitmapData(widtheigtrue0);
         
thisBitmap.draw(mc);
         var 
mcBitmap:BitmapData = new BitmapData(mcdragger._widthmcdragger._heighttrue0);
         
mcBitmap.draw(mcdragger); 
            function 
test(){
                    if(
thisBitmap.hitTest(new Point(bound.xMin,bound.yMin), thresholdmcBitmap, new Point(mcdragger._xmcdragger._y), threshold)) {  
                     return 
true;
                    }
            
            }
        
mcdragger._x=bound.xMin;
        
mcdragger._y=bound.yMin;
        var 
Ynot=new Array();
        var 
YnotIn=new Array();
        var 
Xnot=new Array();
        var 
XnotIn=new Array();
    for(var 
hor=0;hor<widt;hor++){
    var 
inX=new Array();
    var 
inXIn=new Array();
    var 
contact=false;
    for(var 
ver=0;ver<heig;ver++){
        
mcdragger._x=bound.xMin+ver;
        
mcdragger._y=bound.yMin+hor;
        var 
pos=(mcdragger._x-bound.xMin);
        
        if (
test()) {
            
inX.push(pos);            
            var 
maxcall=pos;
            
contact=true;
            
        }else{
            
            if(
contact && pos<max){
                
inXIn.push(pos);            
                }
            }
        
            
            
        }
        var 
max=maxcall;
        var 
p=CLASS.simple(inX);
        var 
pin=CLASS.simple(inXIn);
        if(
pin!=undefined && inXIn.length>0){
            
YnotIn.push(mcdragger._y-bound.yMin);
            
XnotIn.push(pin);
        }
        if(
p!=undefined){
            
Ynot.push(mcdragger._y-bound.yMin);
            
Xnot.push(p);
        }
        }

            
        
        CLASS.
nodes=CLASS.simpleAll(Xnot,Ynot);
        if(
XnotIn.length>0){
            CLASS.
nodesIn=CLASS.simpleAll(XnotIn,YnotIn);
        
        }
        
        
mcdragger.removeMovieClip();
    }
    

Aufruf:
PHP-Code:
shape=new shape2vector(_root,t);
shape.DRAW(); 
shape2vector wird mit zwei Parametern aufgerufen
1. Der Hauptmc (in meinem Fall _root)
2. Der zu vektorisierende MC

Die Funktion DRAW ist optional und dient im Prinzip nur der Kontrolle der Vektordaten indem hier einfach per moveTo und lineTo der mc anhand der Vektordaten nachgezeichnet wird.


So funktioniert das ganze (Was im übrigen sogar recht performant geht):

Im Hauptmc (erster Parameter) wird kurzzeitig ein 1 Pixel breiter und 1 Pixel hoher mc erstellt der die Boundingbox von links nach rechts Pixelzeile für Pixelzeile durchrastert und per Hittest prüft ob im getracten Pixel etwas vorhanden ist order nicht.

Zunächst werden lediglich die äusseren Pixel in ein Array gespeichert (nodes) und durch die Funktionen simple und simpleAll auf ein minimum reduziert.
Danach dann die inneren Pixel(nodesIn). Also zB einem großen R der leere Teil oben.

Mein Problem, und das werdet ihr beim testen merken, liegt zum einen darin dass gerade die inneren Pixel nicht ganz stimmen und ich habe keine Ahnung warum.

Und zweitens. Wie kann ich es am besten lösen dass, auch zwei oder drei Leerräume gespeichert werden können (zB beim Buchstabe B)?

Und drittens. Wenn ich den mc drehe zerschießt es das ganze ganz.

Ich würde mich freuen wenn das ganze ein wenig auf Interesse stößt und ihr vieleicht sogar Lust habt hier zu besseren Lösungen beizutragen

Viel Spaß erstmal mit der Klasse

Zum besseren Verständniss meines Problems, hier noch die Testswf.
Der rechte Buchstabe ist das Original, links oben das Vektorisierte Teil davon. Da sieht ma die Problematik am besten
Angehängte Dateien
Dateityp: swf vektor4.swf (22,8 KB, 7x aufgerufen)
__________________
Gesehen auf einem Türschild:

Niederknien, anklopfen und um Audience betteln

Har Har

http://www.flashforum.de/forum/flash-mx-2004/uberblenden-tutorial-180341.html
Mp3 Player http://www.flashforum.de/forum/stuff/stuff-jukebox-196373.html

Geändert von labrar (29-10-2009 um 21:06 Uhr)
labrar ist offline   Mit Zitat antworten