【发布时间】:2022-01-05 17:24:55
【问题描述】:
我有一个二维点数组(每个点都存储在我的 Points 结构中,它只包含 3 个属性:X Y Z),大小为 128x128。我想将这个二维数组插入(拉伸)到更大的尺寸(例如 132x132)。到目前为止,我已经设法使用线性插值对每个点的 X 和 Y 坐标进行插值(只需将坐标放入 double 数组,对其进行插值,然后将其返回到新的 Points 二维数组)。下面是线性插值的代码:
private double[] InterpolateArray(double[] array, int newLength)
{
double[] result = new double[newLength];
result[0] = array[0];
result[newLength - 1] = array[array.Length - 1];
for (int i = 1; i < newLength - 1; i++)
{
double jd = ((double)i * (double)(array.Length - 1) / (double)(newLength - 1));
int j = (int)jd;
result[i] = array[j] + (array[j + 1] - array[j]) * (jd - (double)j);
}
return result;
}
问题是我不知道如何插入每个点的 Z 坐标。可以像 X 和 Y 坐标那样以同样的方式完成吗?还是需要完全不同的方法?
编辑:我的 Points 结构的代码:
public struct Points
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Points(double X, double Y, double Z)
{
this.X = X;
this.Y = Y;
this.Z = Z;
}
}
以及进行插值的代码(或至少应该这样做):
public Points[,] Interpolate(Points[,] array, int newWidth, int newHeight)
{
Points[,] result = new Points[newWidth, newHeight];
double[] bufferBefore = new double[domes.GetLength(0)];
double[] bufferAfter = new double[newWidth];
for (int i = 0; i < domes.GetLength(1); i++)
{
for (int j = 0; j < domes.GetLength(0); j++)
{
bufferBefore[j] = domes[j, i].X;
}
bufferAfter = InterpolateArray(bufferBefore, newWidth);
for (int j = 0; j < newWidth; j++)
{
result[j, i].X = bufferAfter[j];
}
}
bufferBefore = new double[domes.GetLength(1)];
bufferAfter = new double[newHeight];
for (int i = 0; i < newWidth; i++)
{
for (int j = 0; j < domes.GetLength(1); j++)
{
bufferBefore[j] = result[i, j].Y;
}
bufferAfter = InterpolateArray(bufferBefore, newHeight);
for (int j = 0; j < newHeight; j++)
{
result[i, j].Y = bufferAfter[j];
}
}
return result;
}
【问题讨论】:
-
1) 您提到了
Point,但该示例没有显示任何内容。 2)你提到了一个二维数组,但代码只是在一维中插值。 3) 如果您的Points代表一个方向,您可能会遇到插值问题。那么,您真正想做的是什么? -
@JonasH 我编辑了问题并添加了缺少的代码 sn-ps。关于第三个问题:我需要将我的二维数组拉伸到新尺寸:假设它的初始尺寸是 128x128,我需要将它拉伸到 148x128(例如)。因为我得到了实际的点,我需要正确地对它们进行插值以获得新的大小。
标签: c# arrays interpolation linear-interpolation