正方形定位计算公式需求及现有代码优化技术问询
正方形阶梯排列定位公式与代码优化
需求背景
需按阶梯样式排列正方形:中心正方形最大,向左右两侧依次缩小,每个正方形的尺寸比前一个小固定的缩进常量。定位时已知以下参数:
- 当前正方形尺寸
- 中心正方形尺寸
- 中心相对索引(
...-2,-1,0,1,2...,0为中心) - 实际索引(
0,1,2,3...) - 缩进常量(相邻正方形的尺寸差值)
要求定位公式必须包含中心相对索引的乘法,用于调整位置偏移。
原始代码问题
原始代码中使用了目测的经验值0.5,导致定位逻辑不严谨,排列效果无法精准控制:
Float GetCardPosition(Int Index) { var Distance = CenterIndex - Index; // index relative to the center var Size = GetCardSize(index); var CardCenter = Size / 2; var Center = MaxWidth / 2; var CenterIndent = Indent / 2; var CardPos = Center - CardCenter; var Pos = (CardCenter + CenterIndent * Math.abs(Distance) * 0.5) * Distance; return CardPos - Pos; }
精准定位公式推导
核心逻辑:每个正方形的位置偏移量与中心相对索引成正比,同时结合尺寸变化确保阶梯均匀:
- 中心相对索引:
distance = CenterIndex - index(正为左侧,负为右侧) - 当前正方形尺寸:
size = 中心尺寸 - Indent * |distance| - 基础位置:当前正方形中心对齐容器中心时的左坐标 →
baseLeft = MaxWidth/2 - size/2 - 位置偏移量:通过中心相对索引计算,确保均匀阶梯 →
offset = distance * Indent - 最终左坐标:
baseLeft - offset(左侧左移,右侧右移)
优化后的代码
float GetCardPosition(int index) { // 计算中心相对索引:正为左侧,负为右侧 int distance = CenterIndex - index; // 预获取中心正方形尺寸,避免重复计算 float centerSize = GetCardSize(CenterIndex); // 直接计算当前正方形尺寸,替代GetCardSize(index),保证逻辑一致 float size = centerSize - Indent * Math.Abs(distance); // 容器中心X坐标 float containerCenter = MaxWidth / 2f; // 基础位置:当前正方形中心对齐容器中心的左坐标 float baseLeft = containerCenter - size / 2f; // 偏移量:基于相对索引的线性偏移,无经验值 float offset = distance * Indent; // 最终左坐标:左侧左移,右侧右移 return baseLeft - offset; }
代码优化点
- 移除经验值:完全基于已知参数计算,定位逻辑严谨可预测
- 减少冗余计算:预计算中心尺寸,直接推导当前尺寸,避免重复调用
GetCardSize - 可读性提升:变量名统一,逻辑分层清晰
- 线性偏移:通过
distance * Indent实现均匀阶梯,符合需求中“中心相对索引调整位置”的要求
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

