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

正方形定位计算公式需求及现有代码优化技术问询

正方形阶梯排列定位公式与代码优化

需求背景

需按阶梯样式排列正方形:中心正方形最大,向左右两侧依次缩小,每个正方形的尺寸比前一个小固定的缩进常量。定位时已知以下参数:

  • 当前正方形尺寸
  • 中心正方形尺寸
  • 中心相对索引(...-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;
}

精准定位公式推导

核心逻辑:每个正方形的位置偏移量与中心相对索引成正比,同时结合尺寸变化确保阶梯均匀:

  1. 中心相对索引:distance = CenterIndex - index(正为左侧,负为右侧)
  2. 当前正方形尺寸:size = 中心尺寸 - Indent * |distance|
  3. 基础位置:当前正方形中心对齐容器中心时的左坐标 → baseLeft = MaxWidth/2 - size/2
  4. 位置偏移量:通过中心相对索引计算,确保均匀阶梯 → offset = distance * Indent
  5. 最终左坐标: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;
}

代码优化点

  1. 移除经验值:完全基于已知参数计算,定位逻辑严谨可预测
  2. 减少冗余计算:预计算中心尺寸,直接推导当前尺寸,避免重复调用GetCardSize
  3. 可读性提升:变量名统一,逻辑分层清晰
  4. 线性偏移:通过distance * Indent实现均匀阶梯,符合需求中“中心相对索引调整位置”的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:08:11