flash as3 эквивалент обработки popmatrix () и pushmatrix () - или ... сохранение матрицы преобразования - PullRequest
0 голосов
/ 11 ноября 2011

Я пытаюсь преобразовать эскиз обработки в файл flash as3, и я зацикливаюсь на двух командах обработки - pushMatrix () и popMatrix () - кто-нибудь может сказать мне, как преобразовать их во флэш-память?

По сути, мне просто нужно сохранить матрицу линий, которые я нарисовал до сих пор, и нарисовать новую линию, и это делается рекурсивно. Вот мой код:

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();
    */
  }
}

1 Ответ

1 голос
/ 11 ноября 2011

Есть две проблемы, касающиеся различий в рисовании API.

Во-первых, Flash не отслеживает матрицы преобразования, если вы не рисуете несколько спрайтов в иерархии отображения. Это не рекомендуется, поскольку каждая успешная рекурсия создает как минимум два экранных объекта и загромождает иерархию отображения.

Второе, более или менее, из-за первого, заключается в том, что flash также автоматически не применяет преобразование к методам рисования, если не используется несколько экранных объектов, как описано выше.

Следующий код примерно сделает то, что вам нужно. Я поиграл с вашим фрагментом, но не уверен, что созданный на моей стороне рендер соответствует алгоритму, который вы использовали при обработке.

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();
}

В рамках вашего метода рисования вам нужно будет поддерживать две точки - исходную и целевую. Каждый представляет преобразованную точку на основе текущей матрицы.

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);

...

Существуют основные оптимизации, которые вы можете выполнить для алгоритма. Повторное использование существующих точек может помочь.

У меня не установлена ​​обработка, но если бы вы могли связать видео, представляющее этот конкретный алгоритм, это могло бы помочь другим понять, к чему вы стремитесь.

Удачи!

...