splitArea 操作

语法

  • splitArea(axis) { area1 : operations1 | area2 : operations2 | ... | arean-1 : operationsn-1 }
  • splitArea(axis) { area1 : operations1 | area2 : operations2 | ... | arean-1 : operationsn-1 }*
  • splitArea(axis, adjustMode) { area1 : operations1 | ... | arean-1 : operationsn-1 }
  • splitArea(axis, adjustMode) { area1 : operations1 | ... | arean-1 : operationsn-1 }*

参数

  1. axis - selector
    { x | y | z } - 分割时随沿的轴的名称。 这相对于局部坐标系(即,scope)。
  2. adjustMode
    { adjust | noAdjust } - 用于控制所计算形状的范围计算的可选选择器。 默认设置是将范围调整为几何的边界框。 使用 noAdjust 可以避免这种情况,因此生成的形状的范围将无缝填充父项的范围。
  3. area - float
    分割面积。 当前形状分割为生成的形状具有指定面积。 根据前缀,area 解释如下:
    • 无前缀(绝对)- 新形状具有完全相同的 area
    • '(相对)- 新形状大小将为 area * 当前几何面积
    • ~(浮动)- 使用 ~ 前缀,具有绝对维度的分割部分之间的剩余空间将自动调整。 如果在一个分割内定义了多个浮动部分,则将按比例对维度进行加权。
  4. operations
    要在新创建的形状上执行的形状操作的顺序。
  5. *
    重复切换按钮:重复切换按钮触发已定义分割的重复操作(分割为当前形状的 scope),并进行尽可能多的重复。 将调整重复次数和浮动维度以适合最佳解决方案(最佳重复次数和最小拉伸)。

描述

splitArea 操作用于沿指定 scope 轴将当前形状几何细分成几何面积由 area 参数指定的一组形状。 此操作适用于平面 2D 几何以及近平面几何。 非平面几何会降低面积精度。 此操作不适用于 3D 几何,例如网格或高度非平面几何。

对于每个指定的 area,将使用垂直于分割轴的平面切割当前形状几何,以使生成的形状包含具有指定面积的几何。

可使用可选重复切换按钮 * 多次重复 { ... }* 块中的内容,直到其在选定轴方向上完全适合范围维度。

相关内容

示例

颜色

这些规则适用于在以下示例中使用的颜色。

Red     -->                          // red
   color(1, 0, 0)                       
   print("area(R) = " + geometry.area)

Yellow  -->                         // yellow
   color(1, 1, 0)                       
   print("area(Y) = " + geometry.area)

Green   -->                         // green
   color(0, 1, 0)                       
   print("area(G) = " + geometry.area)

Cyan    -->                         // cyan
   color(0, 1, 1)                      
   print("area(C) = " + geometry.area)

Blue    -->                         // blue
   color(0, 0, 1)                       
   print("area(B) = " + geometry.area)

Magenta -->                         // magenta
   color(1, 0, 1)                      
   print("area(M) = " + geometry.area)

Pink    -->                         // semi-transparent pink
   color(1, 0.5, 0.5, 0.3)

此形状分割成两部分。 第一部分为原始面积的 70%,第二部分为原始面积的 30%。 请注意,指定面积数量的总和不需要为 1。 如果总和小于 1,将删除形状的其余部分,将忽略大于 1 的分割部分。

