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)]; }
阅读全文
0 0
- canvas模拟圆盘划痕
- canvas 圆盘抽奖应用
- HTML5 Canvas圆盘抽奖应用
- 圆盘
- 圆盘
- 模拟大圆盘旋转抽奖的功能Demo
- 一道划痕
- canvas模拟简易钟表
- HTML5 canvas 模拟吃豆子
- canvas 模拟的公转自转
- 模拟触摸方式滚动canvas
- Canvas模拟地球,月球公转
- javascript canvas 模拟mac最小化
- 2017.2.12【初中部 GDKOI】模拟赛B组 T1:圆盘染色
- 修复手机屏幕的划痕
- 首次消费划痕险
- opencv检测划痕
- 圆盘问题
- Redis 源码学习之事件驱动
- IDEA 2017破解补丁方法
- web前端总结
- Java 函数调用是传值还是传引用? 从字节码角度来看看!
- iOS 打包 "Found an unexpected Mach-O header code: 0x72613c21"报错
- canvas模拟圆盘划痕
- shell中的变量和别名
- 图片剪裁
- Java volatile 原理解析
- 22、不一样的C++系列--函数调用操作符的重载
- ListView的用法
- sscanf与sprint函数的用法
- C/C++ 中Static
- 关于ubuntu卸载python反思