当前位置: 首页 > news >正文

用 C# 绘制谢尔宾斯基垫片

谢尔宾斯基垫片是一个三角形,分解成多个小三角形,如右图所示。有几种方法可以生成这种垫片。这里展示的方法是其中一种比较令人惊讶的方法。

程序从三个点开始(图中圆圈所示)。“当前位置”从其中一个点开始。为了生成后续点,程序会随机选择一个点,并从当前位置移动到该点的一半。重复多次后,垫圈就会神奇地开始出现。

示例程序使用以下代码来绘制分形。

// Add 1000 points to the gasket.
private void tmrDraw_Tick(object sender, EventArgs e)
{// Draw points.Random rand = new Random();using (Graphics gr = this.CreateGraphics()){// Draw the corners.foreach (PointF pt in Corners){gr.FillEllipse(Brushes.White, pt.X - 2, pt.Y - 2, 4, 4);gr.DrawEllipse(Pens.Blue, pt.X - 2, pt.Y - 2, 4, 4);}// Draw 1000 points.for (int i = 1; i <= 1000; i++){int j = rand.Next(0, 3);LastPoint = new PointF((LastPoint.X + Corners[j].X) / 2,(LastPoint.Y + Corners[j].Y) / 2);gr.DrawLine(Pens.Red, LastPoint.X, LastPoint.Y,LastPoint.X + 1, LastPoint.Y + 1);}}
}

每次tmrDraw计时器计时,代码都会绘制 1,000 个点。程序使用计时器,以便程序可以刷新其绘图。它每次绘制 1,000 个点以提高性能。

对于这 1,000 个点中的每一个,代码都会选择一个随机点,并将变量LastPoint从其当前位置移动到选定点的一半。代码用一条小线标记该点(因为这比绘制小圆圈更快,也比绘制单个像素更容易。)

要重新启动垫圈,请调整大小或隐藏并恢复表格。

绘制谢尔宾斯基垫片(无论如何作为奇异吸引子)的常用方法是从 3 个角开始。要生成一个点,请随机选择一个角,然后移动到当前位置和所选角之间的一半。

此示例可让您在运行时选择角点。左键单击表单以选择至少 2 个点。然后右键单击以启动程序运行。该程序使用以下代码绘制修改后的垫圈

// Draw 1,000 points.
private void tmrDraw_Tick(object sender, EventArgs e)
{// Draw points.Random rand = new Random();using (Graphics gr = this.CreateGraphics()){// Draw the corners.foreach (PointF pt in Corners){gr.FillEllipse(Brushes.White, pt.X - RADIUS,pt.Y - RADIUS, 2 * RADIUS, 2 * RADIUS);gr.DrawEllipse(Pens.Blue, pt.X - RADIUS,pt.Y - RADIUS, 2 * RADIUS, 2 * RADIUS);}// Draw 1000 points.for (int i = 1; i <= 1000; i++){int j = rand.Next(0, Corners.Count);LastPoint = new Point((LastPoint.X + Corners[j].X) / 2,(LastPoint.Y + Corners[j].Y) / 2);gr.DrawLine(Pens.Blue, LastPoint.X, LastPoint.Y,LastPoint.X + 1, LastPoint.Y + 1);}}
}

要获得一些有趣的结果,请尝试:

  • 使用构成矩形的四个角。
  • 使用不等边三角形。
  • 使用三角形并在靠近中间的同一位置添加 4 或 5 个“角”。
  • 尝试具有重复角的其他排列。

http://www.lryc.cn/news/518659.html

相关文章:

  • java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
  • 双因素身份验证技术在NPI区域邮件安全管控上的解决思路
  • java后端对接飞书登陆
  • 记录一次Android Studio的下载、安装、配置
  • 直流无刷电机控制(FOC):电流模式
  • 73.矩阵置零 python
  • 垃圾收集算法
  • SQL-leetcode-262. 行程和用户
  • 太原理工大学软件设计与体系结构 --javaEE
  • Leetcode 139. 单词拆分 动态规划
  • python异常机制
  • 运行爬虫时可能遇到哪些常见问题?
  • BGP与CN2的区别 详解两者在网络传输中的应用与优势
  • Spring 项目 基于 Tomcat容器进行部署
  • “负载均衡”出站的功能、原理与场景案例
  • 02-51单片机数码管与矩阵键盘
  • 不同方式获取音频时长 - python 实现
  • 【python A* pygame 格式化 自定义起点、终点、障碍】
  • 12_Redis发布订阅
  • 归并排序:数据排序的高效之道
  • 【redis初阶】浅谈分布式系统
  • CatLog的使用
  • 头歌python实验:网络安全应用实践-恶意流量检测
  • 大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
  • 如何用 Python 实现简单的 AI 模型?
  • 单片机-直流电机实验
  • python【数据结构】
  • 详解Sonar与Jenkins 的集成使用!
  • 《笔记》青蛙跳台阶——斐波那契数列
  • SpringBoot3动态切换数据源