Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Matrix Transform так же как в флеше (http://www.flasher.ru/forum/showthread.php?t=83105)

G.W.M 27.07.2006 17:10

Matrix Transform так же как в флеше
 
в флеше есть Align&Info&Transform так вот в Trasnform есть много хороших параметров как мне их вычислит имея matrix обекта?

etc 27.07.2006 19:04

Читаем про .c и .d параметры в хелпе.

G.W.M 27.07.2006 19:34

а ты возми и попробуй.
недостаточна проста исползавать .c .d нужна как то еще с шириной и высотой вычислять я уже давно спрашивал как узнать угол разворота объекта с matrix так некто и не ответил...

вот тут я использую matrix и так не нашол ответа...
перепробовал немало возможных вариантов

http://www40.brinkster.com/ninja4ere...tor/index.html

styx 27.07.2006 19:38

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

etc 27.07.2006 19:43

styx, у Iv-а есть SkewedMovieClip, где нормальные _xskew, _yskew

Код:

/*
© 2002 - 2004, Ivan Dembicki, ivan@dembicki.org, dembicki@narod.ru
please check updates: http://www.dembicki.org

SkewedMovieClip class
version 1.0
last update: October 2, 2005

Usage example is below the class code.
*/
import flash.geom.Transform;
import flash.geom.Point;
class org.dembicki.SkewedMovieClip extends MovieClip {
        private var skew_transformation_center:Object;
        function SkewedMovieClip() {
                this.setSkewTransformationCenter();
        }
        public function setSkewTransformationCenter(x, y):Object {
                var point = new flash.geom.Transform(this).matrix.deltaTransformPoint(new flash.geom.Point(x || 0, y || 0));
                this.skew_transformation_center = {x:x || 0, y:y || 0, xbase:this._x+point.x, ybase:this._y+point.y};
                return this.skew_transformation_center;
        }
        public function removeSkew() {
                var trans = new flash.geom.Transform(this);
                var matrix = trans.matrix;
                matrix.a = matrix.d=1;
                matrix.b = matrix.c=0;
                trans.matrix = matrix;
                if (this.skew_transformation_center) {
                        this.applySkewTransformationCenter();
                        delete this.skew_transformation_center;
                }
        }
        public function setSkew(xskew, yskew) {
                var trans = new flash.geom.Transform(this);
                var matrix = trans.matrix;
                matrix.a = isNaN(yskew) ? matrix.a : Math.cos(yskew);
                matrix.b = isNaN(yskew) ? matrix.b : Math.sin(yskew);
                matrix.c = isNaN(xskew) ? matrix.c : -Math.sin(xskew);
                matrix.d = isNaN(xskew) ? matrix.d : Math.cos(xskew);
                trans.matrix = matrix;
                this.applySkewTransformationCenter();
        }
        // _xskew
        public function get _xskew():Number {
                var matrix = new flash.geom.Transform(this).matrix;
                return Math.acos(matrix.d)*(matrix.c>0 ? -1 : 1);
        }
        public function set _xskew(xskew:Number) {
                if (!this.skew_transformation_center) {
                        this.setSkewTransformationCenter();
                }
                var trans = new flash.geom.Transform(this);
                var matrix = trans.matrix;
                matrix.c = -Math.sin(xskew);
                matrix.d = Math.cos(xskew);
                trans.matrix = matrix;
                this.applySkewTransformationCenter();
        }
        // _yskew
        public function get _yskew():Number {
                var matrix = new flash.geom.Transform(this).matrix;
                return Math.acos(matrix.a)*(matrix.b>0 ? 1 : -1);
        }
        public function set _yskew(yskew:Number) {
                if (!this.skew_transformation_center) {
                        this.setSkewTransformationCenter();
                }
                var trans = new flash.geom.Transform(this);
                var matrix = trans.matrix;
                matrix.a = Math.cos(yskew);
                matrix.b = Math.sin(yskew);
                trans.matrix = matrix;
                this.applySkewTransformationCenter();
        }
        // PRIVATE
        private function applySkewTransformationCenter() {
                var obj = this.skew_transformation_center;
                var trans = new flash.geom.Transform(this);
                var matrix = trans.matrix;
                var pt = matrix.deltaTransformPoint(new flash.geom.Point(obj.x, obj.y));
                matrix.tx = obj.xbase-pt.x;
                matrix.ty = obj.ybase-pt.y;
                trans.matrix = matrix;
        }
}
// USAGE EXAMPLE
/*
import org.dembicki.SkewedMovieClip;
this.createEmptyMovieClip("skewed_mc", 0);
// set inheritance
this.skewed_mc.__proto__ = org.dembicki.SkewedMovieClip.prototype;
// triangle drawing
this.skewed_mc.beginFill(0, 90);
this.skewed_mc.lineTo(100, 0);
this.skewed_mc.lineTo(100, 100);
this.skewed_mc.endFill();
// pozition
this.skewed_mc._x = 200;
this.skewed_mc._y = 100;
// set transformation center sight
this.skewed_mc.createEmptyMovieClip("pt_center_mc", 0);
this.skewed_mc.pt_center_mc.lineStyle(0, 0xFF00FF, 100);
this.skewed_mc.pt_center_mc.moveTo(-10, 0);
this.skewed_mc.pt_center_mc.lineTo(10, 0);
this.skewed_mc.pt_center_mc.moveTo(0, -10);
this.skewed_mc.pt_center_mc.lineTo(0, 10);
// set skew animation
this.setEnterFrame = function() {
        var step_angle = 1;
        var step = step_angle*(Math.PI/180);
        this.skewed_mc.onEnterFrame = function() {
                this._yskew += step;
                this._xskew += step*.5;
        };
};
// set change transformation senter
this.skewed_mc.onMouseUp = function() {
        if (!this.enterFrame) {
                this._parent.setEnterFrame();
        }
        this.setSkewTransformationCenter(this._xmouse, this._ymouse);
        this.pt_center_mc._x = this._xmouse;
        this.pt_center_mc._y = this._ymouse;
};
// remove skew
Key.addListener(this);
this.onKeyUp = function() {
        if (Key.getCode() == Key.SPACE) {
                delete this.skewed_mc.onEnterFrame;
                this.skewed_mc.removeSkew();
        }
};
*/

Как видно, задача вполне решаемая в общем случае.

G.W.M 27.07.2006 21:22

большое спасибо за код сейчас буду разберется...

G.W.M 27.07.2006 21:25

еще один вопрос
ест concatenatedMatrix касторы как localToGlobal
а вот мне нужна globalToLocal к Matrix...
...
спрашивал не раз но так некто и не ответил...

G.W.M 27.07.2006 22:59

всо хорошо и красиво с этим кодам но до меня так и не дошло как можна добиться параметром такие же как показывает флеш в info

D12 27.07.2006 23:13

http://www.senocular.com/flash/tutor...ansformmatrix/

P.S. 2G.W.M Незабывай расти =)

G.W.M 27.07.2006 23:24

D12 спасибо я с это во tutorial и начинать ....
я там и научился как работат с matrix и про
concatenatedMatrix но я так и неврубился ...

возьми заделай квадрат в flash по крути его поиграйся с skew а потом попробуй вычислит таки еже параметры что показывает флеш в Info


Часовой пояс GMT +4, время: 16:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.