如何获得用于坐标变换的平移矩阵 2D

问题描述

我有两个二维坐标系 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,我需要计算它在坐标系 B 中的位置 B4。

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

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

我已经检查了 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,(float)x[1,(float)x[4,(float)x[2,(float)x[5,0]) ;

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

使用 Vector2.Transform 应用转换

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...