跳转至

连续放置序列数学

GFPlacementSequenceMath 根据已经确认的放置点或格子预测下一次候选位置。它适合编辑器画刷、关卡摆放、运行时生成序列、棋盘/方块模板连续铺排等场景;框架只返回纯数据报告,不创建节点、不加载场景,也不决定碰撞、重叠、撤销或吸附策略。

var report := GFPlacementSequenceMath.predict_next_position_2d([
    Vector2(120.0, 80.0),
    Vector2(160.0, 96.0),
], Vector2.ZERO, {
    "max_step_length": 96.0,
})

if report["ok"]:
    var next_position: Vector2 = report["position"]

预测规则

连续位置和离散格子使用同一套稳定规则:

  • 没有历史值时返回 fallbackmode == MODE_FALLBACK
  • 只有一个历史值时复用最后一次位置,mode == MODE_REPEAT_LAST
  • 至少两个历史值时使用 last + (last - previous)mode == MODE_EXTRAPOLATED

2D / 3D 连续位置分别使用 predict_next_position_2d()predict_next_position_3d();离散格子分别使用 predict_next_cell_2d()predict_next_cell_3d()

步长限制

连续位置预测支持 max_step_length。当最近两次放置距离过大时,工具会把外推步长限制到该长度并在报告里写入 clamped == true。小于等于 0 的值表示不限制;NaN 或 Inf 会被当作 0 处理,避免诊断报告或 JSON 输出传播非法数值。

var clamped := GFPlacementSequenceMath.predict_next_position_3d(
    [Vector3.ZERO, Vector3(10.0, 0.0, 0.0)],
    Vector3.ZERO,
    { "max_step_length": 2.5 }
)

返回报告

连续位置报告包含 okmodepositionstepsource_countvalid_countignored_invalid_countclampedmax_step_lengtherror。离散格子报告包含 okmodecellstepsource_countvalid_countignored_invalid_counterror

连续位置会忽略包含 NaN 或 Inf 的历史点;如果没有可用历史且 fallback 也无效,报告会返回 ok == false,并把候选位置收敛到零向量。

使用边界

GFPlacementSequenceMath 不保存历史,也不判断预测结果是否可放置。项目层应负责维护放置历史、处理旋转/缩放、执行网格吸附、检测占用或碰撞,并在需要时把结果交给 GFEditorCommand、对象池、发射器或自己的运行时生成系统。