使用lufylegend引擎实现图片变形

/**
 * 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值