分形之科赫雪花

news2025/1/21 18:42:38

前言

分形是一种具有自相似性的几何图形或数学对象。它的特点是无论在任何放大或缩小的尺度下,都能够看到与整体相似的图形。分形的形状可以非常复杂,常常具有分支、重复的图案,以及细节层次丰富的结构。

分形在自然界中广泛存在,如云朵、树枝、山脉、海岸线等,它们都展现了分形的特性。分形也在科学和艺术中得到广泛应用。在科学中,分形可以用来描述复杂的自然现象,如心电图、地理地貌、经济市场的波动等。在艺术中,分形可以用来生成艺术作品,如绘画、音乐、电影等,通过分形的自相似性和美学特性,创造出独特的视觉和听觉体验。

分形理论的发展起源于20世纪70年代,由数学家贝诺瓦·曼德布罗特和两个波兰数学家兹比格涅夫·尼科拉斯·普鲁斯金斯基及尼科拉斯·尼可夫发现和研究。分形理论为我们提供了一种新的视角来理解自然界和艺术中的复杂性,并且对人类的认知和创造力产生了深远的影响。

科赫雪花(也叫科赫雪花曲线)是一种分形图形,由瑞典数学家科尔·科赫(Helge von Koch)于1904年提出的。它是从一个等边三角形开始构建的,然后将每条边分成三等分,并在其中一等分边上构建一个新的等边三角形。不断重复这个过程,每次都在已经构建好的图形的每条边上重复。最终,会得到一个形状复杂且具有自相似性的图形。

科赫雪花具有许多有趣的属性。首先,它有无限的边界长度,也就是说,无论你如何继续细分边界,都无法得到一个封闭的图形。其次,科赫雪花的面积虽然有限,但无法通过传统的几何方法来计算。最后,科赫雪花是自相似的,即它的任何一部分都与整体具有相似的形状。

科赫雪花是分形几何学的一个经典例子,它展示了分形的一些基本概念和性质。

分形是一种具有自相似性的图形,无论在任何尺度上观察,都能看到相似的形状。这种自相似性是分形图形与传统几何图形的重要区别之一,使得分形图形在自然界和科学中的许多领域都有广泛的应用。

用three.js实现科赫雪花

