2011-11-10 1 views
0

Je suis en train de convertir une esquisse de traitement en un fichier flash as3, et je suis coincé sur deux de traitement commandes - pushMatrix() et popMatrix() - quelqu'un peut-il me dire comment les convertir en flash? Essentiellement, j'ai juste besoin de stocker la matrice de lignes que j'ai dessinées jusqu'ici et dessiner une nouvelle ligne, et cela se fait récursivement. Voici mon code:flash as3 équivalent de popmatrix() de traitement et pushmatrix() - ou ... stocker une matrice de transformation

var theta; 
var xpos:Number = 0; 

addEventListener(Event.ENTER_FRAME,draw) 

function draw(e:Event) { 


graphics.lineStyle(1, 0xf1eee5, 1, false, LineScaleMode.NONE, CapsStyle.SQUARE); 

    var a = (mouseX/stage.stageWidth) * 90; 
trace("a: " + a); 
    var theta = degreesToRadians(a); 
    graphics.moveTo(stage.stageWidth/2,stage.stageHeight); 
    graphics.lineTo(stage.stageWidth/2,stage.stageHeight-150); 
    branch(150); 
    if (a <= 30){ 
    xpos+=3; 
    } else { 

    } 
} 

function degreesToRadians(degrees:Number):Number { 
    return degrees * Math.PI/180; 
} 


function branch(h) { 
    // Each branch will be 2/3rds the size of the previous one 
    h *= 0.66; 

    // All recursive functions must have an exit condition!!!! 
    // Here, ours is when the length of the branch is 2 pixels or less 
    if (h > 2) { 

    /* HASN'T BEEN CONVERTED TO FLASH AS3 YET 
    pushMatrix(); // Save the current state of transformation (i.e. where are we now) 
    rotate(theta); // Rotate by theta 
    line(0, 0, 0, -h); // Draw the branch 
    translate(0, -h); // Move to the end of the branch 
    branch(h);  // Ok, now call myself to draw two new branches!! 
    popMatrix();  // Whenever we get back here, we "pop" in order to restore the previous matrix state 

    // Repeat the same thing, only branch off to the "left" this time! 
    pushMatrix(); 
    rotate(-theta); 
    line(0, 0, 0, -h); 
    translate(0, -h); 
    println(h); 
    branch(h); 
    popMatrix(); 
    */ 
    } 
} 

Répondre

1

Il existe deux problèmes concernant les différences dans les API de dessin. Le premier, flash ne conserve aucune trace des matrices de transformation, sauf si vous dessinez dans plusieurs sprites de la hiérarchie d'affichage. Cela ne serait pas recommandé car chaque récursivité réussie créerait au moins deux objets d'affichage et encombrerait la hiérarchie d'affichage. La seconde, plus ou moins, en raison de la première, est que flash n'applique pas automatiquement une transformation pour dessiner des méthodes, à moins d'utiliser plusieurs objets d'affichage comme décrit ci-dessus.

Le code suivant ferait à peu près ce dont vous avez besoin. J'ai joué avec votre extrait, mais je ne sais pas si le rendu créé de mon côté correspond à l'algorithme que vous utilisiez avec le traitement.

private var matrices:Vector.<Matrix>; 
private var matrix:Matrix; 

public function Main() 
{ 
    matrices = new Vector.<Matrix>(); 
    matrix = new Matrix(); 
    matrix.identity(); 
} 

private function pushMatrix():void 
{ 
    matrices.push(matrix.clone()); 
} 

private function popMatrix():void 
{ 
    matrix = matrices.pop(); 
} 

Au sein de votre méthode de tirage au sort, vous devrez maintenir deux points, l'origine et la cible. Chacun représente le point transformé en fonction de la matrice actuelle.

var origin:Point; 
var target:Point; 

pushMatrix(); 
matrix.rotate(theta); 

origin = matrix.transformPoint(new Point(0, 0)); 
target = matrix.transformPoint(new Point(0, -h)); 

graphics.moveTo(origin.x, origin.y); 
graphics.moveTo(target.x, target.y); 

... 

Il existe des optimisations de base que vous pouvez effectuer pour l'algorithme. La réutilisation de points existants aiderait avec défi.

Je n'ai pas de traitement installé, mais si vous pouviez lier une vidéo qui représente cet algorithme particulier, cela pourrait aider les autres à comprendre ce que vous visez.

Bonne chance!

Questions connexes