【初始编辑】2013/4/21 14:55
【更新 2013/5/1 14:36 】
更新日志:加上坐标轴的箭头,加了两个函数(其实这个不算更新吧。。)。
优化了一下绘制方法:修改了清除画布的方法,极大提高效率。
自定义函数的功能还是没有修好。
代码中已经包含了一部分下次更新的功能:差不多是坐标轴的单位线
昨天我翻出来了以前一时兴起做的一个渣渣函数图绘制的代码,然后又一时兴起想把它改好一点,于是就出现了今天的这篇文章。
【我可是冒着期中考试前不复习的风险来做这个的】
【用chrome浏览效果更佳,其他浏览器可能会有卡顿现象】
现在已经做成了这个样子
源地址在这里,佳佳实验室的地址在这里,代码在文章最下面,自带注释
介绍,这是一个基于x坐标进行绘图[至少现在还是这样]的东东。
已经完成的功能:
画图
用鼠标拖动
滚轮放大缩小
回到中心
然后有一个功能”自定义函数”虽然显示在那里了,但还是不可以用的,有些错误还没时间解决。
现在的用法是打开源代码修改里面的函数数组,demo里的函数是这些
/*格式:函数,颜色,线宽,是否显示*/ functionlist[0]=["3*x+2","#66ccff",1,true]; functionlist[1]=["x*x+2*x-7","#123456",1,true]; functionlist[2]=["Math.tan(x)","#654321",1,true]; functionlist[3]=["Math.sin(x)","rgba(221,123,159,0.5)",20,true]; functionlist[4]=["1","#66ccff",1,true];
从这个代码里可以看出其实还有很多功能还没有做出来[上学的孩子苦逼啊]。
在以后的某个时间里我可能又会突然兴起在升级一下,现在就做到这样了,毕竟作为一个苦逼又たま的大天朝学生没有那么多时间来做这个,况且还有iti要做。
版权所有,转载和修改请注明出处。
<html> <meta charset="utf-8"> <head> <script src="jquery.js"> </script> <script> /*这里摆了一些图片的datauri,为了防止太多零碎文件就都放在这里了*/ icons = new Object; icons.home = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtVJREFUeNq0ljtoFGEQx2/XxMRoIlGJRNQYHxERBBGLKCj4QEERrQRJpSAIWvgoJNY2NmlsFUs70cpHLRERtRCjoBEx+MCYxESTu0vu1v+E3yeTy62bxoUfu7f77fxn5puZvShJktz/PmqyFjzq7LFTJOaJWJREWUx7t7/3fKZI9K9InECz2CE2iFfiuRhBMJclliqCgB3zzYa4KtaKt+KOuM/1eIgqTSzOiNSerxTHxDrS1CHOiSuIN2fZmRWJi8D2oEWcxKgZmxQTYgrD78RNcU8MpkU0Q6QiRevFCXFcrOLeCOcYsQbxRlwXd8UQ0c4Q+iviBKziNolL4ohY6O4HjyLO41x/FbfEbfFRFL1QXCFQLzaLM+IoArWu1GOIwCJZINrFRWGGdoq6GX3iytQWbxWnxT7ybyXaxPPKMiy7nsmx7gCOdouXIaKYvC3G8AVxSBQwkLAwMMmme+MJ6SpRLNZPl8W2EFFIwxpxSnSKAdEndlM9L3i5FhHvgJ1/iVbRRVGY4b2iX3wwB4LIb8KzTXtC0+0Sn8UN8YN+WUYpLyeyxxjrotps/SIxKr6HaIPIAMZKCJ5lU0cQaOPeCrEEzyMqqsftTz+lbPZei59exLz4xHUd92PXeNbZh8Ww+IKxDprVV1KBTPTx3nQksSvfBMLEzbkNruO6V1wTT1ljUeedSML6Kd+Uccr4r0cs70rZXnovnrmxP4hQ5gD0cyZCoAGvCn6cI2QbuxQHhnGi6hHshj7xQk1sbpE9CWUZUlHPvRICNS4jUWokfiqLRrwtQQueh7S0ka4y/WUFsQXh2rl8fmN6pIO5ZVNgNSU7RDdvp1+svA8yShpJcVwtfWki7Tyzzt3jKq+V6PJU0BjnCfrpgfhWOecqReyFh3zLN9I7Q65UxyiGvPtdJM1F+mM0S6RMp3azLxMYnXTzKlfl7HskSf38WlPO5e/NHP4+zfr8/hFgAHQYAzPKs1QIAAAAAElFTkSuQmCC"; /*回到中心 25*25 */ icons.upjiantou = "data:image/png;base64,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"; /*上箭头 7*10 */ icons.rightjiantou = "data:image/png;base64,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"; /*右箭头 10*7 */ icons.heng5px = "data:image/bmp;base64,Qk1CAAAAAAAAAD4AAAAoAAAACQAAAAEAAAABAAEAAAAAAAQAAAATCwAAEwsAAAAAAAAAAAAAAAAAAP///wAAAAAA"; /*横着5px*/ icons.shu5px = "data:image/bmp;base64,Qk1iAAAAAAAAAD4AAAAoAAAAAQAAAAkAAAABAAEAAAAAACQAAAATCwAAEwsAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; /*竖着5px*/ upjiantouimg = new Image(); rightjiantouimg = new Image(); heng5px = new Image(); shu5px = new Image(); heng5px.src = icons.heng5px; shu5px.src = icons.shu5px; upjiantouimg.src = icons.upjiantou; rightjiantouimg.src = icons.rightjiantou; /*把图标载入image对象*/ </script> <style> body { padding: 0; margin: 0; cursor: default; } #zuobiaozhou { position: absolute; top: 0; left: 0; cursor: default; z-index: 0; } #hanshutu { position: absolute; top: 0; left: 0; cursor: default; z-index: 1; } div#control { position: fixed; right: -266px; top: 0px; height: 100%; width: 250px; background-color: rgba(129, 150, 141, 0.6); padding: 1em; overflow-x: hidden; z-index: 999; } div#home { height: 25px; width: 25px; cursor: pointer; } div.sidediv { width: 100%; color: rgb(67, 49, 162); font-size: 13px; } textarea#zidingyifunction { width: 100%; max-width: 100%; max-height: 160px; height: 160px; } </style> <script> var functionlist = new Array(); /*格式:函数,颜色,线宽,是否显示*/ functionlist[0] = ["3*x+2", "#66ccff", 1, true]; functionlist[1] = ["x*x+2*x-7", "#123456", 1, true]; functionlist[3] = ["Math.sin(x)", "rgba(221,123,159,0.5)", 10, true]; functionlist[4] = ["1", "#66ccff", 1, true]; functionlist[5] = ["Math.pow(-1,x)", "#CC33FF", 2, true]; functionlist[2] = ["Math.pow(2,x)", "#CC6633", 1, true]; functionlist[6] = ["Math.sqrt(64-x*x)", "rgb(255,204,0)", 6, true]; functionlist[7] = ["-Math.sqrt(64-x*x)", "red", 2, true]; functionlist[8] = ["Math.acos(Math.sqrt(Math.sin(x)))", "blue", 1, true]; functionlist[9] = ["x/(x*x+3*x+1)", "blue", 1, true]; </script> </head> <body> <canvas id="zuobiaozhou"> </canvas> <canvas id="hanshutu"> 如果你什么都看不到,请到 <a href="http://browsehappy.com/" title="browsehappy" target="_blank" style="color:rgb(153,153,51);text-decoration:none;"> 这里 </a> 寻找最新的浏览器~ </canvas> <div id="control"> <abbr title="回到中心"> <div id="home"> </div> </abbr> <div class="sidediv"> 自定义函数 <span style="float:right;cursor:pointer;" id="refreshzidingfun"> 刷新自定义函数 </span> <br> <textarea id="zidingyifunction"> </textarea> </div> <br> <div class="sidediv"> <span style="cursor:pointer;" id="refreshfuns"> 刷新函数 </span> <br> </div> </div> <script> /*变量名中的V觉绝大部分意思是虚拟*/ /*定义变量*/ var zuobiao$obj, pianyix = 0, pianyiy = 0, /*偏移量*/ bei = 1, /*缩放倍数*/ clickpointx = 0, clickpointy = 0, /*点击坐标*/ vzoom = new Object, /*虚拟坐标系空间函数对象*/ zuobiaocanvasobj, /*坐标轴canvas dom对象*/ zuobiaozhoudrawobj, /*坐标轴绘图上下文*/ hanshutucanvasobj, /*函数图canvas dom对象*/ hanshutudrawobj, /*函数图绘图上下文*/ windowwidth = window.innerWidth, windowheight = window.innerHeight, /*用于快速存取的整体长宽变量*/ xcenter = windowwidth / 2, /*中心坐标*/ ycenter = windowheight / 2, hanshutuurltmp, /*没有用*/ realxtmp, realytmp, /*真实坐标的临时变量*/ vxtmp, vytmp, /*虚拟坐标的临时变量*/ v1danwei, /*虚拟坐标里的一个单位的真实像素数*/ basetimestemp = 0, /*单位基数乘次计数*/ basenumber = 1, /*单位基数*/ zuobiaozhoux, zuobiaozhouy, /*坐标轴的两条轴位置*/ zuobiaoxianx, zuobiaoxiany, zuobiao$obj = $("#zuobiaozhou"), hanshu$obj = $("#hanshutu"), zuobiaocanvasobj = zuobiao$obj[0], hanshutucanvasobj = hanshu$obj[0], zuobiaozhoudrawobj = zuobiaocanvasobj.getContext("2d"), hanshutudrawobj = hanshutucanvasobj.getContext("2d"); hanshutudrawobj.fillStyle = 'rgba(255,255,255,0)'; zuobiaozhoudrawobj.fillStyle = 'rgba(255,255,255,0)'; /*虚拟坐标算法和反算法*/ //参数:虚拟位置坐标。返回值:在canvas元素里的实际坐标 vzoom.realx = function(vx) { return xcenter + pianyix + vx * 40 * bei; } vzoom.realy = function(vy) { return ycenter - pianyiy - vy * 40 * bei; } //参数:实际位置坐标。返回值:虚拟坐标 vzoom.vx = function(realx) { return (realx - xcenter - pianyix) / bei / 40; } vzoom.vy = function(realy) { return (realy - ycenter + pianyiy) / -bei / 40; } /*函数解析方法*/ var funs = new Array(); funs.refreshfuns = function() { var tmpfun for (i = 0; functionlist[i]; i++) { tmpfun = functionlist[i][0]; try { eval('funs[' + i + ']=function(x){return ' + tmpfun + ';}'); } catch(e) { console.log("第" + (i + 1) + "个函数解析失败"); continue; }; } } /*设置宽高*/ function setkuangao() { zuobiaocanvasobj.width = windowwidth; zuobiaocanvasobj.height = windowheight; hanshutucanvasobj.width = windowwidth; hanshutucanvasobj.height = windowheight; } /*画线*/ function paintline(x, y) { hanshutudrawobj.lineTo(x, y); } /*画函数图*/ function drawhanshutu() { hanshutudrawobj.clearRect(0, 0, windowwidth, windowheight); for (funnunm = 0; functionlist[funnunm]; funnunm++) { if (functionlist[funnunm][3]) { hanshutudrawobj.strokeStyle = functionlist[funnunm][1]; hanshutudrawobj.lineWidth = functionlist[funnunm][2]; hanshutudrawobj.beginPath(); for (i = 0; i < windowwidth; i++) { vxtmp = vzoom.vx(i); if (funs[funnunm](vxtmp) != Infinity) { paintline(i, vzoom.realy(funs[funnunm](vxtmp))); } else { nextpoint = vzoom.vx(i + 1); hanshutudrawobj.moveTo(i + 1, funs[funnunm](nextpoint)) } } } hanshutudrawobj.stroke(); } } /*画坐标轴*/ function drawzuobiaozhou() { zuobiaozhoudrawobj.beginPath(); zuobiaozhoudrawobj.clearRect(0, 0, windowwidth, windowheight); zuobiaozhoudrawobj.strokeStyle = "#000"; zuobiaozhoudrawobj.lineWidth = 1; realxtmp = vzoom.realx(0); realytmp = vzoom.realy(0); //console.log(realxtmp+" "+realytmp);//调试用 信息输出 /*以下都是让xy轴保持显示在显示区内*/ if (realxtmp >= windowwidth) { zuobiaozhoux = windowwidth - 0.5; } else if (realxtmp <= 0) { zuobiaozhoux = 0.5; } else { zuobiaozhoux = xcenter + pianyix; } if (realytmp <= 0) { zuobiaozhouy = 0.5; } else if (realytmp >= windowheight) { zuobiaozhouy = windowheight - 0.5; } else { zuobiaozhouy = ycenter - pianyiy; } zuobiaozhoudrawobj.moveTo(zuobiaozhoux, 0); zuobiaozhoudrawobj.lineTo(zuobiaozhoux, windowheight); zuobiaozhoudrawobj.moveTo(0, zuobiaozhouy); zuobiaozhoudrawobj.lineTo(windowwidth, zuobiaozhouy); zuobiaozhoudrawobj.drawImage(upjiantouimg, zuobiaozhoux - 3.5, 0); zuobiaozhoudrawobj.drawImage(rightjiantouimg, windowwidth - 10, zuobiaozhouy - 3.5); zuobiaoxianx = vzoom.vx(0); zuobiaoxiany = vzoom.vy(windowheight); /*for*/ zuobiaozhoudrawobj.stroke(); } /*取距离1、2、5距离最近的数*/ function getfrom125(number) { if (number <= 1) return 1; else if (number > 1 && number <= 2.5) return 2; else if (number > 2.5) return 5; } /*设置单位基数*/ function setbasenumber() { v1danwei = 50 / (vzoom.realx(1) - vzoom.realx(0)); if (v1danwei < 1) { for (; v1danwei < 1; basetimestemp++) { v1danwei *= Math.pow(10, basetimestemp); } basenumber = getfrom125(v1danwei); basenumber *= Math.pow(10, -basetimestemp); } else if (v1danwei > 10) { for (; v1danwei > 10; basetimestemp--) { v1danwei *= Math.pow(10, basetimestemp); } basenumber = getfrom125(v1danwei); basenumber *= Math.pow(10, -basetimestemp); } else { basenumber = 1; } } function refreshzidinghanshu() { localStorage.zidingyifunction = document.getElementById("zidingyifunction").value; eval(document.getElementById("zidingyifunction").value); drawhanshutu(); } function loadzidinghanshu() { if (localStorage.zidingyifunction) { eval(localStorage.zidingyifunction); document.getElementById("zidingyifunction").value = localStorage.zidingyifunction; } } /*由鼠标引发的移动事件*/ hanshu$obj.mousedown(function(event) { event.preventDefault(); clickpointx = event.clientX; clickpointy = event.clientY; /*hanshu$obj.unbind("mouseup"); hanshu$obj.unbind("mousemove");*/ hanshu$obj.mouseup(function(event) { hanshu$obj.unbind("mousemove"); hanshu$obj.unbind("mouseup"); hanshu$obj.unbind("mouseout"); }); hanshu$obj.mousemove(function(event) { event.preventDefault(); pianyix = pianyix + event.clientX - clickpointx; pianyiy = pianyiy - event.clientY + clickpointy; drawzuobiaozhou(); drawhanshutu(); clickpointx = event.clientX; clickpointy = event.clientY; }); hanshu$obj.mouseout(function() { hanshu$obj.unbind("mouseup"); hanshu$obj.unbind("mousemove"); }); }); $(window).resize(function() { /*尺寸改变的时候*/ windowwidth = window.innerWidth; /*重新计算虚拟坐标所需的宽高*/ windowheight = window.innerHeight; xcenter = windowwidth / 2; ycenter = windowheight / 2; setkuangao(); /*重新设置宽高*/ drawzuobiaozhou(); /*重画*/ drawhanshutu(); }); setkuangao(); funs.refreshfuns(); /*开始画之前先刷新一下函数列表*/ drawzuobiaozhou(); drawhanshutu(); $("#home").click(function(e) { /*回到中心*/ pianyix = pianyiy = 0; bei = 1; drawzuobiaozhou(); drawhanshutu(); }); var controlpannel = $("#control"); controlpannel.mouseenter(function(e) { controlpannel.stop().animate({ right: 0 }, "fast"); }); controlpannel.mouseleave(function(e) { controlpannel.stop().animate({ right: -266 }, "fast"); }); /*滚轮控制部分*/ var scrollFunc = function(e) { var direct = 0; e = e || window.event; var t1 = document.getElementById("wheelDelta"); var t2 = document.getElementById("detail"); var data = e.wheelDelta ? e.wheelDelta: e.detail; if (data == -3 || data == 120) { /*不知为什么firefox的数值和其他浏览器是反的。。*/ bei *= 1.1; /*按1.1倍放大*/ pianyix *= 1.1, pianyiy *= 1.1; /*同时倍增偏移量使放大中心保持在显示区中心*/ } else if (data == 3 || data == -120) { bei *= 0.9; pianyix *= 0.9, pianyiy *= 0.9; } drawzuobiaozhou(); drawhanshutu(); } if (document.addEventListener) { document.addEventListener('DOMMouseScroll', scrollFunc, false); } hanshutucanvasobj.onmousewheel = scrollFunc; /*刷新自定义函数*/ $("#refreshzidingfun").click(function(e) { refreshzidinghanshu(); }); /*刷新函数列表*/ $("#refreshfuns").click(function(e) { funs.refreshfuns(); }); /*下面都杂项函数*/ function fillicons() { document.getElementById("home").style.backgroundImage = "url(" + icons.home + ")"; } </script> <script> fillicons(); upjiantouimg.onload = function() { drawzuobiaozhou(); } rightjiantouimg.onload = function() { drawzuobiaozhou(); } </script> </body> </html>
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。