• home > theory > Mathematics > Elementary >

    女神节笛卡尔式的表白的程序实现方式

    Author:zhoulujun Date:

    秘书说女神节到了,里面程序员是如何表白的呀?有没有事啥花样。之前不是看过《隐秘的角落》笛卡尔式表白吧。于是标题党感觉刷篇文章《女神

    秘书说女神节到了,里面程序员是如何表白的呀?有没有事啥花样。之前不是看过《隐秘的角落》笛卡尔式表白吧。

    于是标题党感觉刷篇文章《女神节笛卡尔式的表白的程序实现方式》,这个故事对于痴情的迷妹应该杀伤力蛮大

    笛卡尔,西方近代哲学之父,解析几何之父,理性分析方法的奠基人,是一位深受西方人尊敬的科学家、思想家——这位沉静多思的哲学家、科学家,和英国的培根一起,共同开创了西方现代哲学的新起点:认识论转向。

    • 笛卡尔的我思故我在的命题,直接针对基督教和感觉主义认识论。

    • 贝克莱、笛卡尔等人的思想,也是西方近代唯心主义、唯物主义的来源。

    • 笛卡尔、莱布尼茨的理性主义和洛克、休谟的经验主义,才使得后来的康德写作三大批判

    • 笛卡尔的分析主义认识方法,影响深远,对于西方现代自然科学的发展,产生了巨大推动作用,如物理学、化学、生物解剖学、心理学等。

    笛卡尔的主要数学成果集中在他的“几何学”中。

    笛卡尔的思想核心是:把几何学的问题归结成代数形式的问题,用代数学的方法进行计算、证明,从而达到最终解决几何问题的目的。即是解析几何。1637年,笛卡尔发表了《几何学》,创立了直角坐标系。

    可能这些大神的爱情故事,对于大众更感兴趣。传说中的笛卡尔和公主:

    1650年,52岁却一直贫困的数学家笛卡尔在斯德哥尔摩的街头尔邂逅了18岁的瑞典公主克里斯汀。克里斯汀不仅不嫌弃笛卡尔,还和他讨论数学。之后,公主让笛卡尔进宫当自己的数学老师,两人经过相处爱上了对方。笛卡尔和公主之间相差34岁不说,两人之间还有阶级差距,国王大怒,赶走了笛卡尔,软禁了公主。回到法国的笛卡尔坚持给公主写信,但信件全都被国王拦截。

    笛卡尔在给克里斯汀寄出第十三封信后就气绝身亡了,这第十三封信内容只有短短的一个公式:r=a(1-sinθ)。公主看到后,立即明了恋人的意图,她马上着手把方程的图形画出来,看到图形,她开心极了,她知道恋人仍然爱着她,原来方程的图形是一颗心的形状。这也就是著名的“心形线”。

    心形线的平面直角坐标系方程表达式分别为 :

    x^2+y^2+a*x=a*sqrt(x^2+y^2)

    极坐标方程

    水平方向: ρ=a(1-cosθ) 或 ρ=a(1+cosθ) (a>0)

    垂直方向: ρ=a(1-sinθ) 或 ρ=a(1+sinθ) (a>0)

    笛卡尔心形爱心曲线

    如果我们用JavaScript在canvas上画出来,就需要算出x、y坐标,然后再canvas画出来

    x = 2r(sinθ-.5*sin(2θ))

    y = 2r(cosθ-.5*cos(2θ))

    关键代码如下:

    const x=dimension*(Math.sin(radians)-.5*Math.sin(2*radians))
    const y=dimension*(Math.cos(radians)-.5*Math.cos(2*radians))

    整体绘制如下:

    const canvas = document.getElementById("canvas");
    const context = canvas.getContext("2d");
    //线条设置
    context.strokeStyle = "red";
    context.lineWidth = 2;
    //创建坐标
    function descartesArr(dimension,rx,ry){
      //线条数组
      const points = [];
      for(let degrees =0;degrees<361;degrees++){
        const radians = degrees * (Math.PI/180);
        const x=dimension*(Math.sin(radians)-.5*Math.sin(2*radians))
        const y=dimension*(Math.cos(radians)-.5*Math.cos(2*radians))
        points.push([x+rx,y+ry])
      }
      return points
    
    }
    function paint(points) {
      context.beginPath();
      let first = points.unshift()
      context.moveTo(first[0], first[1]);
      points.forEach((item)=>{
        context.lineTo(item[0], item[1]);
        context.moveTo(item[0],item[1]);
      })
      context.closePath();
      context.stroke();
    }
    paint(descartesArr(30, 100, 100));
    function heartShape(r, dx, dy) {
      //r:大小;dx:水平偏移;dy:垂直偏移;c:颜色
      var m, n, x, y, i;
      let arr = [];
      for (i = 0; i <= 7.9; i += 0.04) {
        m = i;
        n =
          -r *
          ((Math.sin(i) * Math.sqrt(Math.abs(Math.cos(i)))) / (Math.sin(i) + 1.4) -
            2 * Math.sin(i) +
            2);
        x = n * Math.cos(m) + dx;
        y = n * Math.sin(m) + dy;
        arr.push([x,y]);
      }
      return arr;
    }

    其实,这个故事并不可靠。1649 年10 月4日应瑞典女王克里斯蒂娜邀请笛卡尔是来瑞典做她的老师,但这个女王很可能是个女同志……

    回归理性:

    r=a(1-sinθ),这是个极坐标方程在17世纪还是新鲜玩意儿,而三角函数的定义以及sin、cos这些符号是欧拉在十八世纪的创举,从时间线来说并不科学。

    但是不管这么多,没有人能拒绝心形曲线的浪漫,除了广为流传的r=a(1-sinθ),还有很多种曲线也是心形的形状。

    心脏线亦为蚶线的一种。在曼德博集合正中间的图形便是一个心脏线。心脏线的英文名称“Cardioid”是 de Castillon 在1741年的《Philosophical Transactions of the Royal Society》发表的;意为“像心脏的”。

    心形曲线函数

    比如这个,绘制的就更好

    function heartShape(r, dx, dy) {
      var m, n, x, y, i;
      let arr = [];
      for (i = 0; i <= 7.9; i += 0.04) {
        m = i;
        n = -r * ((Math.sin(i) * Math.sqrt(Math.abs(Math.cos(i)))) / (Math.sin(i) + 1.4) - 2 * Math.sin(i) + 2);
        x = n * Math.cos(m) + dx;
        y = n * Math.sin(m) + dy;
        arr.push([x,y]);
      }
      return arr;
    }

    其实就是画 个心 ,感冒非得搞这么复杂?

    贝塞尔曲线不好使?直接 Adobe Illustrator  画个曲线,然后把里面的贝塞尔曲线点扣出来不就行了

    比如:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes

    function draw(canvas,ctx) {
      //三次贝塞尔曲线
      ctx.beginPath();
      ctx.moveTo(75, 40);
      ctx.bezierCurveTo(75, 37, 70, 25, 50, 25);
      ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
      ctx.bezierCurveTo(20, 80, 40, 102, 75, 120);
      ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5);
      ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25);
      ctx.bezierCurveTo(85, 25, 75, 37, 75, 40);
      context.closePath();
      context.stroke();
      // ctx.fill();
    }

    当然,更简单的,css也行拉

    .爱心图示意图

    其实就是一个矩形,一边圆角,然后旋转,就行

    .heart {
        position: relative;
        width: 100px;
        height: 90px;
        margin: 10px;
    }
    .heart:before,
    .heart:after {
        position: absolute;
        content: "";
        left: 50px;
        top: 0;
        width: 50px;
        height: 80px;
        background: red;
        border-radius: 50px 50px 0 0;
        transform: rotate(-45deg);
        transform-origin: 0 100%;
    }
    .heart:after {
        left: 0;
        transform: rotate(45deg);
        transform-origin: 100% 100%;
    }

    这个实现最方便。

    其实,实现的方式太多:http://www.mathematische-basteleien.de/heart.htm

    以上代码的demo地址:https://www.zhoulujun.cn/demo/heart.html

    其实,这个也是只是标题党而已,盗图解说下

    理工男数学家的爱情表白

    其实,这个就够了

    爱心手势

    愿女神节,每位女神都有一个好的家庭,好的父亲、子女、爱人……

    多给女神一点关爱,一个问候,一声祝福,放在心中就足够

    其实本文只是个标题党,目的在于提醒广大程序员,关爱女神!




    转载本站文章《女神节笛卡尔式的表白的程序实现方式》,
    请注明出处:https://www.zhoulujun.cn/html/theory/Mathematics/math/2021_0306_8621.html