运行环境:openCV4 C++ X64

对于分形图像一般具有一个主要性质
自相似性
分形图形的局部和整体一般具有相似的结构,细节上具有递归的特性,细节可以达到无限小,但是可以预测。

我们利用这个性质不难发现,使用递归的程序结构是解决问题简单的方法。

1.绘制Sierpinski三角形

目标三角形:

1.1分析图形:

对于一个分形三角形不难发现元,也就是最基本的图形。一个大三角形被分为了四个相同的部分。然后对处于三个顶点的小三角形在进行依次分割。
如图所示

黑色的部分就是一个元三角形,对其递归操作就类似于在三个顶点的三角形处插入相似的三角形。当对左上角进行递归操作结果如绿线所示。(省略剩下两个三角形)

由此我们可见每此递归过程都是操作三个子三角形,并产生中间一个空三角形。递归的深度等于任意方向上的三角形个数。

例如题目中的递归深度为6

1.2画图

一个三角形在平面中可以由唯一的三个点确定。

在三个点之间连线可以绘制一个大三角形。
定义三个点分别为p1,p2,p3代表三个顶点。
找到三个中点 a , b , c

我们分别对△p₁ac , △ap₂b, △cbp₃这三个三角形进行相同的操作就可以完成图形的绘制了。

1.3代码实现

