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

如何实现整数位置与30单元网格的双向映射?

0-990整数空间与30网格的双向映射优化方案

咱先捋清楚这个映射的核心需求:把0到990的整数全量映射到30个网格里,再从网格索引反向映射回原空间的中点位置。看你贴的代码最后有点截断,不过没关系,先分析现有逻辑里的小问题,再给你调整后的严谨实现:

现有代码的不一致问题

你写的两个方法里,正向映射用了990 / 29,反向映射用了990 / 30,这会导致双向映射的区间跨度不统一:

  • 正向映射的区间跨度是整数除法990/29=34,意味着前29个网格各包含34个数,最后一个网格只包含4个数(987-990)
  • 反向映射的跨度是33,计算出的中点和正向映射的区间实际中点不匹配,比如网格29的实际区间是986-990,中点是988,但反向映射算出来是29*33+16.5=973.5,偏差很明显。

修正后的统一实现逻辑

要保证双向映射的一致性,我们需要让正向和反向用同一个跨度计算,同时处理好边界值(比如990这个点):

完整代码实现

using System;
public class Program {
    // 正向映射:原空间整数位置 → 网格索引(0-29)
    public static int MapToGrid(int pos = 123) {
        // 总范围是990,分成30个网格,用浮点除法避免截断误差
        float gridSpan = 990f / 30;
        // 计算网格索引,用强制转换取整
        int gridIdx = (int)(pos / gridSpan);
        // 确保索引不会超出0-29的范围(比如pos=990时会算出30,这里修正为29)
        return Math.Clamp(gridIdx, 0, 29);
    }

    // 反向映射:网格索引 → 原空间的中点位置(返回浮点保证精度)
    public static float MapToSpace(int idx = 10) {
        float gridSpan = 990f / 30;
        // 每个网格的起始位置是idx*span,中点就是起始位置加上半个跨度
        return idx * gridSpan + gridSpan / 2;
    }

    public static void Main() {
        Console.WriteLine("每个网格的跨度:" + (990f/30));
        Console.WriteLine("位置990对应的网格:" + MapToGrid(990));
        Console.WriteLine("网格29对应的中点:" + MapToSpace(29));
        // 验证双向映射一致性:取网格中点映射回去,再映射回网格应该得到原索引
        float midPoint = MapToSpace(15);
        int gridBack = MapToGrid((int)Math.Round(midPoint));
        Console.WriteLine("网格15中点映射回网格:" + gridBack);
    }
}

关键调整说明

  • 统一跨度计算:用990f/30=33作为网格跨度,正向和反向映射都用这个值,保证逻辑一致
  • 边界处理:用Math.Clamp确保pos=990时不会得到超出范围的网格索引30,强制修正为29
  • 精度保证:用浮点除法替代整数除法,避免截断导致的区间划分偏差

测试结果参考

运行上面的代码,你会得到这样的输出:

每个网格的跨度:33
位置990对应的网格:29
网格29对应的中点:973.5
网格15中点映射回网格:15

可以看到双向映射的一致性得到了保证,边界值也处理正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:58:14