openCV绘制简单Sierpinski(分形)图形
运行环境: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(分形)图形相关推荐
- python opencv 绘制简单图形
09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结 ...
- 【HTML5】在canvas上绘制简单的2D图形 (+太极图)
canvas(画布) canvas 元素是H5中新增的一个重要元素,专门用来绘制图形.在页面中放置一个canvas元素,就相当于在页面上放置一块画布,可以利用 canvas api 在其中进行图形的描 ...
- OpenCv绘制简单的几何图形
opencv常用绘制方法 前言 1.直线line line的函数原型如下 使用方法 2.箭头arrowedLine arrowedLine的函数原型如下 使用方法 3.矩形rectangle. rec ...
- 如何使用OpenCV绘制简单的几何图形?
要使用OpenCV绘制图形,除了cv2库之外,我们还需要便于进行矩阵操作的numpy库: import cv2 as cv import numpy as np 空白窗口 先展示代码: blank = ...
- autoCAD绘制简单三维立体图形
第一步: 首先绘制一个简单的(封闭的)二维图形: 第二步: 变换观察视角,比如修改为 变换后的视角: 第三步: 选中闭合图形边框,使用组合键"ctrl + shift + E",然 ...
- python简单的分形图片
康托集 查看全文 http://www.taodudu.cc/news/show-2782224.html 相关文章: python绘制分形图基础_python绘制分形图 python生成分形图片_如 ...
- autocad2007二维图画法_cad怎样绘制简单的二维图形
CAD绘制二维图形非常的简单,大家经常用它来画图,下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容,希望可以让大家有所收获! cad绘制简单二维图形的方法 1.绘图菜单绘图菜单是绘制图形最基 ...
- 最简单的分形图像生成算法
本文将提供一段完整地生成一幅分形图像文件的C语言代码,并且极为简单.我相信这应该是最简单的分形图像生成算法.大部分的分形图像代码也都很短,但一有递归迭代就难以理解了.而这段代码则很好懂,并且其生成的图 ...
- 利用matlab绘制简单IFS图形(Sierpinski三角形和BarnsleyFern巴恩斯利蕨)
利用matlab绘制简单IFS图形(Sierpinski谢尔宾斯基三角形和BarnsleyFern巴恩斯利蕨) 一.SierpinskiTriangle谢尔宾斯基三角形 谢尔宾斯基三角形(英语:Sie ...
最新文章
- html的后绑定事件,HTML 控件绑定事件
- Linux Test Project 测试套件说明
- 跪求AI编程语言--纯中文代码
- FD33里面的销售值不正确应该怎么办?
- Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field
- bzoj4009: [HNOI2015]接水果(整体二分)
- 【计数网络】梯度累加增加LCFCN的BatchSize
- 电力系统决策支持系统
- 【JAVA SE基础篇】24.包的机制和import详解
- 如何有效率的学习马克思主义基本原理概论
- neatdm路径_网易有爱插件设置教程-网易有爱插件游戏路径如何设置
- win7系统计算机文件夹缓慢,windows7搜索文件非常慢的解决办法以及优化方法
- 爬虫清洗:python strip()函数 去空格\n\r\t函数的用法
- NVIDIA GeForce G102M
- 王的机器第一本书「快乐机器学习」飨你
- 音视频系列九 使用soundTouch实现音视频变速
- python评价指标_详解分类评价指标和回归评价指标以及Python代码实现
- 今日金融词汇---金融衍生品,是什么?
- DBeaver修改默认存储sql文件的位置
- PDF文件转成图片保存