Lot -->
   print("total area = " + geometry.area)
   splitArea(x) { '0.7 : Green
                | '0.3 : Yellow }
分割成两个部分的形状面积部分总和不等于 1

重复分割

此分割使用重复分割将形状划分成五个等积部分。 它会重复将形状分割成面积等于初始面积 20% 的几个部分。 请注意,如果面积设置为 '0.3,将获得面积等于原始面积的 30%、30%、30% 和 10% 的四个部分。

Lot -->
   print("total area = " + geometry.area)
   splitArea(x) { '0.2 : ColorMe }*

ColorMe -->
   case split.index == 0 :
      Red
   case split.index == 1 :
      Yellow
   case split.index == 2 :
      Green
   case split.index == 3 :
      Cyan
   else :
      Blue
重复分割部分显示 5 个等积部分的表

使用浮动和绝对面积进行分割

此分割用于将形状划分成具有绝对面积 600 的中间部分(黄色)以及两个面积相同的侧部分。 黄色部分由两部分组成,因为原始形状中有一个孔,分割会沿孔边界剪切形状。

Lot -->
   print("total area = " + geometry.area)	
   splitArea(x) { ~1  : Green
                | 600 : Yellow
                | ~1  : Blue
具有浮动面积和绝对面积的分割两部分绝对,两部分浮动

嵌套分割

此嵌套分割首先会在 x 方向上划分形状,以获取三个等积部分。 然后,在 z 方向上将每个部分划分成两个相等部分。 这将生成六个等积部分。

Lot -->
   print("total area = " + geometry.area)	
   splitArea(x) { ~1 : splitArea(z) { '0.5 : Red
                                    | '0.5 : Yellow }
                | ~1 : splitArea(z) { '0.5 : Green
                                    | '0.5 : Cyan }
                | ~1 : splitArea(z) { '0.5 : Blue
                                    | '0.5 : Magenta }
                }
嵌套分割嵌套分割表

adjust 与 noAdjust

这是原始形状及其范围。

原始形状和范围

如果未指定 adjustSelector 的值,则默认行为是将范围大小调整为每个分割部分的几何。 每个粉色框显示每个分割部分的范围。 范围会保留原始范围的方向,但是会缩减为几何的边界框。

SplitAdjust -->
   splitArea(x) 
      { '0.2 : splitArea(z) 
      { '0.2 : SplitLeaf }* }*

SplitLeaf-->
   color(0.5, 0.5, 0.5)
   Geometry.
   primitiveQuad()
   t(0, 0.02, 0)
   Pink
   comp(e) { all : color(0, 0, 0) Edge. }
调整为分割部分大小的范围几何

如果使用 noAdjust,则每个分割部分范围的并集将组成原始范围。 范围不会调整为几何内部。

 SplitNoAdjust -->
   splitArea(x, noAdjust) 
      { '0.2 : splitArea(z, noAdjust) 
      { '0.2 : SplitLeaf }* }*
组成原始范围的范围并集

将区块拆分成多个相等部分

这是原始形状及其范围。 下面是如何使用 splitArea 操作将街区拆分成多个等积地块的示例。

原始范围

将使用 splitArea 以递归的方式拆分块。 每个分割会将形状垂直于其最长轴划分成两个等积部分。 将根据面积对每个地块进行着色,这样具有相同面积的地块会具有相同的颜色。 使用 splitArea 时,所有地块为黄色,因为区块划分为等积地块。

Lot -->
   SplitArea(3)

SplitArea(n) -->
   case n == 0 :
      A
   case scope.sz > scope.sx :
      splitArea(z) { ~1 : SplitArea(n-1)
                   | ~1 : SplitArea(n-1) }
   else :
      splitArea(x) { ~1 : SplitArea(n-1)
                   | ~1 : SplitArea(n-1) }

A -->
   color(getColor)
   print("area(A) = " + geometry.area)
	
// color by area 
// (so that lots with same area get same color)
const minArea = 243
const maxArea = 1255
alpha = (geometry.area - minArea)/
              (maxArea - minArea)
getColor = colorRamp("spectrum", alpha)
划分为相等部分的区块显示每个区块面积的表

与之相比,使用分割操作时,地块颜色不同,因为区块划分为面积不同的地块。

Lot2 -->
   Split(3)

Split(n) -->
   case n == 0 :
      B
   case scope.sz > scope.sx :
      split(z) { ~1 : Split(n-1)
               | ~1 : Split(n-1) }
   else :
      split(x) { ~1 : Split(n-1)
               | ~1 : Split(n-1) }

B -->
   color(getColor)
   print("area(B) = " + geometry.area)
划分为不相等部分的地块显示不相等部分面积的表