<!DOCTYPE html>
<html class="fullscreen" lang="zh-CN">

  <head>

    <title>snow flake</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" href="">
    
    <style>
	
		.fullscreen {
		  margin: 0px;
		  padding: 0px;
		  width: 100vw;
		  height: 100vh;
		  overflow: hidden;
		}

		html, body {
		  overflow: hidden;
		  font-family: '微软雅黑', sans-serif;
		  color: #2f2f2f;
		}

		/* Page Loader */

		.page-loader {
		  width: calc(100vw - 15px);
		  height: calc(100vh - 15px);
		  background-color: #f5e6d3;
		  position: absolute;
		  z-index: 100;
		  top: 50%;
		  left: 50%;
		  transform: translate(-50%, -50%);
		  border-radius: 10px;
		  display: flex;
		  align-items: center;
		  justify-content: center;
		}

		.loader-container {
		  width: 200px;
		  height: 200px;
		  display: flex;
		  justify-content: center;
		  align-items: center;
		}
		
		.base {
		  position: absolute;
		  width: 90px;
		  height: 51px;
		}
		.base-two {
		  transform: rotate(60deg)
		}
		.base-three {
		  transform: rotate(-60deg)
		}

		.loader-hex-edge {
		  position: absolute;
		  width: 4px;
		  height: 0%;
		  background: #00738B;
		  z-index: 101;
		}

		.h1 {
		  left: 0;
		  animation: AniOne 7.2s ease infinite;
		}
		.h2 {
		  right: 0;
		  animation: AniTwo 7.2s ease .6s infinite;
		}
		.h3 {
		  right: 0;
		  animation: AniTwo 7.2s ease 1.2s infinite;
		}
		.h4 {
		  right: 0;
		  animation: AniTwo 7.2s ease 1.8s infinite;
		}
		.h5 {
		  left: 0;
		  animation: AniOne 7.2s ease 2.4s infinite;
		}
		.h6 {
		  left: 0;
		  animation: AniOne 7.2s ease 3s infinite;
		}

		@keyframes AniOne {
		  0% {
			bottom: 0;
			height: 0;
		  }
		  6.944444444% {
			bottom: 0;
			height: 100%;
		  }
		  50% {
			top: 0;
			height: 100%;
		  }
		  59.944444433% {
			top: 0;
			height: 0;
		  }
		}
		@keyframes AniTwo {
		  0% {
			top: 0;
			height: 0;
		  }
		  6.944444444% {
			top: 0;
			height: 100%;
		  }
		  50% {
			bottom: 0;
			height: 100%;
		  }
		  59.944444433% {
			bottom: 0;
			height: 0;
		  }
		}

		/* Canvas */
		.container {
		  width: calc(100vw - 1px);
		  height: calc(100vh - 1px);
		  position: absolute;
		  z-index: 0;
		  top: 50%;
		  left: 50%;
		  transform: translate(-50%, -50%);
		}

		.canvas {
		  border-radius: 1px;
		}

	</style>
	
	<script type="importmap">
    {
      "imports": {
        "three": "https://cdn.jsdelivr.net/npm/three@0.162.0/+esm",
        "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.162.0/examples/jsm/",
		"lil-gui": "https://threejsfundamentals.org/3rdparty/dat.gui.module.js",
        "@tweenjs/tween.js": "https://cdn.jsdelivr.net/npm/@tweenjs/tween.js@23.1.1/dist/tween.esm.js"
      }
    }
  </script>

  </head>


  <body class="fullscreen">

    <div class="page-loader">
      <div class="loader-container">
        <div class="base">
          <span class="loader-hex-edge h6"></span>
          <span class="loader-hex-edge h3"></span>
        </div>
        <div class="base base-two">
          <span class="loader-hex-edge h1"></span>
          <span class="loader-hex-edge h4"></span>
        </div>
        <div class="base base-three">
          <span class="loader-hex-edge h5"></span>
          <span class="loader-hex-edge h2"></span>
        </div>
      </div>
    </div>

    <div class="fullscreen container">
      <canvas class="fullscreen canvas"></canvas>
    </div>

    <script type="module">
	
	import * as THREE from 'three';
	import * as TWEEN from '@tweenjs/tween.js';
	import { GUI } from 'lil-gui';

	const _changeEvent = { type: 'change' };
	const _startEvent = { type: 'start' };
	const _endEvent = { type: 'end' };
	const _ray = new THREE.Ray();
	const _plane = new THREE.Plane();
	const TILT_LIMIT = Math.cos( 70 * THREE.MathUtils.DEG2RAD );
 
	class OrbitControls extends THREE.EventDispatcher {
 
		constructor( object, domElement ) {
 
			super();
 
			this.object = object;
			this.domElement = domElement;
			this.domElement.style.touchAction = 'none'; // disable touch scroll
 
			// Set to false to disable this control
			this.enabled = true;
 
			// "target" sets the location of focus, where the object orbits around
			this.target = new THREE.Vector3();
 
			// Sets the 3D cursor (similar to Blender), from which the maxTargetRadius takes effect
			this.cursor = new THREE.Vector3();
 
			// How far you can dolly in and out ( PerspectiveCamera only )
			this.minDistance = 0;
			this.maxDistance = Infinity;
 
			// How far you can zoom in and out ( OrthographicCamera only )
			this.minZoom = 0;
			this.maxZoom = Infinity;
 
			// Limit camera target within a spherical area around the cursor
			this.minTargetRadius = 0;
			this.maxTargetRadius = Infinity;
 
			// How far you can orbit vertically, upper and lower limits.
			// Range is 0 to Math.PI radians.
			this.minPolarAngle = 0; // radians
			this.maxPolarAngle = Math.PI; // radians
 
			// How far you can orbit horizontally, upper and lower limits.
			// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )
			this.minAzimuthAngle = - Infinity; // radians
			this.maxAzimuthAngle = Infinity; // radians
 
			// Set to true to enable damping (inertia)
			// If damping is enabled, you must call controls.update() in your animation loop
			this.enableDamping = false;
			this.dampingFactor = 0.05;
 
			// This option actually enables dollying in and out; left as "zoom" for backwards compatibility.
			// Set to false to disable zooming
			this.enableZoom = true;
			this.zoomSpeed = 1.0;
 
			// Set to false to disable rotating
			this.enableRotate = true;
			this.rotateSpeed = 1.0;
 
			// Set to false to disable panning
			this.enablePan = true;
			this.panSpeed = 1.0;
			this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up
			this.keyPanSpeed = 7.0;	// pixels moved per arrow key push
			this.zoomToCursor = false;
 
			// Set to true to automatically rotate around the target
			// If auto-rotate is enabled, you must call controls.update() in your animation loop
			this.autoRotate = false;
			this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60
 
			// The four arrow keys
			this.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };
 
			// Mouse buttons
			this.mouseButtons = { LEFT: THREE.MOUSE.ROTATE, MIDDLE: THREE.MOUSE.DOLLY, RIGHT: THREE.MOUSE.PAN };
 
			// Touch fingers
			this.touches = { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };
 
			// for reset
			this.target0 = this.target.clone();
			this.position0 = this.object.position.clone();
			this.zoom0 = this.object.zoom;
 
			// the target DOM element for key events
			this._domElementKeyEvents = null;
 
			//
			// public methods
			//
 
			this.getPolarAngle = function () {
 
				return spherical.phi;
 
			};
 
			this.getAzimuthalAngle = function () {
 
				return spherical.theta;
 
			};
 
			this.getDistance = function () {
 
				return this.object.position.distanceTo( this.target );
 
			};
 
			this.listenToKeyEvents = function ( domElement ) {
 
				domElement.addEventListener( 'keydown', onKeyDown );
				this._domElementKeyEvents = domElement;
 
			};
 
			this.stopListenToKeyEvents = function () {
 
				this._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );
				this._domElementKeyEvents = null;
 
			};
 
			this.saveState = function () {
 
				scope.target0.copy( scope.target );
				scope.position0.copy( scope.object.position );
				scope.zoom0 = scope.object.zoom;
 
			};
 
			this.reset = function () {
 
				scope.target.copy( scope.target0 );
				scope.object.position.copy( scope.position0 );
				scope.object.zoom = scope.zoom0;
 
				scope.object.updateProjectionMatrix();
				scope.dispatchEvent( _changeEvent );
 
				scope.update();
 
				state = STATE.NONE;
 
			};
 
			// this method is exposed, but perhaps it would be better if we can make it private...
			this.update = function () {
 
				const offset = new THREE.Vector3();
 
				// so camera.up is the orbit axis
				const quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );
				const quatInverse = quat.clone().invert();
 
				const lastPosition = new THREE.Vector3();
				const lastQuaternion = new THREE.Quaternion();
				const lastTargetPosition = new THREE.Vector3();
 
				const twoPI = 2 * Math.PI;
 
				return function update( deltaTime = null ) {
 
					const position = scope.object.position;
 
					offset.copy( position

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

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

相关文章

jpom ruoyi 发布后端

添加ssh 添加标签 添加仓库 添加构建 构建 命令 APP_NAMEenterprise IMAGE_NAMEenterprise:latest APP_PORT8080 RUN_ENVjenkins cd ruoyi-admin docker stop $APP_NAME || true docker rm $APP_NAME || true docker rmi $IMAGE_NAME || true docker build -f Dockerfil…

【Linux基础】Linux了解、安装centos虚拟机

【Linux基础】Linux了解、安装centos虚拟机 文章目录 【Linux基础】Linux了解、安装centos虚拟机1、什么是Linux2、Linux安装2.1、使用VMware安装Linux centos72.2、启动虚拟机安装 1、什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统&#xff0c;大家比较…

Spring boot 集成thymeleaf

Spring boot 集成thymeleaf 背景 自己通过Spring boot集成通义千问实现了一个智能问答系统。Spring boot集成通义千问已经完成&#xff0c;现在需要做一个简单的页面展示&#xff0c;作为一个八年没有摸过前端的后端开发人员&#xff0c;不得不又拿起了html和thymeleaf。 Sp…

指纹浏览器大全

具体请前往&#xff1a;国内外指纹浏览器大全

博士毕业论文/CTEX/LATEX

LATEX环境安装 CTEX 安装 &#xff08;垃圾&#xff0c;不要装&#xff09; 运行 clean.batcomp.bat 缺少字体 Couldn’t find Adobe Heiti S.cfg’ miktex-maketfm: No creation rule for font “Adobe Heiti Std”.解决方法&#xff1a;其实就是下载这四个字体之后&…

Linuxftp服务002本地登入

本期主要讲述的是ftp服务中的本地用户登入。 操作系统 CentOS Stream 9 操作步骤 首先我们先建立一个ftp组的用户&#xff0c;并设置密码。 [rootlocalhost ~]# useradd -g ftp wq [rootlocalhost ~]# echo 1 |passwd --stdin wq 更改用户 wq 的密码 。 passwd&#xff1a…

DataCube 漏洞小结

在这里分享一下通过拖取 DataCube 代码审计后发现的一些漏洞&#xff0c;包括前台的文件上传&#xff0c;信息泄露出账号密码&#xff0c;后台的文件上传。当然还有部分 SQL 注入漏洞&#xff0c;因为 DataCube 采用的是 SQLite 的数据库&#xff0c;所以SQL 注入相对来说显得就…

Qt 窗口

在Qt Creator 中创建项目的时候&#xff0c;我们能够选择创建QMainWindow 还是 QWidget 两种窗口。 二者有什么区别呢&#xff1f;其中 QMainWindow 是一种主窗口&#xff0c;包含菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;中心窗口和浮动窗口等多个窗口组合&…

木叶飞舞之【机器人ROS2】篇章_第三节、给turtlebot3安装realsense深度相机

我们做视觉slam时会用到深度相机&#xff0c;但是gazebo的turtlebot3中只有rgb相机&#xff0c;没有深度&#xff0c;因此本节会修改代码&#xff0c;来给我们的小乌龟增加一个rgbd相机。 效果展示 发布topic如下图 图片大小都是640*480 1. 修改model.sdf文件 1.1 路径位置…

Java后端模拟面试 题集⑤

1.先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图像…

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx&#xff08;发音同engine x&#xff09;是一个异步框架的 Web 服务器&#xff0c;也可以用作反向代理&#xff0c;负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建&#xff0c;并于2004年首次公开发布。同名公司成立于2011年&#xff0c;以提供支持。…

CraftCMS ConditionsController.php 代码执行漏洞(CVE-2023-41892)

0x01 产品简介 Craft CMS是一个开源的内容管理系统,它专注于用户友好的内容创建过程,逻辑清晰明了,是一个高度自由,高度自定义设计的平台吗,可以用来创建个人或企业网站也可以搭建企业级电子商务系统。 0x02 漏洞概述 Craft CMS在4.4.15版本之前存在远程代码执行漏洞,…

Java——String类

1.String常用方法 1.1三种常用构造方法 1. String s1"hello";2. String s2new String("world");3. char []str{h,e,l,l,o, ,w,o,r,l,d};String s3new String(str); 1.2String对象的比较 比较 对于内置类型来说&#xff0c;“”比较…

【头歌】JSP入门、基于MVC模式的用户登录、JSP基础之网站用户管理

目录 JSP入门 第1关&#xff1a;搭建你的第一个Web服务器 第3关&#xff1a;JSP基础测试题&#xff08;一&#xff09; 第4关&#xff1a;JSP基础&#xff08;二&#xff09; 第5关&#xff1a;JSP基础测试题&#xff08;二&#xff09; 基于MVC模式的用户登录 第1关&…

Gbase 国产数据库

参考&#xff1a;参考&#xff1a; 5分钟学会Linux环境GBase 8t安装和部署 - 光洋山 - twt企业IT交流平台 (talkwithtrend.com)https://www.talkwithtrend.com/Article/197237 视频 GBase 8s快速入门-功能简介与演示-大数据教程-腾讯课堂 (qq.com)https://ke.qq.com/course/…

【数据结构】二叉树运用及相关例题

文章目录 前言查第K层的节点个数判断该二叉树是否为完全二叉树例题一 - Leetcode - 226反转二叉树例题一 - Leetcode - 110平衡二叉树 前言 在笔者的前几篇篇博客中介绍了二叉树的基本概念及基本实现方法&#xff0c;有兴趣的朋友自己移步看看。 这篇文章主要介绍一下二叉树的…

C# PaddleOCR 单字识别效果

C# PaddleOCR 单字识别效果 效果 说明 根据《百度办公文档识别C离线SDKV1.2用户接入文档.pdf》&#xff0c;使用C封装DLL&#xff0c;C#调用。 背景 为使客户、第三方开发者等能够更快速、方便的接入使用百度办公文档识别 SDK、促进百度 OCR产品赋能更多客户&#xff0c;特设…

Linux开发工具(个人使用)

Linux开发工具 1.Linux yum软件包管理器1.1Linux安装程序有三种方式1.2注意事项1.3如何查看&#xff0c;安装&#xff0c;卸载软件包1.3.1查看软件包1.3.2安装软件包1.3.3卸载软件 2.Linux vim编辑器2.1vim的基本操作2.2vim正常模式命令集2.3vim底行模式命令集2.4vim配置 3.Lin…

灾备方案中虚拟化平台元数据备份技术应用

首先需要介绍下元数据是什么&#xff1f; 元数据&#xff08;Metadata&#xff09;是一个重要的概念&#xff0c;它描述了数据的数据&#xff0c;也就是说&#xff0c;元数据提供了关于数据属性的信息。这些属性可能包括数据的存储位置、历史数据、资源查找、文件记录等。 元…