巴恩斯利蕨数学公式及源码实现——JavaScript版

news2024/9/23 19:17:54

为什么要写这篇文章

本篇接《张侦毅:巴恩斯利蕨数学公式及源码实现》。之前文章中源码的编程语言用的是Java,JDK的版本为8,现在我的JDK版本已经升级到22了,在新版本JDK中,原来的JApplet方法已经被废弃,不能用了。

在JDK22中的说明是这样的:

JApplet自从JDK9版本已经被废弃

上面内容主要是说Java中的JApplet类自从JDK9已经被废弃,不能用了,因而我们在画巴恩斯利蕨时,就应该考虑换一种编程语言,恰好我很擅长JavaScript,所以就将用Java写的巴恩斯利蕨替换成了用JavaScrip写的版本(很多从事后端的程序开发者至少都会两种及以上的编程语言,我这也不例外,所以可以在至少两种编程语言间随意切换)。

巴恩斯利蕨数学公式

巴恩斯利蕨数学公式见下图:

巴恩斯利蕨数学公式

巴恩斯利蕨源码实现

<!DOCTYPE html>
<html lang="zh">
<head>
    <title>巴恩斯利蕨</title>
    <meta charset="UTF-8">
</head>
<body>
<canvas id="myCanvas" width="700" height="700" style="border:1px solid #996633;"></canvas>
<script type="text/javascript">
    // 获取页面canvas节点
    const canvas = document.getElementById('myCanvas');
    // 背景颜色设置为黑色
    canvas.style.backgroundColor = "black";
    // 平面画图
    const ctx = canvas.getContext('2d');
    // 叶片颜色设置为绿色
    ctx.strokeStyle = "green";
    // 线条宽度
    ctx.lineWidth = 0.1;
    // 叶片位置
    const offsetX = 320, offsetY = -170;
    // 缓存数据
    let x2 = 0, y2 = 0;
    // 像素数目
    const pixelCounts = 4000000;
    // 图片放大倍数
    const mag = 56;
    // 图像翻转
    const overturnY = 400;
    // 函数出现概率
    const f1 = 1, f2 = 85,f3 = 7;
    // 定义map的键值对
    const X = "x",Y = "y";
    // 创建Map容器
    let map = new Map(),temp = new Map();  // 代替之前的entry

    /**
     * 图像上下翻转
     */
    function overturn(){
        y2 = y2 - (y2 - overturnY) * 2;
    }

    /**
     * 原图片计算数据为厘米,而我的绘图,单位却是像素,因而需要根据自己电脑需求,将厘米转换为像素
     * @param map 容器
     */
    function magnification(map){
        x2 = map.get(X) * mag;
        y2 = map.get(Y) * mag;
    }

    /**
     * 方程func4
     * @param map 容器
     */
    function func4(map){
        x = -0.15 * map.get(X) + 0.28 * map.get(Y);
        y = 0.26 * map.get(X) + 0.24 * map.get(Y) + 0.44;
        temp.set(X,x);
        temp.set(Y,y);
        deepCopy(map,temp);
    }

    /**
     * 方程func3
     * @param map 容器
     */
    function func3(map){
        x = 0.2 * map.get(X) - 0.26 * map.get(Y);
        y = 0.23 * map.get(X) + 0.22 * map.get(Y) + 1.6;
        temp.set(X,x);
        temp.set(Y,y);
        deepCopy(map,temp);
    }

    /**
     * 方程func2
     * @param map 容器
     */
    function func2(map){
        x = 0.85 * map.get(X) + 0.04 * map.get(Y);
        y = -0.04 * map.get(X) + 0.85 * map.get(Y) + 1.6;
        temp.set(X,x);
        temp.set(Y,y);
        deepCopy(map,temp);
    }

    /**
     * 深度复制
     * @param map 拷贝目的地
     * @param temp 源数据
     */
    function deepCopy(map,temp){
        map.set(X,temp.get(X));
        map.set(Y,temp.get(Y));
    }

    /**
     * 方程 func1
     * @param map
     */
    function func1(map){
        temp.set(X,0);
        temp.set(Y,0.16 * map.get(Y));
        deepCopy(map,temp);
    }

    /**
     * 画巴恩斯利蕨
     */
    function drawBarnsleyFern() {
        map.set(X,0);
        map.set(Y,0);
        // 像素数目
        for(let i = 0; i < pixelCounts; i ++){
            // 生成随机数(Math.random()生成大于等于 0.0 且小于 1.0 的伪随机 double 值,
            // 故在生成的数字后面 * 99,再 + 1,才是1 - 100的随机数)
            const randomNumber = Number.parseInt(Math.random() * 99 + 1);
            // 选择函数公式
            if(randomNumber === f1){
                // 主干
                func1(map);
            } else if(randomNumber > f1 && randomNumber <= (f1 + f2) ){
                // 叶片
                func2(map);
            } else if(randomNumber > (f1 + f2) && randomNumber <= (f1 + f2 + f3)){
                // 左侧树叶
                func3(map);
            } else {
                // 右侧树叶
                func4(map);
            }

            // 将原图像数据按比例尺放大
            magnification(map);

            // 图像翻转
            overturn();

            // 开始绘制路径
            ctx.beginPath();

            // 画点(也就是画圆)
            ctx.moveTo(x2 + offsetX, y2 + offsetY);
            ctx.lineTo(x2 + offsetX + 1, y2 + offsetY + 1);

            // 绘图
            ctx.stroke();
        }
    }

    // 画巴恩斯利蕨
    drawBarnsleyFern();
