用Python画科赫雪花

article/2025/9/13 1:37:33

文章目录

    • 科赫曲线
    • 飘雪
    • 三维飘雪

科赫曲线

科赫曲线因为十分像雪花,所以被成为雪花曲线,生成方式十分简单,总共分两步

  1. 画一个正三角形
  2. 将正三角形的每个边三等分,然后以中间的那份为边,再画出个三角形。
  3. 重复第二步。

那么难点无非是三等分后如何新画一个三角形,更进一步,新三角形的那个新顶点在哪里?

设已知两点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2),设正三角形的第三点为 ( x , y ) (x,y) (x,y),则将坐标系平移到 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)后对 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)旋转60°即可。

[ x y ] = [ x 1 y 1 ] + [ cos ⁡ π 3 − sin ⁡ π 3 sin ⁡ π 3 cos ⁡ π 3 ] ⋅ [ x 2 − x 1 y 2 − y 1 ] = [ x 1 + 1 2 ( x 2 − x 1 ) − 3 2 ( y 2 − y 1 ) y 1 + 3 2 ( x 2 − x 1 ) + 1 2 ( y 2 − y 1 ) ] = [ 1 2 ( x 2 + x 1 ) − 3 2 ( y 2 − y 1 ) 1 2 ( y 2 + y 1 ) + 3 2 ( x 2 − x 1 ) ] \begin{aligned} \begin{bmatrix}x\\ y\end{bmatrix}&= \begin{bmatrix}x_1\\ y_1\end{bmatrix}+ \begin{bmatrix}\cos\frac{\pi}{3} &-\sin\frac{\pi}{3}\\ \sin\frac{\pi}{3}&\cos\frac{\pi}{3}\end{bmatrix}\cdot \begin{bmatrix}x_2-x_1\\ y_2-y_1\end{bmatrix}\\ &=\begin{bmatrix} x_1 + \frac{1}{2}(x_2-x_1)-\frac{\sqrt 3}{2}(y_2-y_1)\\ y_1 + \frac{\sqrt{3}}{2}(x_2-x_1)+\frac{1}{2}(y_2-y_1)\end{bmatrix}\\ &=\begin{bmatrix} \frac{1}{2}(x_2+x_1)-\frac{\sqrt 3}{2}(y_2-y_1)\\ \frac{1}{2}(y_2+y_1)+\frac{\sqrt{3}}{2}(x_2-x_1)\end{bmatrix} \end{aligned} [xy]=[x1y1]+[cos3πsin3πsin3πcos3π][x2x1y2y1]=[x1+21(x2x1)23 (y2y1)y1+23 (x2x1)+21(y2y1)]=[21(x2+x1)23 (y2y1)21(y2+y1)+23 (x2x1)]

写成Python就是

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import rand,randint# n>=1,生成科赫雪花的方法
def Koch(L,n=1):if n<1 : return LnewL = []    #(x,y)的列表k = np.sqrt(3)/2for i in range(len(L)-1):d = (L[i+1]-L[i])/3mid = (L[i]+L[i+1])/2xy = [mid[0]-k*d[1], mid[1]+k*d[0]]newL += [L[i], L[i]+d, xy, L[i]+d*2]newL.append(L[-1])return np.array(Koch(newL,n-1))

接下来,设置初始三角形,并做一个绘图函数

L0 = np.array([[0,0], [0.5,np.sqrt(3)/2], [1,0], [0,0] ])fig = plt.figure()
for i in range(6):L = Koch(L0, i)ax = fig.add_subplot(2,3,i+1)ax.plot(*L.T, c='lightblue', lw=1)plt.axis('off')     # 隐藏坐标轴plt.show()

从而得到

在这里插入图片描述

飘雪

既然有许多个雪花,那么可能就会有那种飘雪的感觉,这里只需用多个随机数生成多组科赫曲线

#n为雪花数量,low,high为最低和最高koch雪花阶数
def RandKoch(n,low,high):randKochs = []rMax = np.sqrt(1/n)for _ in range(n):cx,cy,t0 = rand(3)r = rand()*rMaxL0 = [np.array([np.cos(t),np.sin(t)])*r+[cx,cy]for t in (t0-np.arange(4)*np.pi*2/3)]randKochs.append(Koch(L0,randint(low,high)))return randKochsLs = RandKoch(100, 2,4)
for L in Ls:plt.plot(*L.T, c='lightblue', lw=1)plt.axis('off')
plt.show()plt.figure(2)
for L in Ls:plt.plot(*L.T, c='blue', lw=1)plt.fill(*L.T, c='lightblue', lw=1)plt.show()

