NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9147|回复: 0
打印 上一主题 下一主题

[心得体会] 分形学习

[复制链接]
跳转到指定楼层
1m
发表于 2017-6-28 12:23:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

评分

参与人数 2强度 +5 照度 +18 收起 理由
剑鱼 + 2 + 3 感谢分享!
ly871108 + 3 + 15 感谢分享!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-4-29 18:06 , Processed in 0.149138 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表