|
本帖最后由 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
|
评分
-
查看全部评分
|