分类 代码分享 下的文章

设物体当前坐标为 (X1, Y1, R1),模组当前坐标为 (X2, Y2, R2),物体目标坐标为 (X3, Y3, R3)。计算旋转差 ΔR = R3 - R1,则模组的新坐标 (X4, Y4, R4) 为:

X4 = X3 + cos(ΔR) (X2 - X1) - sin(ΔR) (Y2 - Y1)
Y4 = Y3 + sin(ΔR) (X2 - X1) + cos(ΔR) (Y2 - Y1)
R4 = R2 + ΔR

其中角度单位需一致(如弧度),必要时可将结果归一化到适当范围(如 [-π, π])。

一个简单的 C# 方法,适用于 .NET Framework 4.5。

using System;

public static class CompensationCalculator
{
    /// <summary>
    /// 根据四个顶点的XY补偿值,通过双线性插值计算指定位置的XY补偿值。
    /// 注意:此方法假设输入参数有效(n>2, m>2, i在0到n*m-1范围内)。
    /// </summary>
    public static Tuple<double, double> GetCompensation(
        int n, int m,
        double topLeftX, double topLeftY,
        double topRightX, double topRightY,
        double bottomLeftX, double bottomLeftY,
        double bottomRightX, double bottomRightY,
        int i)
    {
        int r = i / m; // 行索引
        int c = i % m; // 列索引

        double u = (double)c / (m - 1); // 归一化列位置
        double v = (double)r / (n - 1); // 归一化行位置

        // 双线性插值计算X和Y补偿值
        double xComp = (1 - u) * (1 - v) * topLeftX + u * (1 - v) * topRightX + (1 - u) * v * bottomLeftX + u * v * bottomRightX;
        double yComp = (1 - u) * (1 - v) * topLeftY + u * (1 - v) * topRightY + (1 - u) * v * bottomLeftY + u * v * bottomRightY;

        return Tuple.Create(xComp, yComp);
    }
}

使用示例:

// 示例:3行3列矩阵,计算位置i=4的补偿值
var result = CompensationCalculator.GetCompensation(
    n: 3, m: 3,
    topLeftX: 0.0, topLeftY: 0.0,
    topRightX: 1.0, topRightY: 0.0,
    bottomLeftX: 0.0, bottomLeftY: 1.0,
    bottomRightX: 1.0, bottomRightY: 1.0,
    i: 4);

Console.WriteLine($"X补偿值: {result.Item1}, Y补偿值: {result.Item2}");
// 输出: X补偿值: 0.5, Y补偿值: 0.5

说明:

  • 返回类型:使用 Tuple<double, double>(.NET Framework 4.5 原生支持)。
  • 验证移除:假设调用方确保输入参数有效(n>2, m>2, i在0到n*m-1范围内)。
  • 核心逻辑:使用双线性插值计算 。