分形之科赫雪花

前言

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

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

分形理论的发展起源于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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

铁塔基站用能监控能效解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

一图了解【电子面拦截】接口

【电子面拦截】又可以成为快递拦截 商品还在运输途中&#xff0c;买家申请仅退款、想修改地址怎么办&#xff1f; 百递云API开放平台最新推出「电子面单拦截」接口&#xff0c;提供三种拦截类型&#xff0c;助力快速拦截处理在途包裹。 下图带您了解&#x1f447;

Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现

栈&#xff1a;先入后出&#xff1b;队列&#xff1a;先入先出 一、每日温度 Leecode—739题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温…

2.6 Docker部署多个前端项目

2.6 Docker部署多个项目 三. 部署前端项目 1.将前端项目打包到同一目录下&#xff08;tcm-ui&#xff09; 2. 部署nginx容器 docker run --namenginx -p 9090:9090 -p 9091:9091 -d nginx3. 复制nginx.conf文件到主机目录 docker cp nginx:/etc/nginx/nginx.conf /root/ja…

大模型之路,从菜鸟到模型大师只需要一步

前言&#xff1a; 在这个数据爆炸的时代&#xff0c;大模型技术正以前所未有的速度发展。从自然语言处理到计算机视觉&#xff0c;从智能推荐到自动驾驶&#xff0c;大模型正逐渐渗透到我们生活的方方面面。那么&#xff0c;如何从菜鸟成长为模型大师呢&#xff1f;本文将为你…

【JMeter接口自动化】第8讲 Fiddler抓包Jmeter

1&#xff09;配置好Fiddler 设置Fiddler-Tools-Options-HTTPS 设置Fiddler-Tools-Options-Connections&#xff0c;设置端口为8888 2&#xff09;查看IP 在CMD中输入ipconfig 查看IP地址 3&#xff09;配置Jmeter Http请求——基本&#xff0c;设置Http请求&#xff0c;使用…

英语学习笔记30——What must I do?

What must I do? 我应该做点啥&#xff1f; 词汇 Vocabulary empty v. 倒空&#xff0c;变空 a. 空的 搭配&#xff1a;empty bottle 空瓶子    empty room 空屋子 例句&#xff1a;教室里空无一人。    The classroom is empty.    我有一个空瓶子。    I have…

智能家居元宇宙三维互动展示在线创作平台

卫浴行业正迎来一场全新的革命——卫浴元宇宙3D展厅搭建编辑器。它基于互联网信息技术、3D线上展示与VR虚拟现实技术&#xff0c;为您打造一个沉浸式的3D虚拟空间&#xff0c;让您的卫浴产品在线上展示中焕发出前所未有的光彩。 在这个卫浴元宇宙中&#xff0c;您可以随心所欲地…

大模型时代的具身智能系列专题(六)

UCSD 王小龙组 王小龙是UCSD电子与计算机工程系的助理教授。他曾在加州大学伯克利分校与Alexei Efros和Trevor Darrell一起担任博士后研究员&#xff0c;在CMU RI获得了机器人学博士学位&#xff0c;师从Abhinav Gupta。他的研究重点是通过视频和物理机器人交互数据来学习3D和…

vulnhub靶场之FunBox-9

一.环境搭建 1.靶场描述 Its a box for beginners, but not easy. Gather careful !!! Hint: Dont waste your time ! Every BruteForce-Attack at all ports can be stopped after 1500 trys per account. Enjoy the game and WYSIWYG ! This works better with VirtualBox…

数据在内存中的存储<C语言>

导言 在计算机中不同类型的数据在计算机内部存储形式各不相同&#xff0c;弄懂各种数据在计算机内部存储形式是有必要的&#xff0c;C语言的学习不能浮于表面&#xff0c;更要锻炼我们的“内功”&#xff0c;将来在写程序的时候遇见各种稀奇古怪的bug时&#xff0c;也便能迎刃而…

Redis之持久化、集群

1. Redis持久化 Redis为什么需要持久化?因为Redis的数据我们都知道是存放在内存中的&#xff0c;那么每次关闭或者机器断电&#xff0c;我们的数据旧丢失了。 因此&#xff0c;Redis如果想要被别人使用&#xff0c;这个问题就需要解决&#xff0c;怎么解决呢?就是说我们的数…

深度解析:从概念到变革——Transformer大模型的前世今生以及大模型预备知识讲解[知存科技]

深度解析&#xff1a;从概念到变革——Transformer大模型的前世今生 点击&#xff1a;知存科技相关课程推荐 知存科技是全球领先的存内计算芯片企业。针对AI应用场景&#xff0c;在全球率先商业化量产基于存内计算技术的神经网络芯片。凭借颠覆性的技术创新&#xff0c;知存科…

小米投屏怎么投?收好这3个投屏指南!(2024新)

近年来&#xff0c;小米凭借过硬的品质和合理的价格成为手机市场的一股强劲力量。随着其销量的上升&#xff0c;人们可以通过多种方式使用它来获得乐趣和便利。比如小米MIUI 11自带一个“光环”——Miracast&#xff0c;可以让用户在电脑上控制小米/红米/小米&#xff0c;获得更…

conda创建虚拟环境并激活

1 conda activate base 2 conda creat -n aaa python** 3 conda activate aaa 4 interpreter里面去选择刚搞好的编译器 ...../conda.exe

软考随记(二)

I/O系统的5种不同的工作方式&#xff1a; 程序控制方式&#xff1a; 无条件查询&#xff1a;I/O端口总是准备好接受主机的输出数据&#xff0c;或是总是准备好向主机输入数据&#xff0c;而CPU在需要时随时直接利用I/O指令访问相应的I/O端口&#xff0c;实现与外设的数据交换 …

9.Halcon3D点云力矩求解-平面拟合用法

1.实现效果 我们在使用3d相机对产品进行扫描生成点云的时候,由于安装问题,所以我们不可能保证每次产品扫描出来都在坐标系中位置和姿态非常标准。 上述算法描述的就是在某一个维度或者某几个维度上将点云数据和坐标系对齐; 至于怎么对齐,如何实现就是今天的内容。 本人能…

【UE5.1 角色练习】10-物体抬升、抛出技能 - part2

目录 前言 效果 步骤 一、让物体缓慢的飞向手掌 二、向着鼠标方向发射物体 前言 在上一篇&#xff08;【UE5.1 角色练习】08-物体抬升、抛出技能 - part1&#xff09;的基础上继续完成角色将物体吸向手掌&#xff0c;然后通过鼠标点击的方向来发射物体的功能。 效果 步骤…

华为 CANN

华为 CANN 1 介绍1.1 概述1.2 CANN 是华为昇腾计算产业的重要一环1.3 昇腾系列处理器1.4 昇腾 AI 产业1.5 从 AI 算法到产品化落地流程1.6 多样性计算架构1.7 人工智能各层级图示1.8 人工智能技术发展历史 2 CANN vs CUDA支持平台优化方向编程接口生态系统与应用性能与功能 3 C…

民国漫画杂志《时代漫画》第36期.PDF

时代漫画36.PDF: https://url03.ctfile.com/f/1779803-1248636233-8a4a9d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!