You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何对SquarifiedTreemap算法输出矩形取整适配1x1网格

解决SquarifiedTreemap浮点数矩形转整数网格的间隙/重叠问题

普通四舍五入或直接取整会导致尺寸误差累积,出现间隙或重叠,核心是要保证取整后的尺寸总和严格匹配网格总面积,同时避免独立计算坐标带来的错位。以下是两种实用方案:

1. 递进式坐标法(最稳妥,从根源避免间隙)

这种方法不单独计算每个矩形的起始坐标,而是基于前一个矩形的结束位置推导当前坐标,最后一个矩形直接用网格剩余空间填充:

针对你的横向排列示例(网格20x10):

  • 第一个矩形:(x:0, y:0, width:8, height:10)(取floor(8.41)),结束x坐标为0+8=8
  • 第二个矩形:起始x直接设为8,(x:8, y:0, width:7, height:10)(取floor(7.25)),结束x坐标为8+7=15
  • 第三个矩形:起始x设为15,宽度直接用网格总宽度减去15,即20-15=5,最终参数(x:15, y:0, width:5, height:10)

调整后总面积:8*10 +7*10 +5*10 =200,完全匹配网格面积,无间隙无重叠。

纵向排列场景同理:

每个矩形的起始y坐标 = 前一个矩形的y+height,最后一个矩形的高度 = 网格总高度 - 前一个的结束y坐标。

2. 误差分配优化法(更贴近原比例)

如果希望取整后的尺寸更贴近Treemap返回的原始比例,可以先统一用floor或ceil取整,再把总面积的差值分配给误差最大的几个矩形:

针对你的示例:

  1. 先对所有宽度取floor:8、7、4,总和19,与网格总宽度20差1
  2. 计算每个宽度的小数部分:0.41(第一个)、0.25(第二个)、0.35(第三个)
  3. 把差值1分配给小数部分最大的第一个矩形,宽度改为9
  4. 最终参数:
    (x:0, y:0, width:9, height:10)
    (x:9, y:0, width:7, height:10)
    (x:16, y:0, width:4, height:10)
    

总面积9*10+7*10+4*10=200,既填满网格,又更贴近原始比例。

关键注意事项

  • 绝对不要独立计算每个矩形的x/y坐标,必须基于前一个的结束位置推导,彻底避免重叠和间隙
  • 优先处理同一排列方向的尺寸(横向处理宽度,纵向处理高度),再用剩余空间补全最后一个元素

内容的提问来源于stack exchange,提问作者suchoparek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:03:17