细分分割

通过将较大的几何对象分割为较小的几何对象,可以使用分割操作对形状进行建模并设置几何。 分割操作对于使用 CGA 形状规则创建设计而言至关重要。 分割的基本定义为:

split(axis){size : operations}

有关详细信息,请参阅 CGA 分割操作

 

以下示例展示了不同类型的分割操作:

  • 绝对分割、
  • 相对分割、
  • 浮动分割和
  • 重复分割。

以下示例以介绍性规则开始,然后针对每种分割类型提供示例。

Lot --> s(5, 1, 1)
        primitiveCube()
        Blue(1)
Blue(height) --> s('1, 'height, '1)
                 color("#84C0fC")

在此介绍性规则中,我们将调整初始范围的大小,并在该范围内插入一个立方体。 该范围的 x 维度(立方体的长度)将设置为 5。 该范围的 y 和 z 维度将设置为 1。 Blue 规则将使用相关运算符 ’ 来调整该范围相对于 scope.sy 的 y 维度(立方体的高度)大小。 由于规则参数 height 设置为 1,立方体的高度将保持不变。

使用所插入立方体调整了大小的范围

绝对分割

绝对分割将以绝对值切割几何。

split(x) { 3 : Blue } 操作将沿范围的 x 维度分割几何。 系统将以 3 个单位的绝对值切割长度为 5 的立方体,并将其替换为连续的立方体形状 Blue

Lot --> s(5, 1, 1)
        primitiveCube()
        split(x) { 3 : Blue(1) }
绝对分割

此示例展示了使用两个绝对分割值(绿色为 3 个单位,蓝色为 1 个单位)后出现的情况。 分割后,所生成的总长度为 3+1=4。

Lot --> s(5, 1, 1)
        primitiveCube()
        split(x) { 3 : Green(1)
                 | 1 : Blue(0.5) }
两个绝对分割

本示例展示了(有限)范围内绝对值的影响。 所生成形状 Yellow 的长度为 1 而非 2,原因是总长度为 5。 最右边的形状 Blue 将不会生成。

split(x) { 2 : Green(1)  |
           1 : Green(1)  |
           1 : Blue(0.5) |
           2 : Yellow(2) |
           1 : Blue(1)   }
有限范围内的绝对值

系统不会使用大小为负或零的值生成分割。 两个 Yellow 形状均不会生成。 Blue 以 1.5 开始。 最后的 Green 形状将在总长度 5 处停止。

split(x) { 1.5 : Green(1)  |
            -2 : Yellow(1) |
           1.5 : Blue(0.5) |
           1.5 : Green(1)  |
             0 : Yellow(1) |
           1.5 : Green(1)  }
没有使用大小为负或零的值的分割

相对分割

相对分割将使用相对于范围大小的比例而非绝对值。 相对值将用运算符 ' 来表示,后跟一个介于 0 和 1 之间的值。

本示例将使用黄金分割比率来切割范围。

split(x) { '0.382 : A | '0.618 : B }

A --> split(x) { '0.382 : Green(1)  | 
                 '0.618 : Yellow(2) }
B --> split(x) { '0.382 : Green(1)  | 
                 '0.618 : Yellow(2) }
使用黄金分割比率切割范围的递归分割

本示例展示了使用黄金分割比率的递归分割。 当几何变得过小而无法进一步分割时,递归将停止。

split(x) { '0.382 : A | '0.618 : B }

A --> split(x) { '0.382 : A         | 
                 '0.618 : C         }
B --> split(x) { '0.382 : B         | 
                 '0.618 : D         }
C --> split(x) { '0.382 : Green(1)  | 
                 '0.618 : Yellow(2) }
D --> split(x) { '0.382 : Green(1)  | 
                 '0.618 : Yellow(2) }
使用黄金分割比率的递归分割

浮动分割

浮动分割将通过调整值来填充整个空间。 浮动分割将由运算符 ~ 进行表示。

在此示例中,split 操作会将长度为 5 的立方体以 3 个单位进行分割 (green)。 随后系统将以 1 个单位切割其余的几何。 这次系统将使用浮点运算符 ~,该运算符将在第一次切割的剩余空间上扩展 1 个单位,即 5-3=2 个单位 (blue)。

split(x) { 3 : Green(1) |
          ~1 : Blue(2)  }
浮动分割

浮动值 2 将填充两个绝对值(蓝色为 1 个单位)之间的空间(黄色为 3 个单位)。

split(x) { 1 : Blue(1.5) |
          ~2 : Yellow(1) |
           1 : Blue(0.5) }
浮动值将填充空间

采用相同单位(每个 1.5)的多个浮动分割将均匀分布在剩余的范围空间(2 个单位)上。

split(x) {   3 : Green(1)  |
          ~1.5 : Blue(0.5) |
          ~1.5 : Blue(2)   }
均匀分布的多个浮动分割

三个浮动分割将均匀分布。

split(x) { 3 : Green(1)  |
          ~2 : Blue(0.5) |
          ~2 : Blue(2)   |
          ~2 : Blue(1)   }
三个浮动分割

如果没有用于浮动分割的剩余空间,则不会生成相应的形状(在这种情况下为 Blue)。

split(x) { 5 : Green(1) |
          ~1 : Blue(1)  }
未生成形状的浮动分割

重复分割

重复分割将用于重复给定范围内的几何。 该分割将创建一种节奏:重复使用一组几何对象来建立可识别的模式。 一个典型的方案是在普通高层办公大楼的立面上交替排列窗户和圆柱。 括号后的星号 * 表示重复分割。

在第一个示例中,长度为 10 的范围将用绝对长度为 2 的绿色形状重复填充。 该范围内恰好有 5 个长度为 2 的立方体。

Lot --> s(10, 1, 1)
        primitiveCube()
        split(x) { 2 : Green(1) }*

浮动值为 2.1 将生成相同的结果,原因是分割为 5 个后续形状(每个长度为 2)后,结果仍然能最接近目标长度 2.1。

split(x) { ~2.1 : Green(1) }*
用 5 个长度为 2 的立方体填充范围的重复分割

浮动重复分割(绿色)将与两个绝对分割(蓝色)边界相邻。 注意,浮动分割的结果长度为 (10-2)/3≈2.66,这是目标值 2.5 的最佳近似结果。

split(x) {    1 : Blue(2)     | 
         { ~2.5 : Green(1) }* | 
              1 : Blue(3)     }
与两个绝对分割边界相邻的重复分割

系统将首先独立于表示重复的那一侧分割来评估重复绝对分割(绿色)。 浮动分割不会导致生成任何空间。

split(x) {  { 2 : Green(1) }* | 
             ~1 : Blue(2)     }
split(x) {   ~1 : Blue(2)     | 
         {    2 : Green(1)    }*}
没有空间可用于浮动分割的重复分割

此示例显示,具有绝对(或相对)值的重复分割能够与两个相邻的浮动(或绝对)分割边界相邻。

split(x) { ~1 : Green(1)     | 
         {  2 : Blue(0.5) }* | 
           ~1 : Green(1)     }
与两个绝对分割边界相邻的重复分割

第一个浮动分割的大小将与重复浮动分割的大小相同。 2 个单位将被平均分配 4 次(蓝色),得到的长度为 (10-3)/4=1.75。

split(x) { ~2 : Blue(1)    | 
         {  1 : Green(2)   | 
           ~2 : Blue(1) }* }
对相同大小进行浮动分割和重复分割的重复分割

重复分割 - 模式

重复操作可用于创建模式。 以下示例表明,您可以将几何对象分组到括号中并重复。

系统将创建并重复一个模式。

split(x) {  ~1 : Yellow(2) | 
          0.25 : Green(1)  | 
            ~1 : Yellow(2) }*
使用重复模式的重复分割

重复模式可在其他几何中插入。

split(x) {  1 : Blue(3)      |
         { ~1 : Yellow(2)    | 
          0.2 : Green(1)     | 
           ~1 : Yellow(2) }* |
            1 : Blue(3)      }
在其他几何中插入的重复模式

重复分割 - 并行

重复分割可以并行执行。

两个与浮动分割(绿色)边界相邻的重复分割(黄色和蓝色)

split(x) { ~1 : Green(1)     | 
         { ~1 : Yellow(2) }* |
           ~1 : Green(1)     | 
         { ~1 : Blue(2)   }* |
           ~1 : Green(1)     }
两个与浮动分割边界相邻的重复分割

两个与绝对分割(蓝色)边界相邻的连续重复分割(绿色和黄色)。

split(x) { 1 : Blue(2)      | 
         { 2 : Green(1) }*  | 
         { 1 : Yellow(1) }* |
           1 : Blue(3)      }
两个与绝对分割边界相邻的重复分割