求助:如何对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取整,再把总面积的差值分配给误差最大的几个矩形:
针对你的示例:
- 先对所有宽度取
floor:8、7、4,总和19,与网格总宽度20差1 - 计算每个宽度的小数部分:0.41(第一个)、0.25(第二个)、0.35(第三个)
- 把差值1分配给小数部分最大的第一个矩形,宽度改为9
- 最终参数:
(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
相关产品推荐
相关产品推荐