</script>
</body>
</html>

效果图

这是图片截图:

巴恩斯利蕨截图

这是高清png图:

巴恩斯利蕨png高清图

图片更加的高清

该JavaScrip版本的巴恩斯利蕨与之前的Java版本在画质精度上有着明显的提升,具体表现在两点上:

1、线条点的宽度更小

Java版本的巴恩斯利蕨线条宽度为1,而在JavaScrip版本中,该线条宽度则为0.1。更小的线条宽度意味着,在原有图片像素点不变的前提下,该图片显得更透明,尤其是在画布背景颜色调成黑色后,这样的巴恩斯利蕨图片看上去更暗淡。

2、巴恩斯利蕨的像素点数更多

在原Java版本的巴恩斯利蕨中,该像素点数量为200000,而在新版的JavaScrip版本中,该像素点的数量为4000000。相较于前一个版本,新版本的像素点数量直接提升了20倍!所以JavaScrip版的巴恩斯利蕨相较于Java版本图片而言,清晰度提升了20倍!

更小的线条宽度,更高的像素点数量,这意味着该版本的巴恩斯利蕨相较于前一个版本而言,画质获得了质的提升。

注:该文章来自《巴恩斯利蕨数学公式及源码实现——JavaScript版》,作者是同人,所以属于原创。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生之全链路分布式跟踪系统 Zipkin和SkyWalking

贪多嚼不烂 Pinpoint 就不对比了 参考 APM系统简单对比(zipkin,pinpoint和skywalking) springcloud 看云 Zipkin和SkyWalking都是流行的分布式跟踪系统&#xff0c;但它们的设计和实现有明显的不同。 以下是它们之间的一些对比&#xff1a; 数据存储&#xff1a; Zipk…

Linux与Windows的文件与目录操作API汇总整理

文件和目录操作是编程中非常基础且常用的部分&#xff0c;涉及到文件的创建、读写、删除以及目录的创建、删除等功能。下面是文件和目录操作的汇总整理&#xff0c;包括常见的API及其用途&#xff1a; 文件操作 POSIX 系统&#xff08;如 Linux 和 macOS&#xff09; 打开文件…

Python二级知识点

在阅读之前&#xff0c;感谢大家的关注和点赞。祝你们都能心想事成、健健康康。 一.数据流程图 一般这道题是经常考的&#xff0c;有向箭头--->表示数据流。圆圈○表示加工处理。 二.字典如何比较大小 字典类型是如何比较大小的呢&#xff0c;是使用字典的键来比较大小&…

Python 使用everything的相关模块,创建极其快速的文件搜索和管理工具

在这篇博客中&#xff0c;我将分享如何使用 Python 的 everytools库构建一个简单的文件搜索和管理工具。这个工具允许用户搜索文件、查看文件路径、导出文件信息到 Excel&#xff0c;以及生成配置文件。 C:\pythoncode\new\everythingtools.py 项目概述 这个工具的主要功能包…

mysql binlog 全量与增量备份

mysql binlog 全量与增量备份 mysql binlog常用操作 https://blog.csdn.net/xyy1028/article/details/124446625 mysqldump mysqlbinlog 增量备份 mysql的增量备份 https://blog.51cto.com/u_16213572/10976496 mysql全量备份与增量备份 — vip https://blog.51cto.com/hehe1…

Java学习_20_File以及IO流

文章目录 前言一、FileFile中常见的成员方法判断和获取创建和删除获取和遍历 二、IO流IO流体系结构字节流字节输出流&#xff1a;FileOutputStream字节输入流FileInputStrea文件拷贝try……catch异常处理中文乱码现象 字符流字符流读取FileReader字符流输出FileWriter底层原理 …

堆《数据结构》

