canvas模拟圆盘划痕

最近接了个模拟划痕的项目:
两个有接触的圆盘顺着逆时针运动,此时若下方的圆盘有凸起,那么会在上面的圆盘上留下怎样的划痕。
参数不同,结果不同,:
其中一种划痕效果
计算(x,y)的值用到了大量三角函数,许久不用,通通还回去了=_=,
至于绘制直线则是最简单的canvas,我之前没有系统的看过这块,这次也算学习了。

var query=(function (name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
            var r = window.location.search.substr(1).match(reg);
            if (r != null) return unescape(r[2]); return '800|600|75';
        })('v');
        window.LS= null;
    window.LS = {
    'pad': +query.split('|')[0],
    'wafer': +query.split('|')[1],
    'e': +query.split('|')[2]
    }

    var rule = {
        'rule0': [[6], 'Awesome! You\'re an expert at wafer thinning process!', 'pass'],
        'rule1': [[2, 5], 'Oops! You crack my die!', 'fail'],
        'rule2': [[2, 5], 'Oops! You crack my die!', 'fail'],
        'rule3': [[1], 'Oops! You burn my wafer!', 'fail'],
        'rule4': [[1, 3], 'Oops! You burn my wafer!', 'fail'],
        'rule5': [[1, 3, 4], 'Oops! You burn my wafer!', 'fail'],
        'rule6': [[1, 2, 3, 5], 'You burn my wafer and crack my die!', 'fail']
    }

    var times = 2, ctx, R = 225 * times, //pad 半径
        r = 150 * times, //wafer半径
        e = LS.e * times, //圆心距
        w1 = LS.pad, //pad 转速
        w2 = LS.wafer, //wafer转速
        point;
    w1 = (w1 * 2 * Math.PI) / 60; //pad 弧度
    w2 = (w2 * 2 * Math.PI) / 60; //wafer弧度
    Ri_arr = (function () {
        arr = []; for (i = e; i < R; i = i + 5*times) { arr.push(i); }; return arr;
    })(), //线长集合
    //Ri_arr = [200,250,300,350,400];
        Ri_angle = [],
        Ri_arr_len = Ri_arr.length, //点数目
        ctx_arr = [], //划痕集合
         origin = [r-(e-(R-r)), r], //原点

         moveTo = [], //当前点集合


        cols = (function () { arr = []; for (i = 0; i < Ri_arr.length; i++) { arr.push('rgba(0,0,255,0.4)'); }; return arr; })();        //颜色集合
    

    period = 600;

    ///
    function ret_rule(a,b,c) {
        //        Rule 1    e=75, W1/W2 不等于整笔比,W1> =1200            6   Awesome! You're an expert at wafer thinning process!
        //Rule 2    e=75, W1/W2 不等于整笔比,W1<1200          2,5 Oops! You crack my die!
        //Rule 3    e=75, W1/W2 等于整数比, any W1           2,5 Oops! You crack my die!
        //Rule 4    e=80,85,90, W1/W2 不等于整数比, W1<1100,          1;  Oops! You burn my wafer!
        //Rule 5    e=80,85,90, W1/W2 不等于整数比, 1100<=W1=<1300,           1;3;    Oops! You burn my wafer!
        //Rule 6    e=80,85,90, W1/W2 不等于整数比, W1>1300           1,3,4   Oops! You burn my wafer!
        //Rule 7    e=80,85,90;  W1/W2 等于整数比, any W1            1,2,3,5 Oops! You burn my wafer and crack my die!

        var rule_index = 0;
        if ((c==75)&&(!!(a % b)) && (a >= 1200)) {rule_index = 0; };
        if ((c == 75) && (!!(a % b)) && (a < 1200)) { rule_index = 1; };
        if ((c == 75) && (!(a % b))) { rule_index = 2; };
        if ((c == 80 || c == 85 || c == 90) && (!!(a % b)) && (a < 1100)) { rule_index = 3; };
        if ((c == 80 || c == 85 || c == 90) && (!!(a % b)) && (a >= 1100) && (a <= 1300)) { rule_index = 4; };
        if ((c == 80 || c == 85 || c == 90) && (!!(a % b))&&(a > 1300)) { rule_index = 5; };
        if ((c == 80 || c == 85 || c == 90) && (!(a % b))) { rule_index = 5; };
        return rule_index;
    }
    window.onload = function () {
        $('.dash>b').eq(0).html(LS.pad);
        $('.dash>b').eq(1).html(LS.wafer);
        $('.dash>b').eq(2).html(LS.e);
        $('.container').height($(window).height());
        $('#myCanvas').attr("width", r * 2);

        $('#myCanvas').attr("height", r * 2);

        //
        var ind = ret_rule(LS.pad, LS.wafer, LS.e);
        for (i = 0; i < rule['rule' + ind][0].length; i++) {
            $('.img_p').eq(i).find('img').attr('src', 'doc/list/' + (i + 1) + '.png');
        }
        var dd = new Date();
        var nn=dd.getFullYear()+' '+('0'+(dd.getMonth()+1)).slice(-2)+' '+('0'+dd.getDate()).slice(-2);
        if (rule['rule' + ind][2] === 'fail') {
            $('.img_box').addClass('issue');
            $('.img_p').last().html('<span class=\'yinzhang yzfail\'>YET TO OPTIMIZE</span>')
        } else {
            $('.img_p').last().html('<span class=\'yinzhang yzpass\'>PASS</span>')
          };
        $('.img_box td[colspan] h4').html(rule['rule' + ind][1]);
        //
        ctxcyc = document.getElementById('myCanvas').getContext('2d');
        ctxcyc.beginPath();

        ctxcyc.strokeStyle = 'rgba(0,0,225,1)';
        ctxcyc.arc(150 * times, 150 * times, 150 * times, 0, 2 * Math.PI);
        ctxcyc.stroke();
        ctxcyc.closePath();
        for (i = 0; i < Ri_arr_len; i++) {
            ctx_arr.push(document.getElementById('myCanvas').getContext('2d'));
            Ri_angle.push(Ret_angle(Ri_arr[i]));
        }

        for (arrs in ctx_arr) {

            var arr = Wix(Ri_arr[arrs], Ri_angle[arrs], w1, w2, 1 / 1000);
            moveTo.push([origin[0] - arr[0], origin[1] + arr[1]]);



        }


    }
    var precent = 0.0;
    function exp() {
        $('.previous').hide();

        for (i = 0; i < period; i++) {

            (function (a, x, y) {
                setTimeout(function () {
                    precent = a * 100 / (period - 1);
                    $('.dash>i').eq(0).html(precent.toFixed(2));
                    $('.bar').width(precent + '%');

                    (a > 2) && (moveTo = moveTo.slice(0 - Ri_arr_len));
                    if (a == period - 1) {
                        $('.dash').slideUp(1300);
                        $("#myCanvas,.shade").animate({ left: "350px" }, 1500, function () {

                            $(".img_box").slideDown(1200, function () {

                            });
                        });

                    };
                    for (x in y) {

                        var arr = Wix(Ri_arr[x], Ri_angle[x], w1, w2, a / 1000);
                        // (point === arr[0].toFixed(6)) && console.log(a);
                        //if (Math.pow(origin[0] - arr[0], 2) + Math.pow(origin[1] + arr[1], 2) < Math.pow(r, 2)) {
                        moveTo.push([origin[0] - arr[0], origin[1] + arr[1]]);
                        //}
                        //   if (Math.pow(arr[0], 2) + Math.pow(arr[1], 2) < Math.pow(r, 2)) {

                        y[x].beginPath();
                        y[x].strokeStyle = cols[x];

                        y[x].moveTo(moveTo[x][0], moveTo[x][1]);
                        y[x].lineTo(origin[0] - arr[0], origin[1] + arr[1]);
                        y[x].stroke();
                        y[x].closePath();


                        // }


                    }



                }, a * 50)

            })(i, arrs, ctx_arr)

        }


    }
    function Ret_angle(Ri) {
        return Math.PI - Math.acos((Math.pow(Ri, 2) + Math.pow(e, 2) - Math.pow(r, 2)) / (2 * e * Ri));
    }
    function Wix(Ri, Riang, w1, w2, t) {

        return [Ri * Math.cos(Riang + w1 * t - w2 * t) + e * Math.cos(w2 * t), Ri * Math.sin(Riang + w1 * t - w2 * t) - e * Math.sin(w2 * t)];
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值