热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用C#GDI+绘制多重黄金矩形

前段时间翻译的文章《(翻译)布局和矩形中的应用黄金分割比率》中介绍了如何绘制黄金矩形,并给出了1到5重黄金分割矩形的绘制图形,

  前段时间翻译的文章《(翻译)布局和矩形中的应用黄金分割比率》中介绍了如何绘制黄金矩形,并给出了1到5重黄金分割矩形的绘制图形,如下图所示。于是想在C#中用GDI+程序绘制黄金矩形。
在这里插入图片描述
  从左往右看上述黄金矩形,从中发现绘制规律。首先看到绘制的矩形的大小,按数列排列的话为1、1、2、3、5,可以看到这符合 斐波那契数列的排列,也就是下一重矩形的边长为前两重矩形边长之和。
  再看绘制矩形时的左上角坐标,从上图可以看出,从第二个图到第五个图是一个循环:以左边第一个图为基准,先右边画一个矩形,再在整个图形下方画一个矩形,再在整个图形左侧画一个矩形,再在整个图形上方画一个图。后续就是重复这个循环了。
  主要的绘图代码如下:

//pGoldenRect为绘图控件//记录待绘制的下个图矩形的左上角坐标m_startX &#61; pGoldenRect.Width / 2;m_startY &#61; pGoldenRect.Height / 2;//保留整个图形的左上角坐标及高宽int originX &#61; 0;int originY &#61; 0;int totalHeight &#61; 0;int totalWidth &#61; 0;//计算斐波那契数列int n1 &#61; 1;int n2 &#61; 1;int n3 &#61; 0;//记录上上轮、上轮和本轮的int n1Length &#61; baseUnit;int n2Length &#61; baseUnit;int n3Length &#61; baseUnit;GraphicsPath gp &#61; new GraphicsPath();gp.AddRectangle(new Rectangle(m_startX, m_startY, n1Length, n1Length));originX &#61; m_startX;originY &#61; m_startY;totalHeight &#61; n1Length;totalWidth &#61; n1Length;m_startX &#61; m_startX &#43; n1Length;gp.AddRectangle(new Rectangle(m_startX, m_startY, n2Length, n2Length));totalWidth &#61; n1Length &#43; n2Length;for (int i &#61; 2; i < drawLoop; i&#43;&#43;){n3 &#61; n1 &#43; n2;switch (i%4){case 1:m_startX &#61; m_startX &#43; n2Length;n3Length &#61; n3 * baseUnit;totalWidth &#43;&#61; n3Length;break;case 2:m_startX &#61; m_startX - n1Length; m_startY &#43;&#61; n2Length;n3Length &#61; n3 * baseUnit;totalWidth &#61; n3Length;totalHeight &#43;&#61; n3Length;break;case 3: m_startY -&#61; n1Length;n3Length &#61; n3 * baseUnit;m_startX &#61; m_startX - n3Length;originX &#61; m_startX;originY &#61; m_startY;totalWidth &#61; n3Length &#43; n2Length;totalHeight &#61; n3Length;break;case 0:n3Length &#61; n3 * baseUnit;m_startY -&#61; n3Length;originY &#61; m_startY;totalHeight &#43;&#61; n3Length;break;}gp.AddRectangle(new Rectangle(m_startX, m_startY, n3Length, n3Length));n1 &#61; n2;n2 &#61; n3;n1Length &#61; n2Length;n2Length &#61; n3Length;}g.DrawPath(new Pen(m_goldenColor, 1), gp);

  程序执行效果如下&#xff1a;
在这里插入图片描述
  能绘制单个的黄金矩形&#xff0c;就可以接着绘制水平黄金矩形网格和垂直黄金矩形网格&#xff0c;各位朋友可以试试。

参考文献&#xff1a;
[1]https://uxmovement.com/content/applying-the-golden-ratio-to-layouts-and-rectangles/
[2]https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
author-avatar
Shaw
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有