其中,plt.fill可以填充绘制内容,其结果为

在这里插入图片描述在这里插入图片描述

三维飘雪

如果想要那种飘雪的感觉,至少得有个3D的图,这很简单,只要加个三维的坐标就可以了。

在这里插入图片描述

#导入PolyCollection绘制实心的3D图形
from mpl_toolkits.mplot3d.art3d import PolyCollection
ax = plt.subplot(projection='3d')
p3d = PolyCollection(Ls,facecolors=np.repeat('lightblue',len(Ls)),alpha=0.5)
ax.add_collection3d(p3d,zs=rand(len(Ls)),zdir='y')
# 取消坐标轴的刻度值
for axset in [ax.set_xticks, ax.set_xticks, ax.set_xticks]:axset(np.arange(10)/10, ['']*10)
plt.show()

http://chatgpt.dhexx.cn/article/GZD8i83c.shtml

相关文章

关于科赫曲线和科赫雪花的讲解

这是我的第2篇文章。在讲新内容之前&#xff0c;我先要把以前递归函数没讲完的继续讲解&#xff1a; &#xff08;recursion&#xff09;就是在运行的时候调用自己&#xff0c;构成递归需具备的两个条件&#xff1a;一个就是调用自己&#xff0c;一个是有终止的条件。这两个条…

sql中的函数取余数

整数中取余数 前言取余数向上取整算法&#xff08;此非彼&#xff09;函数 sql语句 前言 向上取整&#xff0c;向下取整&#xff0c;或者换句话说 &#xff1a;有余数就1 &#xff0c;没有就直接输出整数。 举个例子&#xff1a; 就比如一页10个&#xff0c;我21个数据&#x…

取模和求余运算

文章目录 背景探究总结 被除数 dividend 用 a 表示&#xff1b; 除数 divisor 用 b 表示&#xff1b; 商 quotient 用 q 表示&#xff1b; 余 remainder 用 rem 表示&#xff1b; 模 modulo 用 mod 表示。 背景 最近在一道 Java 习题中&#xff0c;看到这样的一道题&#xff1…

求任意整数模3的余数

在回答这个问题之前&#xff0c;首先思考另一个问题&#xff1a;为什么是模3的余数&#xff0c;而不是2或5&#xff1f; 那是因为3很特殊&#xff0c;求一个数模3的余数时&#xff0c;有一种巧妙地解法。 算法 算法是将这个数的各位数字加起来&#xff0c;重复这一过程&…

大数求余数

问题 提供两个数据 a&#xff0c;b&#xff0c;计算 a%b 的余数。 你可能会觉得这个问题很简单。我们用 C 为例&#xff0c;如果 a 和 b 可以在 long long 表示范围&#xff0c;那么这个问题非常简单。但是如果 a 超过了 C 中 long long 都超过的数据&#xff0c;我们要如何求…

求余数联系和赋值运算

算术和赋值运算符 算术运算符&#xff1a; (加)、 -(减)、 *(乘)、 /(除)、 %(求余) 赋值运算符&#xff1a;、 、 -、 *、 /、 % 加法运算代码及效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&…

怎么用计算机做求余,怎样用计算器求余数

这样用计算器求余数&#xff1a; 假设是求10825的余数&#xff0c;计算器的的计算步骤如下&#xff1a; 步骤1、用计算器的数字键输入108&#xff0c;如下图&#xff1a; 步骤2、按计算器上的红框这个符号&#xff0c;如下图&#xff1a; 步骤3、用计算器的数字键输入25&#x…

余数取余定理

一&#xff1a;前言 今天我们课上学习了余数的定理&#xff0c;最早好像是出自于孙子的《中华剩余定理》。今天我们讲的就是关于余数的一些操作。 二&#xff1a;加法 (ab)%m;(m是除数&#xff0c;%是取余的意思)。 有些题目就是让我们求几个数的和去除以某些数的余数。如果把…

【Java编程进阶】Java语言基础入门篇

