gpt4 book ai didi

c# - 如何计算围绕正方形放置的 9 个值的平均值

转载 作者:行者123 更新时间:2023-11-30 16:40:13 38 4
gpt4 key购买 nike

enter image description here

我有一个均匀分布的数值网格,每个数值都位于一个单元格的中心。为简化起见,我们假设每个单元格的大小都是 1.0 乘以 1.0。我正在寻找一种方法来计算给定任意点的相邻单元格和中心单元格的平均值。我试图想出一个使用权重和距离的算法,它大部分都有效,但我在单元格的边缘得到了不正确的值(单元格之间的过渡不平滑,因为我正在移动 p0周围;当它移动到相邻的单元格时,值会突然发生急剧变化)。这可能是因为这些值不是在圆上而是在正方形上间隔开,因此它们在对角线上与中心点的距离不同于水平或垂直距离。

在上图中,有 9 个值指定为 v0-v8v0 是中心值。 p0 是中心单元格内的任意点。如果 p0 移动到另一个单元格的范围内,则该单元格将成为中心单元格(视角明显改变)。

要求:

  • 如果 p0v0 位于同一位置,则 p0 == v0
  • 没有三角函数、幂函数或根函数。这段代码对性能至关重要。只有简单的算术运算。

所有这一切背后的原因是我想创建一种更快的方法来访问计算速度非常慢的值,但是如果它们以特定的粒度预先计算到类似网格的缓存中,我可以取平均值最近的。

到目前为止,这是我想出的:

double value = 0;

// If we're closer to the northern edge
if (z < CellRadius)
{
double centeredness = z / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (
centerWeight * Cells[i, j]
+ edgeWeight * Cells[i, j - 1]
) / 4.0;
}
// If we're closer to the southern edge
else if (z >= CellRadius)
{
double centeredness = (
CellRadius - (z - CellRadius)
) / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (
centerWeight * Cells[i, j]
+ edgeWeight * Cells[i, j + 1]
) / 4.0;
}

// If we're closer to the western edge
if (x < CellRadius)
{
double centeredness = x / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (
centerWeight * Cells[i, j]
+ edgeWeight * Cells[i - 1, j]
) / 4.0;
}
// If we're closer to the eastern edge
else if (x >= CellRadius)
{
double centeredness = (
CellRadius - (x - CellRadius)
) / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (
centerWeight * Cells[i, j]
+ edgeWeight * Cells[i + 1, j]
) / 4.0;
}

// If we're closer to the north-western edge
if (x < CellRadius && z < CellRadius)
{
double centeredness = (x / CellRadius) * (z / CellRadius);
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (centerWeight * Cells[i, j] + edgeWeight * (
Cells[i - 1, j - 1]
)) / 2.0;
}
// If we're closer to the south-eastern edge
else if (x >= CellRadius && z >= CellRadius)
{
double centeredness = (
CellRadius - (x - CellRadius)
) / CellRadius * (
CellRadius - (z - CellRadius)
) / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (centerWeight * Cells[i, j] + edgeWeight * (
Cells[i + 1, j + 1]
)) / 2.0;
}
// If we're closer to the north-eastern edge
else if (x >= CellRadius && z < CellRadius)
{
double centeredness = (
CellRadius - (x - CellRadius)
) / CellRadius * (z / CellRadius);
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (centerWeight * Cells[i, j] + edgeWeight * (
Cells[i + 1, j - 1]
)) / 2.0;
}
// If we're closer to the south-western edge
else if (x < CellRadius && z >= CellRadius)
{
double centeredness = (x / CellRadius) * (
CellRadius - (z - CellRadius)
) / CellRadius;
double centerWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 1.0);
double edgeWeight = Utils.Lerp(centeredness, 1.0 / 2.0, 0.0);

value += (centerWeight * Cells[i, j] + edgeWeight * (
Cells[i - 1, j + 1]
)) / 2.0;
}

return value;

如前所述,它无法正常工作。

最佳答案

我发现很难理解你想要完成的事情:

如果你想要这些点的平均值,你可以从中心点 v0 取偏移量 p0 的 1/10。由于 v0-v8 总共是 9 分,而 p0 是 1 分,所以得到 10 分,因此是 1/10。

假设我们暂时忽略 p0 并尝试计算 v0-v8 的平均值,在您描述的情况下它将是 (0, 0)。考虑到这种情况的“权重”,我们可以说这是 9,因为它们是 9 分。

即使我们将 v2&v8、v4&v6、v3&v7 或 v1&v5 中的任意对的两个点都移动到距 v0 相同的距离,平均值仍将为 (0, 0)。考虑到这一点意味着,只要(例如 v2 和 v8)两个点的距离相同,上述对的点与 v0 之间的距离有多远并不重要。

例如,在您的代码中,我看到您对待“西北”的方式不同于“北”或“西”,因为上述解释,我认为这没有必要。除此之外,我认为算法非常复杂,而我在上面描述过你可以只取 p0 的 1/10。

希望这对您有所帮助,如果我误解了您的问题,请详细说明! :)

编辑:在您的问题中,您假设因为这些值不是在圆上而是在正方形上间隔开,所以它们与中心点的对角线距离与水平或垂直距离不同。理论上,这是真的。

关于这个假设,我想指出,即使在代码中考虑这个距离,您也需要一个平方根(毕达哥拉斯定理)。这个距离的可用数据,我假设是 x 和 y 的差异。

根据您的假设,查看示例图像,v3 与 p0/v2 和 p0 之间的 y 差异相同,v2 与 p0/v1 和 p0 之间的 x 差异也相同。

无论哪种方式,我所说的计算只需要 v0 和 p0 之间的 x 和 y 差值。

关于c# - 如何计算围绕正方形放置的 9 个值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51707696/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com