canvas模拟圆盘划痕

来源:互联网 发布:pc蛋蛋牛人28算法 编辑:程序博客网 时间:2024/04/27 13:38

最近接了个模拟划痕的项目:
两个有接触的圆盘顺着逆时针运动,此时若下方的圆盘有凸起,那么会在上面的圆盘上留下怎样的划痕。
参数不同,结果不同,:
其中一种划痕效果
计算(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)];    }