前言 你好&#xff0c;欢迎你阅读 Java 编程基础教程系列专栏。每个技术人都有个大厂梦&#xff0c;我觉得这很正常&#xff0c;并不是饭后的谈资&#xff0c;而是每个技术人的追求。像百度&#xff0c;阿里&#xff0c;腾讯这样的大厂技术氛围和技术规范度一定是优于一些创业…

Java基础入门(一)----基本语言

目录 1. 标识符 2.关键字 3.注释 4.数据类型 5.运算符 5.1 常用运算符 5.1 运算符优先级 1. 标识符 在Java语言中&#xff0c;对于变量&#xff0c;常量&#xff0c;函数&#xff0c;语句块和命名的统称为Java标识符。Java标识符是由数字&#xff0c;字母&#xff0c;下…

ICCV 2019 | VIPL实验室5篇录取论文详解

上月&#xff0c;两年一度的国际计算机视觉大会ICCV 2019 公布了论文接收结果。今年投稿数量高达4303篇&#xff0c;与上一届 2143 篇相比&#xff0c;数量多出了将近一倍。最终全球仅1077篇论文被录取&#xff0c;录取率25.02%。中国科学院计算技术研究所视觉信息处理与学习研…

活体检测——SSDG

论文&#xff1a;《Single-Side Domain Generalization for Face Anti-Spoofing》 中国科学院计算技术研究所视觉信息处理与学习研究组&#xff08;VIPL实验室&#xff09;发布的单边域适应框架SSDG&#xff0c;其论文被CVPR2020 接收。Github链接&#xff1a;https://github.…

【ECCV 2016】Grid Loss及其在人脸检测中的应用

本文来源微信公众号&#xff1a;深度学习大讲堂&#xff0c;已授权发布。 作者&#xff1a;时学鹏&#xff0c;中科院计算所VIPL组15级硕士生。导师为山世光研究员。研究方向为基于深度学习的目标检测&#xff0c;特别是人脸检测。研发了VIPL课题组第五代人脸检测SDK。 原文&am…

Linux lvm(pv、vg、lv)操作命令收集

摘要&#xff1a;在Linux中&#xff0c;lvm逻辑卷应用非常广泛&#xff0c;vg卷组可以动态的调整空间大小&#xff0c;逻辑卷的扩容&#xff0c;可以轻松解决系统挂载点空间不足的问题。vg卷组创建的前提是设备分区标签必须为lvm。 一、物理卷操作命令 1、创建物理卷&#xff…

中科院计算所VIPL实验室2篇AAAI 2020论文导读

点击我爱计算机视觉标星&#xff0c;更快获取CVML新技术 经过数个月的审稿&#xff0c;近日&#xff0c;AAAI 2020 公布最终论文接收结果。大会共收到有效论文投稿超过8800 篇&#xff0c;再创历史新高&#xff0c;其中 7737 篇论文进入评审环节&#xff0c;最终有1591 篇被录用…

Linux LVM学习 查看pg,vg,LV的命令

Linux LVM学习 先了解一下PV,VG,LV的命令一张图先看关系物理存储介质(The physical media)这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。 物理卷(PV physical volume)物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备…

2020年chx的计算机保研之路系列(3)——中科院计算所(获得offer)

写在前面 写这篇博客的时间是2020.7.26。有北航cs保底了&#xff0c;再参加其他夏令营的时候明显就自信了许多&#xff0c;所以计算所面试发挥的也不错。但是&#xff0c;我还真是没想到&#xff0c;在夏令营阶段&#xff08;真是各路神仙打架&#xff09;&#xff0c;就一举拿…

Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation论文解读

&#xff08; CVPR 2020&#xff5c;中科院VIPL实验室 &#xff09; 1.要解决的问题&#xff1a; 基于类别标签的弱监督语义分割是一个具有挑战性的问题&#xff0c;类别响应图&#xff08;class activation map&#xff0c;简称CAM&#xff09;始终是这一领域的基础方法。但是…

2022年计算机保研记录(计算所、浙大、华科、东南、北航)

在 2022 年 9 月 26 日&#xff0c;我的保研之旅终于结束啦&#xff0c;成功上岸浙江大学软件学院&#xff0c;来记录一下我的保研经历&#xff5e; 文章目录 一、个人情况二、夏令营浙江大学北京邮电大学中国科学院大学计算所计算机网络信息中心 东南大学北京航空航天大学中南…