博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Koch 分形,海岸线,雪花
阅读量:4599 次
发布时间:2019-06-09

本文共 1370 字,大约阅读时间需要 4 分钟。

此算法用于生成Koch分形(海岸线,雪花),速度快速,效果绚丽
//支持的初始直线水平角度为60 的倍数, 交换起点与终点坐标可改变生成方向void Koch(CDC *pDC, int x1, int y1, int x2, int y2, int n){	if (n > 0)	{		double k = 1.0*(y2 - y1) / (x2 - x1);		int x3 = (x2 - x1) / 3;		int y3 = (y2 - y1) / 3;		Koch(pDC, x1, y1, x1 + x3, y1 + y3, n - 1);		Koch(pDC, x2 - x3, y2 - y3, x2, y2, n - 1);		if (abs(k) <= 1e-6)		{			Koch(pDC, x1 + x3, y1, x1 + x3 + x3 / 2, y1 + sqrt(3.0) / 2 * x3, n - 1);			Koch(pDC, x1 + x3 + x3 / 2, y1 + sqrt(3.0) / 2 * x3, x2 - x3, y1, n - 1);		}		else if (k > 0)		{			Koch(pDC, x1, y2 - y3, x2 - x3, y2 - y3, n - 1);			Koch(pDC, x1 + x3, y1 + y3, x1, y2 - y3, n - 1);		}		else		{			Koch(pDC, x1 + x3, y1 + y3, x2, y1 + y3, n - 1);			Koch(pDC, x2, y1 + y3, x2 - x3, y2 - y3, n - 1);		}	}	else	{		pDC->MoveTo(x1, y1);		pDC->LineTo(x2, y2);	}}

调用:

int k = 4; //递归的深度	CPen pen, *oldpen;	pen.CreatePen(PS_SOLID, 1, RGB(255, 0,0 ));	oldpen = pDC->SelectObject(&pen);	Koch(pDC, 800, 150, 440, 150, k);	pen.DeleteObject();	pen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));	pDC->SelectObject(&pen);	Koch(pDC, 440, 200, 800, 200, k);	pen.DeleteObject();	pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));	pDC->SelectObject(&pen);	Koch(pDC, 200, 100, 300, 275, k);	Koch(pDC, 400, 100, 200, 100, k);	Koch(pDC, 300, 275, 400, 100, k);	pen.DeleteObject();	pDC->SelectObject(oldpen);

递归4次的效果图如下:

转载于:https://www.cnblogs.com/xyyh/p/3980316.html

你可能感兴趣的文章
linux常用命令2
查看>>
狼图腾
查看>>
13、对象与类
查看>>
Sublime Text3 个人使用心得
查看>>
jquery 编程的最佳实践
查看>>
MeetMe
查看>>
IP报文格式及各字段意义
查看>>
(转载)rabbitmq与springboot的安装与集成
查看>>
C2. Power Transmission (Hard Edition)(线段相交)
查看>>
STM32F0使用LL库实现SHT70通讯
查看>>
Atitit. Xss 漏洞的原理and应用xss木马
查看>>
MySQL源码 数据结构array
查看>>
(文件过多时)删除目录下全部文件
查看>>
T-SQL函数总结
查看>>
python 序列:列表
查看>>
web移动端
查看>>
pythonchallenge闯关 第13题
查看>>
linux上很方便的上传下载文件工具rz和sz使用介绍
查看>>
React之特点及常见用法
查看>>
【WEB前端经验之谈】时间一年半,或沉淀、或从零开始。
查看>>