找回密码
 立即注册
首页 业界区 业界 请允许我说:数学是如此美丽!

请允许我说:数学是如此美丽!

锺冰洁 2025-5-29 15:32:55
工作一段时间之后,即使做的还是编码的工作,但是几乎已经不和数学打交道了,基本都是和dom在打交道。所以基本不再有可能发现数学的美丽之处了。。(其实说这句话心里也是虚虚的。当时上学的时候高数也是烂的一沓糊涂,唉,往事不堪回首)。
  再加上前一段时间一位同仁说:js玩3D能玩出什么呢?不过浪费时间而已...是的,我是同意这句话的,客户端的js的表现基本只能通过操作dom元素来实现。在document文档里面,你怎么去制造视井深度,哪怕是伪造也会有一堆困难,不攻自破。
  所以,除了html5支持的canvas画布外,几乎是不可能通过一两个元素就构建出我们所想的视井深度的。哪怕是我们想建一个最简单的基于球体的模型,都不得不通过像素模拟的思想来实现。可是如果是像素模拟,可能吗?等于说需要成千上万个元素才能模拟一个稍微像样的球体模型。。。浏览器表示鸭梨很大很大,浏览器说如果要这样,你还是杀了我吧。
  所以,js玩3d,或许真的是浪费时间。。。
  可是,请允许我去稍微的浪费时间,因为我还是放不下数学的美丽。哪怕是简单的三角函数,二次函数,三次函数。。。
注:以下所有例子都较为耗资源。【纵使我不漂亮,可是我也尽力了】
mathematic is so beautifull!  

  其实这也只是自己闲暇时做的一点自娱自乐。基本没有任何实用性,因为仅仅是上面的那点图案,浏览器已经要承担每次变换500个元素的负担。IE8以下的js引擎就已经显得相当吃力了。
        可是我依然把它放上来的原因是我不得不感叹数学的美丽,因为在我它没运行之前,我自己都完全想不到会如此美丽。因为我最开始只是想基于一个最简单的球模型玩一玩的。
【最开始的目的应该像下面的样子】
mathematic is so beautifull!  

变化的效果大家可以自定义,修改调用的接口参数就好了。如:

    BeautifullMath.init(500, function(r){
        return r*r;
    }); 
第一个参数为生成的dom元素的个数,第二个参数为一个function,可以自定义一些函数曲线。比如上面的二次函数会表现为下面的样子:
mathematic is so beautifull!  

  感兴趣的同学可以自行修改参数来看看不同的效果:比如:
    BeautifullMath.init(500, function(r){
        return Math.cos(r)*r;
    });会是下面的样子:
mathematic is so beautifull!  

 比如:

    BeautifullMath.init(500, function(r){
        return Math.sin(r)-r+r*Math.cos(r*r)+.1
    }); 
mathematic is so beautifull!

 最后可以留下源码:

1.gif
2.gif
代码var BeautifullMath = function () {
    var obj = [], xm = 0, ym = 0, axe = 0, aye = 0, parts = 500, scr, txe, tye, nw, nh;
    var addEvent = function (o, e, f) {
        window.addEventListener ? o.addEventListener(e, f, false) : o.attachEvent('on'+e, function(){f.call(e)})
    }
    var resize = function () {
        nw = scr.offsetWidth * .5;
        nh = scr.offsetHeight * .5;
    }
    var init = function (n, f) {
        if(!!n) parts = n;
        scr = document.getElementById('screen');
        addEvent(document, 'mousemove', function(e){
            e = e || window.event;
            xm = e.clientX;
            ym = e.clientY;
        });
        resize();
        addEvent(window, 'resize', resize);
        __init(f);
        setInterval(run, 16);
    }
    var __init = function (f) {
        for (var i=0; i= 0 && y >=0 && x 
您需要登录后才可以回帖 登录 | 立即注册