Koch曲线是一个典型的“数学怪物”,它的特点是处处连续但点点不可微。下面将讲解Koch曲线的形成原理及matlab程序实现(对空间上的任意两个点,画出它们的Koch曲线)

形成过程

对于二维空间上的任意一条线段,将该线段的两个端点称为首点和尾点,我们需要利用这首点和尾点来得到新的五个点。
首先,第一和第五个点即是首点和尾点,第二和第四个点是上述线段的两个三等分点,而第三个点是跟这两个三等分点组成等边三角形的三角形顶点。依次将五个点连接起来,便得到迭代一次的Koch曲线,然后对新得到的曲线上相邻的两个点做同样的操作。如此重复便可以得到Koch曲线,如下图所示。

对原始线段迭代一次之后得到的四折线段可以看成是原始线段分别做了四次变换之后得到的线段,一般的变换式为
Wi[xy]=ωi[xy]+ti(i=1,2,3,4)W_i \begin{bmatrix} x\\ y \\ \end{bmatrix}=\omega_i \begin{bmatrix} x\\ y \\ \end{bmatrix}+t_i(i=1,2,3,4) Wi​[xy​]=ωi​[xy​]+ti​(i=1,2,3,4)
其中
ω1=[130013],t1=[00],\omega_1= \begin{bmatrix} \frac{1}{3} & 0 \\ 0 & \frac{1}{3} \\ \end{bmatrix}, t_1= \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix}, ω1​=[31​0​031​​],t1​=[00​],
ω2=[16−363616],t2=[130],\omega_2= \begin{bmatrix} \frac{1}{6} & -\frac{\sqrt{3}}{6} \\ \frac{\sqrt{3}}{6} & \frac{1}{6} \\ \end{bmatrix}, t_2= \begin{bmatrix} \frac{1}{3} \\ 0 \\ \end{bmatrix}, ω2​=[61​63​​​−63​​61​​],t2​=[31​0​],
ω3=[1636−3616],t3=[1236],\omega_3= \begin{bmatrix} \frac{1}{6} & \frac{\sqrt{3}}{6} \\ -\frac{\sqrt{3}}{6} & \frac{1}{6} \\ \end{bmatrix}, t_3= \begin{bmatrix} \frac{1}{2} \\ \frac{\sqrt{3}}{6} \\ \end{bmatrix}, ω3​=[61​−63​​​63​​61​​],t3​=[21​63​​​],
ω4=[130013],t4=[230],\omega_4= \begin{bmatrix} \frac{1}{3} & 0 \\ 0 & \frac{1}{3} \\ \end{bmatrix}, t_4= \begin{bmatrix} \frac{2}{3}\\ 0 \\ \end{bmatrix}, ω4​=[31​0​031​​],t4​=[32​0​],

程序实现

定义Koch曲线函数

function Koch_line(time, A)
% time:迭代次数 A:初始两点坐标(列向量)
% time=10;A=[0,1; 0,0];
w1 = [1.0/3, 0; 0, 1.0/3]; t1 = [0, 0];
w2 = [1.0/6, -sqrt(3)/6; sqrt(3)/6, 1.0/6]; t2 = [1.0/3, 0];
w3 = [1.0/6, sqrt(3)/6; -sqrt(3)/6, 1.0/6]; t3 = [1.0/2, sqrt(3)/6];
w4 = [1.0/3, 0; 0, 1.0/3]; t4 = [2.0/3, 0];
for i=1:timetest_A = zeros(2, 1+4^i);[m,n] = size(A);for j=1:n-1 % 每次储存4个节点test_A(:, (j-1)*4+1) = A(:, j); % 首点test_A(:, (j-1)*4+2) = 1/3 * (A(:, j+1)-A(:, j)) + A(:, j); % 首点通过第二个变换得到test_A(:, (j-1)*4+3) = w2*(A(:, j+1)-A(:, j)) + A(:, j) + 1/3 * (A(:, j+1)-A(:, j)); % 尾点通过第二个变换得到test_A(:, (j-1)*4+4) = 2/3 * (A(:, j+1)-A(:, j)) + A(:, j); % 首点通过第四个变换得到endtest_A(:, end) = A(:, end);A = test_A;
end
figure,line(A(1, :), A(2, :))
axis([0 1 0 1])
end
演示
time=10;A=[0,1; 0,0];
Koch_line(time, A)

time=10;A=[0,1; 0,1];
Koch_line(time, A)

注意

1、点的计算

已知首点和尾点,现在需要得到新的五个点。
首先,第一和第五个点就是原先的首尾点,其次,第二个点可以由尾点通过变换W1W_1W1​得到,也可以由首点通过变换W2W_2W2​得到,第三个点可以由尾点通过变换W2W_2W2​得到,也可以由首点通过变换W3W_3W3​得到,第四个点可以由尾点通过变换W3W_3W3​得到,也可以由首点通过变换W4W_4W4​得到。
所以我在写程序的时候第一和第五个直接由首尾点得到,第二个点是由首点通过变换W2W_2W2​得到,第三个点是由尾点通过变换W2W_2W2​得到,第四个点是由首点通过变换W4W_4W4​得到,这样就能减少使用变换W3W_3W3​。

2、是否绕原点旋转

