拆分操作可用于建模形状并通过将较大的几何对象拆分为较小的对象来设置几何。拆分操作是使用 CGA 形状规则创建设计的核心。拆分的基本定义是:

拆分(轴){大小:操作}

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

以下示例显示了不同类型的拆分操作:

  • 绝对分裂,
  • 相对分裂,
  • 浮动拆分和
  • 重复拆分。

以下是从介绍性规则开始的示例,然后是每种拆分类型的示例。

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

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

GUID-26CD415F-C80A-4BB4-BC6C-4663DA040274-web
 

绝对分割

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

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

Lot --> s(5, 1, 1)
        primitiveCube()
        split(x) { 3 : Blue(1) }
GUID-83A56CCC-9330-4FD2-B2FF-DF82E36F1F5B-web

此示例显示如果使用两个绝对分割值(绿色 3 个单位和蓝色单位 1 个)会发生什么。拆分后的总长度为 3+1=4。

Lot --> s(5, 1, 1)
        primitiveCube()
        split(x) { 3 : Green(1)
                 | 1 : Blue(0.5) }
GUID-AD3FAA7A-56DE-4706-8A05-537A5C30FA6D-web

此示例显示了(有限)范围内绝对值的影响。生成的黄色形状的长度为 1 而不是 2,因为总长度为 5。不会生成最右边的蓝色形状。

split(x) { 2 : Green(1)  |
           1 : Green(1)  |
           1 : Blue(0.5) |
           2 : Yellow(2) |
           1 : Blue(1)   }
GUID-A94C9799-6C65-40D9-943D-F0EBE7F8A180-web

不会产生带有负值或零大小值的拆分。两个黄色形状都不会生成。蓝色从 1.5 开始。最后一个绿色形状在总长度为 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)  }
GUID-C23333A3-3AF0-49BB-9E7A-7C04451CB8B4-web
 

相对分割

相对拆分使用相对于范围大小而不是绝对值的比例。相对值由运算符后跟 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) }
GUID-14EFC287-87A3-4340-9551-196A18FCCC3D-web

此示例显示了使用黄金分割率的递归拆分。当几何体变得太小而无法进一步拆分时,递归停止。

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) }
GUID-B2202336-9ECB-4F42-ADF1-D8EA47AC7AF6-web
 

浮动拆分

浮动拆分会调整值,以便填充整个空间。浮动拆分由运算符~表示。

在此示例中,拆分操作将长度为 5 的立方体拆分为 3 个单位(绿色)。然后以 1 个单位切割剩余的几何形状。这次使用浮动运算符~将 1 单位扩展到第一次切割的剩余空间,即 5-3=2 单位(蓝色)。

split(x) { 3 : Green(1) |
          ~1 : Blue(2)  }
GUID-12344317-0ED9-49DC-BD01-6232F9943CD6-web

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

split(x) { 1 : Blue(1.5) |
          ~2 : Yellow(1) |
           1 : Blue(0.5) }
GUID-3D93B82E-6F11-4729-B392-D1AA545F6061-web

具有相同单位(每个 1.5)的多个浮动拆分均匀分布在剩余的作用域空间(2 个单位)上。

split(x) {   3 : Green(1)  |
          ~1.5 : Blue(0.5) |
          ~1.5 : Blue(2)   }
GUID-9318125C-81C7-4290-A1BB-B06BDC595315-web

三个浮动分裂均匀分布。

split(x) { 3 : Green(1)  |
          ~2 : Blue(0.5) |
          ~2 : Blue(2)   |
          ~2 : Blue(1)   }
GUID-C174872A-7CEA-4DD5-AF3C-1C538EEB80CA-web

如果没有为浮动拆分留下空间,则不会生成相应的形状(在这种情况下为蓝色)。

split(x) { 5 : Green(1) |
          ~1 : Blue(1)  }
GUID-E1282BAD-4E20-45D8-A2C7-19566BAB298F-web
 

重复拆分

重复拆分用于在给定范围内重复几何图形。它创造了一种节奏:重复使用一组几何对象以建立可识别的模式。一个典型的场景是普通高层写字楼立面的窗户和柱子的交替布置。括号后的星号*表示重复拆分。

在第一个示例中,长度为 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) }*
GUID-D340598C-1442-4126-A240-DCA658040881-web

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

split(x) {    1 : Blue(2)     | 
         { ~2.5 : Green(1) }* | 
              1 : Blue(3)     }
GUID-17CF9728-3B8B-4663-A1C1-C9B462508224-web

重复绝对分割(绿色)将首先独立地在分割的哪一侧表示重复进行评估。浮动拆分不会生成任何空间。

split(x) {  { 2 : Green(1) }* | 
             ~1 : Blue(2)     }
split(x) {   ~1 : Blue(2)     | 
         {    2 : Green(1)    }*}
GUID-966CCC97-BD03-46BD-9C25-DA915087EF7E-web

此示例显示具有绝对(或相对)值的重复拆分可以以两个相邻的浮动(或绝对)拆分为边界。

split(x) { ~1 : Green(1)     | 
         {  2 : Blue(0.5) }* | 
           ~1 : Green(1)     }
GUID-FF900F35-004F-4764-BC23-0941D9DB9C69-web

第一次浮动拆分的大小和重复浮动拆分的大小相同。这 2 个单位平均分布 4 倍(蓝色)到 (10-3)/4=1.75 的结果长度。

split(x) { ~2 : Blue(1)    | 
         {  1 : Green(2)   | 
           ~2 : Blue(1) }* }
GUID-352F6D0E-9190-44EC-9359-D00157B437F2-web
 

重复拆分 – 模式

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

创建并重复一个模式。

split(x) {  ~1 : Yellow(2) | 
          0.25 : Green(1)  | 
            ~1 : Yellow(2) }*
GUID-207B9937-25E9-4DA4-95EF-1DEFA515C737-web

可以在其他几何图形中插入重复图案。

split(x) {  1 : Blue(3)      |
         { ~1 : Yellow(2)    | 
          0.2 : Green(1)     | 
           ~1 : Yellow(2) }* |
            1 : Blue(3)      }
GUID-5A57358A-8BCF-4E46-954B-CA7FC141957C-web
 

重复拆分 – 平行

重复拆分可以并行执行。

两个重复分割(黄色和蓝色)以浮动分割(绿色)为边界。

split(x) { ~1 : Green(1)     | 
         { ~1 : Yellow(2) }* |
           ~1 : Green(1)     | 
         { ~1 : Blue(2)   }* |
           ~1 : Green(1)     }
GUID-D957C7B9-F296-49FE-A0D9-8BC43E5345E4-web

两个连续的重复分割(绿色和黄色)以绝对分割(蓝色)为界。

split(x) { 1 : Blue(2)      | 
         { 2 : Green(1) }*  | 
         { 1 : Yellow(1) }* |
           1 : Blue(3)      }
GUID-F910233B-5443-4A63-A5CA-A3745225C24F-web