问题描述
我有两个二维坐标系 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 应用转换