使用lufylegend引擎实现图片变形

来源:互联网 发布:c语言源代码及注解 编辑:程序博客网 时间:2024/06/13 10:07
/** * Created by syl on 2016/7/27 0027. */var BitmapDataBezierMeshAlgorithm = (function(){    function BitmapDataBezierMeshAlgorithm($colCount, $rowCount)    {        var s = this;        LExtends(s, LObject, []);        s.colCount = $colCount || 1;        s.rowCount = $rowCount || 1;        s.tr = new TransformTrianglesResult();        s.cr2point = {};        s.buildMesh();        s.subdivisionU = 4;        s.subdivisionV = 4;        s.bze = new Bez();    }    var p = {        result:function()        {            var s = this;            var ut,vt,col,row,local_ut,local_vt;            var mesh_tl,mesh_tr,mesh_bl,mesh_br;            var lp = new LPoint(0,0);            var rp = new LPoint(0,0);            var mp = new LPoint(0,0);            s.tr.uvt = [];            s.tr.vectices = [];            s.tr.indices = [];            for(i=0;i<= s.subdivisionV;i++){                ut = i/s.subdivisionV;                for(j=0;j<= s.subdivisionU;j++){                    vt = j/s.subdivisionU;                    col = parseInt(ut / (1 / s.colCount));                    row = parseInt(vt / (1 / s.rowCount));                    col = col == s.colCount ? col - 1 : col;                    row = row == s.rowCount ? row - 1 : row;                    local_ut = (ut - col / s.colCount) / (1 / s.colCount);                    local_vt = (vt - row / s.rowCount) / (1 / s.rowCount);                    mesh_tl = s.pointAt(col, row);                    mesh_tr = s.pointAt(col + 1, row);                    mesh_bl = s.pointAt(col, row + 1);                    mesh_br = s.pointAt(col + 1, row + 1);                    lp.x = s.bze.cubicTo(mesh_tl.x,mesh_tl.bottomControl.x, mesh_bl.topControl.x, mesh_bl.x,local_vt);                    lp.y = s.bze.cubicTo(mesh_tl.y,mesh_tl.bottomControl.y, mesh_bl.topControl.y, mesh_bl.y,local_vt);                    rp.x = s.bze.cubicTo(mesh_tr.x,mesh_tr.bottomControl.x, mesh_br.topControl.x, mesh_br.x,local_vt);                    rp.y = s.bze.cubicTo(mesh_tr.y,mesh_tr.bottomControl.y, mesh_br.topControl.y, mesh_br.y,local_vt);                    mp.x = s.bze.cubicTo(lp.x,(1 - local_vt) * mesh_tl.rightControl.x + local_vt * mesh_bl.rightControl.x,                                (1 - local_vt) * mesh_tr.leftControl.x + local_vt * mesh_br.leftControl.x, rp.x,local_ut);                    mp.y = s.bze.cubicTo(lp.y,(1 - local_vt) * mesh_tl.rightControl.y + local_vt * mesh_bl.rightControl.y,                                (1 - local_vt) * mesh_tr.leftControl.y + local_vt * mesh_br.leftControl.y, rp.y,local_ut);                    s.tr.vectices.push(mp.x,mp.y);                    s.tr.uvt.push(ut,vt);                }            }            for(i = 0; i < s.subdivisionV; i++)            {                for(j = 0; j < s.subdivisionU; j++)                {                    s.tr.indices.push(i*(s.subdivisionU+1)+j,(i+1)*(s.subdivisionU+1)+j,i*(s.subdivisionU+1)+j+1);                    s.tr.indices.push((i+1)*(s.subdivisionU+1)+j,i*(s.subdivisionU+1)+j+1,(i+1)*(s.subdivisionU+1)+j+1);                }            }        },        buildMesh:function()        {            var s = this;            var i;            var j;            var cr;            var uva;            var ilen = s.colCount;            var jlen = s.rowCount;            for(i = 0; i <= ilen; i++) {                for(j = 0; j <= jlen; j++) {                    cr = s.toCR(i, j);                    uva = new UVAnchorPoint();                    uva.col = i;                    uva.row = j;                    uva.leftControl.enabled = i > 0;                    uva.rightControl.enabled = i < ilen;                    uva.topControl.enabled = j > 0;                    uva.bottomControl.enabled = j < jlen;                    s.cr2point[cr] = uva;                }            }        },        toCR:function(col, row)        {            var s = this;            return col+","+row;        },        pointAt:function(col, row)        {            var s = this;            if(col < 0 || col > s.colCount || row < 0 || row > s.rowCount)                return null;            var cr = s.toCR(col, row);            return s.cr2point[cr];        },        applyResult:function(target, container)        {            var s = this;            container.graphics.clear();            container.graphics.beginBitmapFill(target);            container.graphics.drawTriangles(s.tr.vectices, s.tr.indices, s.tr.uvt,.5);        }    }    for (var k in p) {        BitmapDataBezierMeshAlgorithm.prototype[k] = p[k];    }    return BitmapDataBezierMeshAlgorithm;})();
0 0
原创粉丝点击