我正在寻找一个PHP函数,用于将一组不规则放置的数据(x,y,z)插值到网格化数据集中,以便在JPGraph的ContourPlot函数中使用。 我已经开发了一个基于简单的反距离加权的函数,但它太慢了。 我需要使用另一种方法,例如“修改后的Shepard方法”或任何其他可能具有更高精度的方法,使其更快,更平滑。
这是我的当前代码:
这是我的当前代码:
for($i = 0, $ij = 0; $i < $gridX; $i ++) {
for($j = 0; $j < $gridY; $j ++, $ij ++) {
$x = $startP->x + ($deltaX * $i);
$y = $startP->y + ($deltaY * $j);
$g [$ij]->i = $i;
$g [$ij]->j = $j;
$g [$ij]->x = ( int ) $x;
$g [$ij]->y = ( int ) $y;
$g [$ij]->z = IDW_U ( $x, $y, $sampleData, $sampleSize, $p );
}
}
function IDW_U($x, $y, $data, $size, $p) {
$idw_sum = IDWeightSum ( $x, $y, $data, $size, $p );
$idw_u = 0.0;
for($k = 0; $k < $size; $k ++) {
if ($x == $data [$k]->x && $y == $data [$k]->y)
return $data [$k]->z;
$idw_u += IDWeight ( $x, $y, $data [$k], $p ) * $data [$k]->z / $idw_sum;
}
return $idw_u;
}
function IDWeightSum($x, $y, $data, $size, $p) {
$sum = 0.0;
for($k = 0; $k < $size; $k ++)
$sum += IDWeight ( $x, $y, $data [$k], $p );
return $sum;
}
function IDWeight($x, $y, $d, $p) {
if ($x == $d->x && $y == $d->y)
return 1.0;
$dx = $x - $d->x;
$dy = $y - $d->y;
$ret = 1.0 / pow ( sqrt ( pow ( $dx, 2 ) + pow ( $dy, 2 ) ), $p );
return $ret;
}
有人知道可用于此目的的函数或库吗?
gnuplot
可以实现与 JPGraph 相同甚至更好的插值和生成效果。也许这是一个选择?不过学习曲线有点陡峭,我可以很肯定地说我不知道 gnuplot 能做到的 2%。 - Wrikken