Можно ли расширить данную задачу до N-мерного случая?
Даже так: является ли использование рекурсии и переменного числа аргументов здесь оправданным?
что-то типа
function get_dimension($point,$radius,$dimension_axis){
for($i=floor($point[$dimension_axis]-$radius);$i<=ceil($point[$dimension_axis]+$r);$i++){
if($dimension_axis>count($point)){
//Операции с мегамерным массивом
}else{
get_dimension($point,$radius,++$dimension_axis);
}
}
Ответ
По идее, обобщить легко, и рекурсия (по количеству измерений) мне кажется подходящим инструментом.
Я бы сделал как-то так (не тестировал и на псевдокоде, извините, не спец по php):
process_points(int currdim, point currpoint, point center, double radius)
{
var r2 = radius * radius;
var currpointR2 = 0;
for (var dim = 0; dim < currdim - 1; dim++)
currpointR2 += (currpoint[dim] - center[dim]) *
(currpoint[dim] - center[dim]);
var restR2 = r2 - currpointR2;
if (restR2 < 0) return;
var restR = sqrt(restR2);
var min = floor(center[currdim] - restR);
var max = ceil(center[currdim] + restR);
for (var xx = min; xx <= max; xx++)
{
point newCurrPoint = currpoint;
newCurrPoint[dim] = xx;
if (currdim < totaldims - 1)
process_points(currdim + 1, newCurrPoint, center, radius);
else // last dim
paint_point(newCurrPoint);
}
}
process_points(0, center, center, r);
Комментариев нет:
Отправить комментарий