int SeparateTriangle(int n, Point p1, Point p2, Point p3)
{if (n == 0) return 0;  //递归出口line(mat, p1, p2, Scalar(255, 255, 0),2); //选择颜色和像素粗细 分别连接三条线line(mat, p2, p3, Scalar(255, 255, 0),2);line(mat, p1, p3, Scalar(255, 255, 0),2);SeparateTriangle(n-1, p1,( (p1 + p2) / 2), ((p1 + p3) / 2)); //左上角三角形;SeparateTriangle(n-1, (p1 + p2) / 2, p2, (p2 + p3) / 2);     //左下脚三角形SeparateTriangle(n-1, (p1 + p3) / 2, (p2 + p3) / 2, p3);     //左下脚三角形}

1.4程序结果

n=6


n=7

2绘制Sierpinski地毯

目标图形:

2.1分析图形

这个地毯图形与三角形不同,三角学是由线段组成,但是地毯是有填充的,将棕色视作填充,或将白色作为填充会有两个不同的结果。
1.将棕色视为填充,即每次画出图中的白色部分,但是当绘制更深一层元图形时,会发现我们中间的部分是默认不操作的,所以进入递归画元时需要将当前区域全部变为底色,在进行绘制。这样做操作冗余,处理大面积的图像时会消耗时间。
2.将白色视为填充,即每次画出上图的中间部分,在现实生活中就像是扣去最中间的一块,不需要进行其他操作。所以选用这一种方案。

2.2画图

一个矩形在平面中也可以由唯一的三个点确定。

对于一个元将其分为9块,需要对外部的8块进行相同的操作。纯粹利用坐标的计算费事费力。这里我们引入向量。如图:


设传入坐标为p₁,p₂,p₃,则令
dx=(p₃-p₁)/3
dy=(p₂-p₁)/3
则大矩形的8个小矩形分别为
▭p₁, p₁+dx, p₁+dy ;
▭p₁+dx, p₁+2dx, p₁+dy;

以此类推。
对传入的三个点进行递归操作可以得出结果。

2.3代码实现

int DarwCarpat(int n, Point p1, Point p2, Point p3)
{   if (n == 0) return 0;                  //递归出口int i, j, ilim, jlim;i = (p3.x - p1.x) / 3+p1.x;            //计算当前矩形绘制区域的x起始坐标ilim = (p3.x - p1.x) / 3 * 2+p1.x;     //x的结束坐标j = (p2.y - p1.y) / 3+p1.y;            //y的起始坐标jlim = (p2.y - p1.y) / 3 * 2+p1.y;     //y的结束坐标for (int t = i; t < ilim;t++) {  for (int c = j; c < jlim; c++) {   //逐点将颜色改为白色mat.at<Vec3b>(c, t)[0] = 255;mat.at<Vec3b>(c, t)[1] = 255;mat.at<Vec3b>(c, t)[2] = 255;}}Point dx, dy;       //设置向量dx = (p3 - p1) / 3;dy = (p2 - p1) / 3;//利用向量对8个分型进行递归处理DarwCarpat(n - 1, p1, p1 + dy, p1 + dx);                      //左上DarwCarpat(n - 1, p1 + dx, p1 + dx + dy, p1 + 2 * dx);       //左中DarwCarpat(n - 1, p1 + 2*dx, p1 + 2*dx + dy, p1 + 3 * dx);  //左右DarwCarpat(n - 1, p1 + dy, p1 + 2*dy, p1 + dx + dy);                           //中左DarwCarpat(n - 1, p1 + dy+ 2 * dx, p1 + 2 * dy + 2 * dx, p1 + 3*dx + dy);       //中右DarwCarpat(n - 1, p1+2*dy, p1 + 3*dy, p1 + dx + 2 * dy);                         //右上DarwCarpat(n - 1, p1 + dx + 2 * dy, p1 + dx + 3*dy, p1 + 2 * dx + 2 * dy);       //右中DarwCarpat(n - 1, p1 + 2 * dx + 2 * dy, p1 + 2 * dx + 3*dy, p1 + 3 * dx + 2 * dy);    //右下}

2.4程序结果

递归深度n=3

递归深度n=4

openCV绘制简单Sierpinski(分形)图形相关推荐

  1. python opencv 绘制简单图形

    09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结 ...

  2. 【HTML5】在canvas上绘制简单的2D图形 (+太极图)

    canvas(画布) canvas 元素是H5中新增的一个重要元素,专门用来绘制图形.在页面中放置一个canvas元素,就相当于在页面上放置一块画布,可以利用 canvas api 在其中进行图形的描 ...

  3. OpenCv绘制简单的几何图形

    opencv常用绘制方法 前言 1.直线line line的函数原型如下 使用方法 2.箭头arrowedLine arrowedLine的函数原型如下 使用方法 3.矩形rectangle. rec ...

  4. 如何使用OpenCV绘制简单的几何图形?

    要使用OpenCV绘制图形,除了cv2库之外,我们还需要便于进行矩阵操作的numpy库: import cv2 as cv import numpy as np 空白窗口 先展示代码: blank = ...

  5. autoCAD绘制简单三维立体图形

    第一步: 首先绘制一个简单的(封闭的)二维图形: 第二步: 变换观察视角,比如修改为 变换后的视角: 第三步: 选中闭合图形边框,使用组合键"ctrl + shift + E",然 ...

  6. python简单的分形图片

    康托集 查看全文 http://www.taodudu.cc/news/show-2782224.html 相关文章: python绘制分形图基础_python绘制分形图 python生成分形图片_如 ...

  7. autocad2007二维图画法_cad怎样绘制简单的二维图形

    CAD绘制二维图形非常的简单,大家经常用它来画图,下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容,希望可以让大家有所收获! cad绘制简单二维图形的方法 1.绘图菜单绘图菜单是绘制图形最基 ...

  8. 最简单的分形图像生成算法

    本文将提供一段完整地生成一幅分形图像文件的C语言代码,并且极为简单.我相信这应该是最简单的分形图像生成算法.大部分的分形图像代码也都很短,但一有递归迭代就难以理解了.而这段代码则很好懂,并且其生成的图 ...

  9. 利用matlab绘制简单IFS图形(Sierpinski三角形和BarnsleyFern巴恩斯利蕨)

    利用matlab绘制简单IFS图形(Sierpinski谢尔宾斯基三角形和BarnsleyFern巴恩斯利蕨) 一.SierpinskiTriangle谢尔宾斯基三角形 谢尔宾斯基三角形(英语:Sie ...

最新文章

  1. html的后绑定事件,HTML 控件绑定事件
  2. Linux Test Project 测试套件说明
  3. 跪求AI编程语言--纯中文代码
  4. FD33里面的销售值不正确应该怎么办?
  5. Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field
  6. bzoj4009: [HNOI2015]接水果(整体二分)
  7. 【计数网络】梯度累加增加LCFCN的BatchSize
  8. 电力系统决策支持系统
  9. 【JAVA SE基础篇】24.包的机制和import详解
  10. 如何有效率的学习马克思主义基本原理概论
  11. neatdm路径_网易有爱插件设置教程-网易有爱插件游戏路径如何设置
  12. win7系统计算机文件夹缓慢,windows7搜索文件非常慢的解决办法以及优化方法
  13. 爬虫清洗:python strip()函数 去空格\n\r\t函数的用法
  14. NVIDIA GeForce G102M
  15. 王的机器第一本书「快乐机器学习」飨你
  16. 音视频系列九 使用soundTouch实现音视频变速
  17. python评价指标_详解分类评价指标和回归评价指标以及Python代码实现
  18. 今日金融词汇---金融衍生品,是什么?
  19. DBeaver修改默认存储sql文件的位置
  20. PDF文件转成图片保存

热门文章

  1. 3轴码垛机械臂运动学逆解
  2. Core Text 实践:自定义每个字的位置
  3. CSS中flex的用法( 学习笔记 )
  4. 高刷显示器变成24Hz的原因及解决方法
  5. Win11设置共享文件的方法
  6. 本体开发日记07-我与java分词组件的爱恨情仇
  7. 对List中的map的key按中文拼音进行排序。
  8. 罗克韦尔PLC编程软件ControlLogix平台
  9. 学画画要花多少钱_孩子学画画大约需要多少钱呢?
  10. 2022安好? 2023何如?