|
楼主 |
发表于 2023-2-11 16:19:31
|
显示全部楼层
继续,请使用更复杂更高效的算法来计算seated plane
如果晶圆表面具有更高度的曲率,使用最小二乘法进行曲面拟合可能会导致较高的误差。因此,我们可以使用更复杂更高效的算法来计算seated plane。以下是一种基于法向量估计的算法,该算法使用C#代码和Eigen库实现:
using Eigen;
using System.Linq;
// 定义晶圆边缘坐标点数组
Vector3d[] points = new Vector3d[100];
// 设置法向量估计窗口的大小
int windowSize = 10;
// 将坐标点转换为Eigen中的矩阵
Matrix<double, Dynamic, 3> pointsMat = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
pointsMat(i, 0) = points[i].X;
pointsMat(i, 1) = points[i].Y;
pointsMat(i, 2) = points[i].Z;
}
// 计算每个点的法向量
Matrix<double, Dynamic, 3> normals = new Matrix<double, Dynamic, 3>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
Matrix<double, Dynamic, 3> window = new Matrix<double, Dynamic, 3>(windowSize, 3);
int k = 0;
for (int j = i - windowSize / 2; j <= i + windowSize / 2; j++)
{
if (j < 0 || j >= points.Length)
{
continue;
}
window(k++, 0) = pointsMat(j, 0);
window(k++, 1) = pointsMat(j, 1);
window(k++, 2) = pointsMat(j, 2);
}
Vector3d centroid = window.colwise().mean();
Matrix<double, Dynamic, 3> centered = window.rowwise() - centroid.transpose();
JacobiSVD<Matrix<double, Dynamic, 3>> svd(centered, ComputeThinV);
normals.row(i) = svd.matrixV().col(2).transpose();
}
// 使用所有点的法向量进行最小二乘拟合
Matrix<double, Dynamic, Dynamic> A = new Matrix<double, Dynamic, Dynamic>(points.Length, 3);
for (int i = 0; i < points.Length; i++)
{
A(i, 0) = normals(i, 0);
A(i, 1) = normals(i, 1);
A(i, 2) = -1;
}
JacobiSVD<Matrix<double, Dynamic, Dynamic>> svd(A, ComputeThinU | ComputeThinV);
Vector3d normal = svd.matrixV().col(2);
double d = -svd.matrixU().col(2).dot(normal);
// 输出结果
Console.WriteLine("seated plane的法向量为:{0}", normal);
Console.WriteLine("seated plane的偏移量为:{0}", d);
在上面的代码中,我们首先将晶圆边缘坐标点数组转换为Eigen中的矩阵,并定义法向量估计窗口的大小。
然后,我们计算每个点的法向量。对于每个点,我们选择一个大小为windowSize的窗口,并计算窗口中所有点的平均值。然后,我们将窗口中所有点与平均值的差向量组成矩阵,并使用JacobiSVD函数计算矩阵的奇异值分解。该函数的ComputeThinV参数表示只计算右奇异矩阵,即计算法向量。最后,我们将所有点的法向量用于最小二乘拟合,计算seated plane的法向量和偏移量。具体而言,我们将每个点的法向量定义为Ax+By+Cz=D中的[A, B, C]向量,然后使用JacobiSVD函数计算矩阵A的奇异值分解,其中V的最后一列就是seated plane的法向量,U的最后一列是seated plane的法向量和一个偏移量D的负数。 |
|