神奇的阿基米德螺线

今天在读数学史,正巧读到阿基米德螺线,于是写了一段js代码,生成螺线。更多的有趣内容请参考这篇文章

代码如下(需要jquery和d3):

HTML

<div id="chart"></div>

CSS

body {
background-color:#000000;
}

JS

function drawCircile(pc, r, container) {
    var circle = container.append("circle").attr("cx", pc.x).attr("cy", pc.y).attr("r", r)
        .attr("stroke", "#fa6900").attr("stroke-width", 1).attr("fill", "none");
    return circle;

}

function drawLine(p1, p2, c, isDash) {
    var line = c.append("line").attr("x1", p1.x).attr("y1", p1.y)
        .attr("x2", p2.x).attr("y2", p2.y)
        .style("stroke", "#ccc").style("stroke-width", 1);
    if (isDash) {
        line.style("stroke-dasharray", "5,5");
    }
    return line;
}

$(function () {
    var center = {x: 300, y :300};
    var l = 250;
    var a = 0, b = 0, p0, p1, line;
    var v = 0.3; //直线移动速度
    var f = 360; //转动速度 

    var root = d3.select("#chart").append("svg").append("g");
    drawCircile(center,3,root)

    var timer = setInterval(function(){
        a = a + Math.PI / f;
        b = b + v;
        p0 = {x:center.x+ l * Math.sin(a), y:center.y - l * Math.cos(a) };
        p1 = {x:center.x + b * Math.sin(a), y:center.y - b * Math.cos(a) };
        drawCircile(p1,1,root)

        if( b > l ) {
            clearInterval(timer);
        } else {
            if(!line) {
                line =  drawLine(center, p0, root);    
            } else {
                line.transition().duration(10).attr("x2",p0.x).attr("y2",p0.y);
            } 
        }
    },10);
});

以上代码会生成以下的图形:

134553_T7Li_1450051.png

改变v和f的值分别改变点在直线上的移动过速度和直线转动的角速度,会得到不同的结果。

我拿给我还在读一年级的女儿看,她很是入迷,不断要求我修改参数,结果得到许多有趣的图形,大家可以通过这个链接自己试试看。

f=2.5 海星

135013_Hxvd_1450051.png

f=3 雪花

135128_NOT1_1450051.png

f=1.414

135308_YSSW_1450051.png

f = 0.618

135442_10uO_1450051.png

f=8.8

135613_NiIi_1450051.png

f = 12.12

135714_VWJo_1450051.png

更多的结果,大家可以自己去探索。

感叹于数学的神奇和美丽,感叹于小孩子的探索精神, 感叹于计算机和编程使得数学的探索变得简单和有趣!


转载于:https://my.oschina.net/taogang/blog/268505

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值