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(widt, heig, true, 0);
thisBitmap.draw(mc);
var mcBitmap:BitmapData = new BitmapData(mcdragger._width, mcdragger._height, true, 0);
mcBitmap.draw(mcdragger);
function test(){
if(thisBitmap.hitTest(new Point(bound.xMin,bound.yMin), threshold, mcBitmap, new Point(mcdragger._x, mcdragger._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