ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#写的雪花分形

2020-10-20 05:31:48  阅读:222  来源: 互联网

标签:p1 length Point C# 雪花 int 分形 new Math


C#都没人用了吗,网上想找个现成的雪花分形代码,都没找见,有C++,有python,有java的,就没有C#的,自己试试写一个吧。

 1 public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void Form1_Paint(object sender, PaintEventArgs e)
 9         {
10             //DrawTree(e.Graphics);
11             DrawKochSnow(e.Graphics);
12         }
13 
14         /// <summary>
15         /// 递归画分形树
16         /// </summary>
17         /// <param name="root">树根的位置</param>
18         /// <param name="angle">树枝的角度</param>
19         /// <param name="length">树枝的长度</param>
20         /// <param name="width">树枝的宽度</param>
21         /// <param name="g">Graphics对象</param>
22         private void Tree(Point root, double angle, double length, float width, Graphics g)    // 分形树
23         {
24             if (width < 1) width = 1;
25             if (length < 15) return;    // 差不多树枝尽头的时候停止绘制
26             Point point = new Point(root.X + (int)(length * Math.Cos(angle)), root.Y - (int)(length * Math.Sin(angle)));
27             Pen pen = new Pen(Brushes.Green, width);
28             g.DrawLine(pen, root, point);
29             Tree(point, angle + Math.PI / 7, length * 0.8, width * 0.8f, g);   // 递归画左半个,这里可以修改参数,画出不同形状的树
30             Tree(point, angle - Math.PI / 7, length * 0.8, width * 0.8f, g);   // 递归画右半个
31         }
32 
33         private void DrawTree(Graphics g)
34         {
35             int treeWidth = 10;
36             Point origin = new Point(this.Width / 2 - treeWidth / 2, this.Height - 150);    // 取窗体最下边靠上面点的中间位置作树根点
37             Tree(origin, Math.PI / 2, 100, treeWidth, g);    // 画分形树
38         }
39 
40         private void ZheXian(Point p1, Point p2, Graphics g)    // 4条基本线段组成的折线
41         {
42             Point p3 = new Point(p1.X + (p2.X - p1.X) / 3, p1.Y + (p2.Y - p1.Y) / 3);    // 三等分点坐标
43             Point p4 = new Point(p1.X + (p2.X - p1.X) * 2 / 3, p1.Y + (p2.Y - p1.Y) * 2 / 3);    // 三等分点坐标
44             Point p4XD3 = new Point(p4.X - p3.X, p4.Y - p3.Y);    // p4相对于p3点的坐标
45             //int x = (int)(p4XD3.X * Math.Cos(Math.PI / 3) - p4XD3.Y * Math.Sin(Math.PI / 3));
46             //int y = (int)(p4XD3.X * Math.Sin(Math.PI / 3) + p4XD3.Y * Math.Cos(Math.PI / 3));
47             // 注意计算机的屏幕垂直坐标和数学上相反,所以数学上逆时针旋转在计算机上相当于顺时针旋转
48             int x = (int)Math.Round(p4XD3.X * Math.Cos(Math.PI / 3) + p4XD3.Y * Math.Sin(Math.PI / 3));
49             int y = (int)Math.Round(p4XD3.Y * Math.Cos(Math.PI / 3) - p4XD3.X * Math.Sin(Math.PI / 3));
50             Point p5XD3 = new Point(x, y);    // 凸起点p5相对于p3点的坐标
51             Point p5 = new Point(p3.X + x, p3.Y + y);    // p5相对于原点的坐标
52             Pen pen = new Pen(Brushes.Black, 1);
53             double length = Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2)) / 3;
54             //Console.WriteLine(length);
55             if (length > 20)    // 通过最终线段长度可以控制迭代
56             {
57                 ZheXian(p1, p3, g);
58                 ZheXian(p3, p5, g);
59                 ZheXian(p5, p4, g);
60                 ZheXian(p4, p2, g);
61             }
62             else
63             {
64                 g.DrawLine(pen, p1, p3);
65                 g.DrawLine(pen, p3, p5);
66                 g.DrawLine(pen, p5, p4);
67                 g.DrawLine(pen, p4, p2);
68             }
69         }
70 
71         private void DrawKochSnow(Graphics g)    // 科赫雪花(瑞典人科赫于1904年提出了著名的“雪花”曲线)
72         {
73             int length = 480;
74             Point origin = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);
75             g.FillEllipse(Brushes.Blue, new RectangleF(origin, new Size(10, 10)));
76             // 计算三角形的顶点让其中心和窗体的中心重合
77             Point A = new Point(origin.X - length / 2, (int)(origin.Y + length / (2 * Math.Sqrt(3))));
78             Point B = new Point(origin.X, (int)(origin.Y - length / Math.Sqrt(3)));
79             Point C = new Point(origin.X + length / 2, (int)(origin.Y + length / (2 * Math.Sqrt(3))));
80             ZheXian(A, B, g);
81             ZheXian(B, C, g);
82             ZheXian(C, A, g);
83         }
84     }

虽然可能写的不咋的,还是分享一下吧,大神请轻点喷。

标签:p1,length,Point,C#,雪花,int,分形,new,Math
来源: https://www.cnblogs.com/chengyb/p/13844249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有