基于迭代思想的设计生成

1.背景

作为算法设计中的一种基本方法,迭代思想往往涉及一个循环结构,使一组操作在一定条件下重复执行,直到满足终止条件为止。这作为关键的思维工具在搜索、排序、循环等场景中运用。

迭代思想广泛运用于诸如万花筒、图形细分等图形创作之中,而通过将常见含迭代思想的二维图形赋予空间点信息并作相应循环处理,便可以实现三维空间效果的创建,如下图所示。

        

二维递归图形的三维空间化(基于Processing平台)
import peasy.PeasyCam;
PeasyCam cam;

int p = 4;
PVector[] pts = new PVector[p];
float d = 0.05;
int space = 25;

PVector pt = new PVector(1000, 1000);

void setup() {
  size(800, 800, P3D);
  cam = new PeasyCam(this, 1500);
    
  for (int i=0; i<p; i++) {
      pts[i]=pt.copy().rotate(TWO_PI/p*i);
  }
}


void draw() {
  background(0);
  recursive(pts, 40);
}


void recursive(PVector[] v, int iteration) {
   if (iteration > 0) {
      PVector[] v2 = new PVector[v.length];
      for (int i=0; i<v.length; i++){
         v2[i]=PVector.lerp(v[i], v[(i+1)%v.length], d); 
      }

      stroke(255, 150);
      strokeWeight(1);
      for (int i=0; i<v.length; i++) {
         point(v[i].x, v[i].y, iteration*space);
         line(v[i].x, v[i].y, iteration*space, v[(i+1)%p].x, v[(i+1)%p].y, iteration*space);
         line(v[i].x, v[i].y, (-iteration+1)*space, v[(i+1)%p].x, v[(i+1)%p].y, (-iteration+1)*space);
         line(v[i].x, v[i].y, iteration*space, v[(i+1)%p].x, v[(i+1)%p].y, (-iteration+1)*space);
      }
      
      recursive(v2, iteration -1);
   }


}

本项目尝试将该思想迁移至建筑设计生成领域,区分于简单的图形/复制操作,期望生成具有一定迭代层级性与形式复杂度的三维模型。

2.原型构建

考虑到体现迭代层级性这一基本目标,我们不由得想到了分支结构这一基本原型,即各代成员相互联系,具有鲜明的层次区分。

分支结构原型
def loop1(p,flag,w,h):	# p为起始点,flag为迭代次数,w,h则为随迭代调整相应位置的函数
    global xmax,ymax,xmin,ymin
    if p.X>xmax:xmax=p.X;
    if p.Y>ymax:ymax=p.Y;
    if p.Y<ymin:ymin=p.Y;
    
    if flag>0 :
        w*=random()*0.05+0.4751;	# 加入随机数控制y轴(宽度)变化幅度
        h*=random()*0.15+1.05;		# 加入随机数控制x轴(高度)变化幅度
        flag-=1;

        deltw=0.55
        delth=1.20

        if flag==0:
            p1=rs.VectorCreate((bound,p.Y+3*w*deltw,p.Z),(0,0,0));
        else:
            p1=rs.VectorCreate((p.X+h*delth,p.Y+3*w*deltw,p.Z),(0,0,0));
        arr1.append(p);
        arr2.append(p1);
        
        
        if flag==0:
            p2=rs.VectorCreate((bound,p.Y-3*w*deltw,p.Z),(0,0,0));
        else:
            p2=rs.VectorCreate((p.X+h*delth,p.Y-3*w*deltw,p.Z),(0,0,0));
        arr1.append(p);
        arr2.append(p2);
        loop1(p1,flag,w,h);
        loop1(p2,flag,w,h);
        

loop1(p0,flag,w,h)

首先便需要在代码上将这一基本原型实现,并通过函数关系控制点距形成层级区分,考虑到一定的构成丰富性需求,在部分参数加入一定比例的随机数的控制。如上图所示,最终能在生成关系合理的平面分支图形。

3.几何形式

为了使得分支间的线条呈现更具设计感的形态,对逐层迭代点间加以函数及边界控制,并考虑z轴上的变化,使得线条过渡衔接更平滑,而不同的函数对整体呈现的造型有较大的影响,故以下是对分支结构的形式演化进行的对比探讨,:

3.1 圆形造型

  

import rhinoscriptsyntax as rs
from math import sin
from math import cos
PI=3.1415926


p=arr1
u=(p.X-xmin)/(xmax-xmin)					
v=(p.Y-ymin)/(ymax-ymin)*2.0-1.0
x=r*u*cos(PI/3.0*v)
y=r*u*sin(PI/3.0*v)
z=hmax*cos(PI/2*u)
arr=rs.VectorCreate((x,y,z),(0,0,0))
3.2 中心对称的流线型造型

 

import rhinoscriptsyntax as rs
from math import sin
from math import cos
from math import tan
PI=3.1415926


p=arr1
u=(p.X-xmin)/(xmax-xmin)
v=(p.Y-ymin)/(ymax-ymin)*2.0-1.0
x=r*u*tan(PI/(2*v+5)*v)
y=r*u*cos(PI/2.0*v)
z=hmax*cos(PI/2*u)
arr=rs.VectorCreate((x,y,z),(0,0,0))

4. 三维模型生成

增加厚度
增加厚度
曲面覆盖
赋以孔洞

利用grasshopper相关模块处理迭代数据信息,对迭代生成的线条进行厚度控制、曲面覆盖并逐层赋以孔洞最终生成图形如下:

经本次的项目研究,可以预见,结合了函数计算生形的迭代分支结构,在建筑结构与形体的表现上具有一定的价值,再结合rhino-grasshopper平台基础上,通过修改相应参数与表达式能够高效实现丰富的造型生成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值