如何获得用于坐标变换的二维平移矩阵

How to get translation matrix 2D for coordinates transformation

我有两个二维坐标系A和B。我知道坐标系A的3个点如何平移到坐标系B。

A1[x, y] => B1[x, y]
A2[x, y] => B2[x, y]
A3[x, y] => B3[x, y]

现在,我有一个来自坐标系 A 的点 A4,我需要计算一个点 B4 它在坐标系 B 中的位置。

我不知道如何从点 A1、A2、A3、B1、B2、B3 计算平移矩阵以及如何使用此矩阵使用 C# 从 A4 计算点 B4。

我没有在 .NET Framework 文档中找到任何有用的 类 或方法。

我检查了 MathNet 库,但是这个库太大了,以至于新手无法阅读 MathNet 库。

给定点对列表

IReadOnlyList<(Vector2 A, Vector2 B)> list

您可以通过以下方式找到 A 点和 B 点之间的变换:

    var nRows = list.Count* 2;
    const int nCols = 6;
    var A = new DenseMatrix(nRows, nCols);
    var b = new DenseMatrix(nRows, 1);

    for (var p = 0; p < list.Count; p++)
    {
        var row = p * 2;
        A[row, 0] = list[p].A.X;
        A[row, 1] = list[p].A.Y;
        A[row, 2] = 1;
        b[row, 0] = list[p].B.X;
        row++;
        A[row, 3] = list[p].A.X;
        A[row, 4] = list[p].A.Y;
        A[row, 5] = 1;
        b[row, 0] = list[p].B.Y;
    }
    var x = A.Solve(b);
    var affine = new Matrix3x2(
        (float)x[0, 0], 
        (float)x[3, 0], 
        (float)x[1, 0], 
        (float)x[4, 0], 
        (float)x[2, 0], 
        (float)x[5, 0]) ;

这使用 Math.net.Numerics 作为矩阵求解器,System.Numerics.Matrix3x2 作为结果。这是 affine transforms 使用 3+ 点对。您也可以用类似的方式计算单应性,但数学有点不同。

使用Vector2.Transform应用转换