splitAndSetbackPerimeter 操作

语法

  • splitAndSetbackPerimeter(splitOffset) { length1 : depth1 : operations1 | ... | lengthn-1 : depthn-1 : operationsn-1 } { remainder : operations }
  • splitAndSetbackPerimeter(splitOffset) { length1 : depth1 : operations1 | ... | lengthn-1 : depthn-1 : operationsn-1 }* { remainder : operations }
  • splitAndSetbackPerimeter(splitOffset, firstEdgeIndex, selectedEdgesMask) { length1 : depth1 : operations1 | ... | lengthn-1 : depth1n-1 : operations1n-1 } { remainder : operations }
  • splitAndSetbackPerimeter(splitOffset, firstEdgeIndex, selectedEdgesMask ) { length1 : depth1 : operations1 | ... | lengthn-1 : depthn-1 : operationsn-1 }* { remainder : operations }

参数

  1. splitOffset - 浮点型
    分割模式起点的偏移。 相对运算符 ' 允许相对于所有选定边的总长度的值。
  2. firstEdgeIndex - 浮点型
    分割模式开始处的边的索引(从 0 开始)。 过大索引或负索引将模回绕为正确索引。 默认值为 0。
  3. selectedEdgesMaskbool[]
    一个数组,其中包含每个面边的布尔值,用于确定该边是否为操作的一部分。 默认情况下,将选择所有边。
  4. length - 浮点型
    分割长度。 根据前缀,沿面周长的长度可用以下方式解释:
    • 无前缀(绝对)- 边部分的长度将正好为 length
    • '(相对)- 边部分的长度将为 length* 所有选定边的总长度
    • ~(浮动)- 使用 ~ 前缀,具有绝对维度的分割部分之间的剩余空间将自动调整。 如果在一个分割内定义了多个浮动部分,则将按比例对维度进行加权。
  5. depth
    边部分的退缩距离。
  6. operations
    要在新创建的形状上执行的形状操作的顺序。
  7. *
    重复切换按钮:重复切换按钮触发已定义分割的重复操作,并进行尽可能多的重复。 将调整重复次数和浮动维度以适合最佳解决方案(最佳重复次数和最小拉伸)。
  8. remainder : operations
    对面的其余部分执行的一系列形状操作。

描述

splitAndSetbackPerimeter 操作结合了 splitsetback 操作的概念:首先根据指定的 lengths 将面的周长分割成多个部分。 然后,根据其各自的 depth 对每个部分进行退缩。 最后,针对每个部分以及面的其余部分生成一个新形状。

默认情况下,将沿面的整个周长计算分割模式,从第一条边开始,围绕面逆时针进行。 可以使用 splitOffset 移动分割模式的起点。 要使用独立于基础几何索引顺序的操作,可以设置 firstEdgeIndexselectedEdgesMask,通常使用评估空间环境的函数(参见以下示例)。 从技术上讲,可以通过设置 firstEdgeIndex 和传递 selectedEdgesMask 来将操作限制为周长的一部分。 在这种情况下,可将所选边排列成一个链,在该链上完成分割。 数组必须采用面-边顺序,即第一个元素是指第一个面的第一条边,第二个元素是指第一个面的第二条边,以此类推。 将单独为每个面考虑共享边。 如果数组未包含足够的元素,则认为不应选择相应的缺失面边。 如果数组包含的元素数大于面边总数,则将忽略对应的元素。 可使用 comp 函数构造此类数组,其中 component 选择器设置为 fe(面边)。

相关内容

示例

Basic

Lot --> splitAndSetbackPerimeter(6) 
    { 40 : 5 : Yellow |
      20 : 10 : Blue  } 
    { remainder : Grey }

Yellow --> color("#F2BB1D")
Blue   --> color("#3957A5")
Grey   --> color("#CAC9C6")
基础 splitOffset

相对 splitOffset

分割模式的起点偏移周长的 10%(红色箭头)。 请注意,splitOffset 允许分割模式在边,而非折点上开始和结束。

Lot --> splitAndSetbackPerimeter('0.1) 
    { '0.5  : 10 : extrude(15) Yellow |
      ~1    : 0  : NIL                |
      '0.4  : 8  : extrude(10) Blue   |
      ~1    : 0  : NIL                } 
    { remainder : Grey }
相对 splitOffset

使用基于上下文的函数来选择边

可以使用 firstEdgeIndexselectedEdgesMask 参数对以周长前边为中心的部分进行退缩。 在本例中,compsortIndices 函数以及 pivot attribute 用于查找最左侧的前边的索引并构造边选择掩膜。

const INF = 100000

// (8)[0.0,16.5,INF,INF,INF,INF,INF,-15.0]
frontXCoords = comp(fe) { front : pivot.px | all : INF }

// 7
frontLeftMostEdgeIndex = sortIndices(frontXCoords)[0]

// (8)[true,true,false,false,false,false,false,true]
frontEdgesMask = comp(fe) { front : true }

Lot --> splitAndSetbackPerimeter(0,
            frontLeftMostEdgeIndex, frontEdgesMask)
    { ~1   : 0  : NIL                |
     '0.7  : 10 : extrude(12) Yellow | 
      ~1   : 0  : NIL                } 
    { remainder : Grey }
使用基于上下文的函数来选择边

退缩距离

将对周长进行重复分割并按随机距离对其进行退缩。 请注意,将针对每个部分单独评估退缩距离。

Lot --> splitAndSetbackPerimeter(0) 
    { ~30 : rand(3, 15) : extrude(rand(2, 10)) Yellow }*
    { remainder : Grey }
随机分割和退缩

将对周长进行重复分割并基于 split attribute 对其进行退缩。

Lot --> splitAndSetbackPerimeter(0) 
    { ~30 : split.index : extrude(split.index) Yellow }*
    { remainder : Grey }

处理重叠

黄色和蓝色形状重叠。 重叠属于使用较大 depth 生成的形状,并与其他形状相隔。

Left --> splitAndSetbackPerimeter(3) 
    { 2 : 6 : Yellow | 2 : 0 : NIL | 2 : 4 : Blue }
    {remainder : Grey }
    
Right --> splitAndSetbackPerimeter(3) 
    { 2 : 4 : Yellow | 2 : 0 : NIL | 2 : 6 : Blue }
    { remainder : Grey }
悬挂重叠

另请参阅分割操作以获取有关分割模式的更多示例。


在本主题中