Преобразование матрицы dojo.gfx

От матричных преобразований у меня закружилась голова. У меня есть dojox.gfx.group, которую я хочу перетаскивать с помощью Mover, а затем иметь возможность вращать ее вокруг определенной точки на поверхности. Мой основной код выглядит так:

this.m = dojox.gfx.matrix,
.
.
.

updateMatrix: function(){
  var mtx = this.group._getRealMatrix();
  var trans_m = this.m.translate(mtx.dx, mtx.dy);
  this.group.setTransform([this.m.rotateAt(this.rotation, 0, 0), trans_m]); 
}

Точка вращения находится в (0,0) просто для простоты. Я, кажется, не понимаю, как происходит ротация группы.

Любая ссылка на упрощенный учебник по матричным преобразованиям также поможет. те, которые я проверил, не слишком помогли.


person droid001    schedule 10.01.2010    source источник


Ответы (2)


Попробуйте официальное руководство по матрицам dojox.gfx. Посмотрите, поможет ли официальная документация.

person Eugene Lazutkin    schedule 11.01.2010

Официальная документация — это то, от чего у меня закружилась голова. Я смотрел на это в течение довольно долгого времени, потому что я не мог понять, как передать новые координаты в предстоящие матричные преобразования.

Я, наконец, удалось выяснить проблему, хотя. Это был вопрос подключения слушателя к моменту срабатывания Mover onMoveStop:

dojo.connect(movable, "onMoveStop", map, "reposition");

Затем я получаю новые перемещенные расстояния и передаю их в любые преобразования матрицы вращения или масштабирования в моем графическом классе:

updateMatrix: function(){
    //So far it is the group which is being rotated

    if (this.group) {

        if(!this.curr_matrix){
            this.curr_matrix = this.initial_matrix;
        }
        this.group.setTransform([
            this.m.rotateAt(this.rotation, this.stage_w_2, this.stage_h_2),
            this.m.scaleAt(this.scaling, this.stage_w_2, this.stage_h_2),
            this.curr_matrix
        ]);

        //this.group.setTransform([
        //  this.m.rotateAt(this.rotation, mid_x, mid_y),
        //  this.m.scaleAt(this.scaling, mid_x, mid_y),
        //  this.initial_matrix]);
    }
},
reposition: function(){
    mtx = this.group._getRealMatrix();
    this.curr_matrix = this.m.translate(mtx.dx, mtx.dy);
},

Жизнь снова денди. Спасибо Евгений за предложения.

person droid001    schedule 12.01.2010