堆《数据结构》 1. 堆排序1.1 建堆向上调整建堆向下调整建堆 1.2 利用堆删除思想来进行排序1.3Top-k问题 2.堆的时间复杂度 1. 堆排序 1.1 建堆 建大堆 建小堆 向上调整建堆 AdjustUp建堆 void AdjustUp(HPDataType* a, int child) {// 初始条件// 中间过程// 结束条件int p…

专利权和版权有什么区别?

专利权和版权有什么区别&#xff1f;

【IEEE】第四届智能通信与计算国际学术会议(ICICC 2024,10月18-20)

第四届智能通信与计算国际学术会议&#xff08;ICICC 2024&#xff09;将于2024年10月18-20日在中国郑州隆重举行。 会议旨在为从事智能通信与计算研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xff0c;拓宽研究…

帆软报表,达梦数据库驱动上传失败

1、按照正常操作新建数据库连接&#xff0c;上传准备好的达梦驱动时&#xff0c;提示如图一需要修改SystemConfig.driverUpload为true才可以。 2、FineDB存储了数据决策系统中除平台属性配置以外的所有信息。详情请参见&#xff1a; FineDB 数据库简介。 3、因此管理员可通过…

都2024年了,你还在手动敲SQL吗?试试这款开源免费的AI数据库!

​ ✍️作为一名开发人员&#xff0c;基本上每天都要和数据库打交道&#xff0c;无论是设计表结构、执行查询还是调试应用中的数据问题。长期以来&#xff0c;我一直在使用诸如DBeaver、Navicat和DataGrip这样的数据库管理工具。尽管这些工具各有千秋&#xff0c;但在面对复杂的…

python怎么使用模块中的类

Chain.py是模块&#xff08;Module&#xff09;&#xff0c;在代码里定义的Class Chain是在模块里定义的类。 一种方法是&#xff1a; from Chain import Chain 还有一种方法是&#xff1a; a Chain.Chain() 相当于从模块里索引出这个类&#xff0c;两种方法都可以。

3b1b自注意力机制讲解记录

本文是对视频【官方双语】直观解释注意力机制&#xff0c;Transformer的核心 | 【深度学习第6章】的整理 1 背景 要解决的问题&#xff1a;接收一段文本&#xff0c;预测下一个词 句子会被切成许多小块&#xff0c;这些小块称为token。token可以是单词也可以是词组。为了简单…

SpringBoot百万行Excel导入MySQL实践

在公司开发时&#xff0c;客户说需要支持大数据量excel导入&#xff0c;所以打算写一篇文章记录下思路和优化过程。 一、前期准备 首先我们选用的肯定是阿里出品的EasyExcel&#xff0c;对比poi和jxl占内存更少 easyexcel官方网站准备测试的数据库和excel文件&#xff0c;已经…

Zustand:让React状态管理更简单、更高效

Zustand 这个单词在德语里是状态的意思&#xff08;发音&#xff1a;促stand&#xff09; 1. 下载zustand npm i zustand 或者 yarn add zustand2.创建一个store import { create } from zustandconst useBearStore create((set) > ({bears: 0,increasePopulation: …

20240824给飞凌OK3588-C的核心板刷Ubuntu22.04并连接adb

20240824给飞凌OK3588-C的核心板刷Ubuntu22.04并连接adb 2024/8/24 15:56 缘起&#xff0c;由于我司对面积有极度的追求&#xff0c;所以将飞凌OK3588-C开发板使用的【9线】type-C接口&#xff08;USB3.1?&#xff09;降级为4线的USB2.0。 【micro USB/MINI USB。】 先决条件…

基于RK3588的多摄像头车辆与车道线检测系统(基于rk3588的车辆和车道线检测,可以带四个720p的摄像头,2个1080p的摄像头)

硬件配置&#xff1a; 处理器&#xff1a;Rockchip RK3588&#xff0c;这是一款高性能的嵌入式处理器&#xff0c;支持多路高清视频输入和处理。摄像头配置&#xff1a; 4个720p&#xff08;1280x720&#xff09;分辨率的摄像头2个1080p&#xff08;1920x1080&#xff09;分辨…

什么是持续集成(持续交付、部署)

文章目录 1 持续集成1.1 持续集成的好处1.2 持续集成的目的1.3 没有持续集成的状况 2 持续交付3 持续部署4 持续交付和持续部署的区别 1 持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;&#xff0c;简单来说持续集成就是频繁地&#xff…

拓扑排序,以及区间dp相关试题

目录 1.有向无环图(DAG图&#xff09; 2.AOV网:顶点活动图 3.拓扑排序 4.实现拓扑排序 力扣.207课程表 牛客.最长回文子序列 1.有向无环图(DAG图&#xff09; 入度:表示有多少条边指向它 出度:有多少条边向外指出他 2.AOV网:顶点活动图 3.拓扑排序 找到做事情的先后顺序 …

React学习笔记(三)——redux状态管理工具

1. Redux快速上手 1.1 什么是Redux&#xff1f; Redux 是 React 最常用的 集中状态管理工具 &#xff0c;类似于 Vue 中的 Pinia&#xff08;Vuex&#xff09;&#xff0c; 可以独立于框架运行 作用&#xff1a; 通过集中管理的方式管理应用的状态 1.2 Redux快速体验 不和任何…