NCF参数化建筑论坛

标题: 分形学习 [打印本页]

作者: crowncc    时间: 2017-6-28 12:23
标题: 分形学习
本帖最后由 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





欢迎光临 NCF参数化建筑论坛 (http://www.ncf-china.com/) Powered by Discuz! X3.2