通过变换Wi,(i=1,2,3,4)W_i,(i=1,2,3,4)Wi​,(i=1,2,3,4),可以用首点和尾点的坐标得到新的五个点的坐标,但同时需要注意到,这种变换只针对原来的两个点有一个是原点的情况下,其中像变换W2W_2W2​和W3W_3W3​,它们是将线段绕原点进行旋转,再加上一个平移量。而对于空间上的任意两个点进行变换,如果仍然采用上述的变换矩阵,将不会得到希望的结果。
这时就需要对首点和尾点进行平移,将它们的旋转中心平移到原点,再进行旋转变换,之后再平移回去。
举个例子能更明白一些,比如对首尾点相连的线段lll进行变换W2W_2W2​,首先是将lll绕首点逆时针旋转60度,然后将lll缩小为原来长度的三分之一,最后沿尾点的方向平移原来lll长度的三分之一距离。如果首点不是原点,则进行上述的变换并不能得到所要的结果,这时需要先将首尾点的坐标值减去首点的坐标值,在进行上述变换,最后再把首点的坐标值加上,如此操作才能画出正确的Koch曲线。

----end----

参考资料
李水根,吴纪桃《分形与小波》

Koch曲线的matlab程序实现相关推荐

  1. Koch雪花曲线的MATLAB实现

    Koch曲线是分形图案的一个代表,对其研究很有意义,在此不敢多说.请见matrix67的博客: http://www.matrix67.com/blog/archives/243 用一个复数序列代表整 ...

  2. hilbert曲线序编码matlab,Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码

    Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码 王笋,徐小双(华中科技大学控制科学与工程系,武汉 430074) 摘 要 Hilbert曲线是一种重要的图像处理工具,在图像处理,特别是图 ...

  3. matlab雪花图形,koch曲线与koch雪花的MATLAB实现

    代码 % -- function koch(Ax, Ay, Bx, By) % 控制递归深度 Deepth = ; % 控制图画大小 Size = ; if ((Bx-Ax)^ + (By-Ay)^) ...

  4. matlab画分形minkowski,分形系列之matlab绘制koch曲线

    从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下,在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形 ...

  5. 根据PLL相噪测试曲线计算jitter的Matlab程序

    最近在测试,没有相噪仪,频谱仪只能测出相噪数据,无法得到jitter数据,所以就自己写了一个Matlab程序计算. 计算方法是按照ADI工程师Walt Kester的Converting Oscill ...

  6. 全国大学生数学建模竞赛2020A题炉温曲线MATLAB程序

    目录 前言 一.第1问 1.1 数据预处理与数据可视化MATLAB程序 1.2 利用追赶法求解偏微分方程模型遍历寻找最优a系数与k系数MATLAB程序 1.3 代入a系数与k系数求解第1问MATLAB ...

  7. matlab多元回归程序,多元回归程序MATLAB程序

    <多元回归程序MATLAB程序>由会员分享,可在线阅读,更多相关<多元回归程序MATLAB程序(45页珍藏版)>请在人人文库网上搜索. 1.程序MATLAB多元回归程序matl ...

  8. 关联矩阵古林法的matlab代码,[转载][原创]灰色关联分析及Matlab程序实现

    灰色系统理论由我国著名学者邓聚龙教授于1982提出.灰色关联分析是灰色系统理论的一个分支,应用灰色关联分析方法对受多种因素影响的事物和现象从整体观念出发进行综合评价是一个被广为接受的方法. 一.灰色关 ...

  9. matlab程序求尖锐度,业务名称

    有偿程序代写 QQ:122353503 霍夫曼编译码的仿真实现 任务书,开题报告,文献综述报告 电力机车主辅电路在线检测系统设计 蒙特卡罗方法 非周期信号的恢复 ,可能会用到非周期随机共振.duffi ...

最新文章

  1. 马化腾:微信将被谁颠覆,领衔下一代互联网的终端居然是?
  2. 动作捕捉技术,VR体验沉浸感的“助燃剂”
  3. scroll事件实现监控滚动条并分页显示示例(zepto.js)
  4. laravel模板写php代码,Laravel框架之blade模板新手入门教程及小技巧
  5. 前端用Sass实现星级评定效果,简单快捷实现星级切换。
  6. jdbc连接gp单例模式_JDBC连接备忘单
  7. intellij ide_UltraESB的首选IDE – IntelliJ IDEA
  8. 2.这就是搜索引擎:核心技术详解 --- 网络爬虫
  9. 对比python的进程和线程:多线程是假的
  10. 随机抽样一致性算法(RANSAC)示例及源代码
  11. 汇编语言debug的使用
  12. SSL/TLS中的DH算法、DHE算法、 ECDHE算法介绍
  13. Java 标识符的命名规则与规范
  14. Nginx文件系统:xxx-available文件与xxx-enabled文件的区别
  15. 【SQL Server 还原数据库】:因为数据库正在使用,所以无法获得对数据库的独占访问权
  16. 初识HTML(四)进阶:CSS基础、常用属性
  17. pg日期转周_PostgreSQL 日期/时间类型
  18. K8S组件介绍及安装
  19. 文件搜索神器everything 你不知道的技巧总结
  20. javascript的一点点学习记录

热门文章

  1. 在iOS上绘制自然的签名
  2. 解决Invalid numeric Value:Leading zeroes not allowed问题
  3. Java8 方法引用和Stream流
  4. TESB京东笛卡尔平台架构实践
  5. Comparison of Big Data OLAP DB : ClickHouse, Druid, and Pinot
  6. Fiddler win10 突然无法 抓包 解决方法
  7. C#如何添加PDF水印
  8. 电子银行回单管理实现方案(二)——电子银行回单自动凭证化
  9. Google Earth Engine(GEE)扩展——geetool中的的各类型的其它函数(字符串、数字、列表、字典、几何、特征、影像、地图和特征集合)
  10. html5视频旋转代码,HTML5 3D旋转的视频