|  | 
 
| 本帖最后由 crowncc 于 2017-6-28 12:36 编辑 
 
 建模的分形和分形属于两个学科的事物,建模不需要完全理解分形数学公式背后的每一个符号的来源和意义,只要搞清楚规律就可以做出一个相似的事物,同样一个纯的数学概念也不能死板的用于建筑学中,否则会导致无意义的形式主义和死板的空间感受,数学与建筑毕竟是两个学科,不宜去本末倒置的研究,因此凡是运用数学概念衍生出的建筑炒作的意味远比实际运用的大,和装逼没什么区别,因为纯数学概念也只能忽悠到那些非数学专业的人,给人感觉高大上罢了。不过数学是一切科学的基础,研究数学还是可以提高个人对世界理解深度和扩展个人思维模式。
 以下为GH中C#实现分形模拟的实现方式
 private void RunScript(double radius, int loopNum, ref object A)
 {
 
 //建立初始三角
 Polyline plTrangle00 = triangle00(radius);
 
 //建立成果pl线数组
 List<Polyline> plResult = new List<Polyline>();
 
 //将第一个三角形放入成果数组
 plResult.Add(plTrangle00);
 
 //迭代分形
 for(int i = 0;i <= loopNum;i++)
 {
 List<Polyline> plTemp = reBuildTri(plResult);//分形结果放入临时数组
 plResult.AddRange(plTemp);//添加分形后三角形
 plTemp.Clear();//清空临时数组
 }
 
 A = plResult;//输出
 
 }
 
 // <Custom additional code>
 //创建初始三角方法
 public Polyline triangle00(double radius)
 {
 List<Point3d> ptsListA = new List<Point3d>();//建立一个点数列
 
 Point3d pt00 = new Point3d(0, 0, 0);//原点
 //ptsListA.Add(pt00);//植入数列
 Point3d pt01 = new Point3d(0, radius * (-1), 0);//第一个点
 ptsListA.Add(pt01);//植入数列
 Point3d pt02 = new Point3d(0, radius, 0);
 pt02.Transform(Rhino.Geometry.Transform.Rotation(Math.PI / 3, pt00));//第二个点
 ptsListA.Add(pt02);//植入数列
 Point3d pt03 = new Point3d(0, radius, 0);
 pt03.Transform(Rhino.Geometry.Transform.Rotation(Math.PI / (-3), pt00));//第三个点
 ptsListA.Add(pt03);//植入数列
 
 Polyline plTrangle0 = new Polyline();//建立pl线
 
 //将每个点植入pl线
 foreach(Point3d pt in ptsListA)
 {
 plTrangle0.Add(pt);
 }
 plTrangle0.Add(ptsListA[0]);//增加一个起始点使曲线可以闭合三角形
 
 return plTrangle0;//输出三角形
 }
 
 //分形方法
 public List<Polyline> reBuildTri(List<Polyline> pls)
 {
 List<Polyline> trianglelist = new List<Polyline>();
 
 List<Polyline> triList = new List<Polyline>();
 //遍历数组中每一个三角形
 foreach(Polyline pl in pls)
 {
 //拆分轮廓重建三角
 //第一段线段三个点
 Point3d ptStart01 = pl.PointAt(0.0);
 Point3d ptCenter01 = pl.PointAt(0.5);
 Point3d ptEnd01 = pl.PointAt(1.0);
 
 //第二段线段三个点
 Point3d ptStart02 = pl.PointAt(1.0);
 Point3d ptCenter02 = pl.PointAt(1.5);
 Point3d ptEnd02 = pl.PointAt(2.0);
 
 //第三段线段三个点
 Point3d ptStart03 = pl.PointAt(2.0);
 Point3d ptCenter03 = pl.PointAt(2.5);
 Point3d ptEnd03 = pl.PointAt(3.0);
 
 //拆分三角形后重组一次三角形
 //建立第一个三角形的数组
 List<Point3d> ptsList01 = new List<Point3d>();
 ptsList01.Add(ptStart01);
 ptsList01.Add(ptCenter01);
 ptsList01.Add(ptCenter03);
 ptsList01.Add(ptEnd03);
 //建立第二个三角形的数组
 List<Point3d> ptsList02 = new List<Point3d>();
 ptsList02.Add(ptCenter01);
 ptsList02.Add(ptEnd01);
 ptsList02.Add(ptCenter02);
 ptsList02.Add(ptCenter01);
 //建立第三个三角形的数组
 List<Point3d> ptsList03 = new List<Point3d>();
 ptsList03.Add(ptCenter03);
 ptsList03.Add(ptCenter02);
 ptsList03.Add(ptEnd02);
 ptsList03.Add(ptCenter03);
 
 //根据点建立第一个三角形
 Polyline plTrangle01 = new Polyline();//建立pl线
 foreach(Point3d pt in ptsList01)
 {
 plTrangle01.Add(pt);
 }
 //根据点建立第二个三角形
 Polyline plTrangle02 = new Polyline();//建立pl线
 foreach(Point3d pt in ptsList02)
 {
 plTrangle02.Add(pt);
 }
 //根据点建立第三个三角形
 Polyline plTrangle03 = new Polyline();//建立pl线
 foreach(Point3d pt in ptsList03)
 {
 plTrangle03.Add(pt);
 }
 //建立一个三角形组
 
 triList.Add(plTrangle01);
 triList.Add(plTrangle02);
 triList.Add(plTrangle03);
 }
 trianglelist.AddRange(triList);
 
 return trianglelist;
 }
 
 C:\Users\user\Desktop\EPS\QQ截图20170628121551.jpg
 
 | 
 评分
查看全部评分
 |