Что касается внутренних циклов ... 0-> var лучше сделать var-> 0, так как var-- запускает нулевой флаг (6502 дня). Этот подход также означает, что «ширина» загружается в x и может быть забыта, то же самое относится и к «высоте». Кроме того, пиксели в памяти обычно располагаются слева-> справа, сверху-> снизу, поэтому в качестве внутреннего цикла определенно необходимо указать x.
for (y = height; y--;) {
for (x = width; x--;) {
weight = fun();
// Calculate the new pixel value given the weight
...
}
}
Кроме того ... и очень важно, что ваши операторы switch имеют только 2 случая, которые используют x или y. Остальные константы.
switch (mode) /* select the type of calculation */
{
case 0:
weight = dCentre / maxDistanceEdge;
break;
//case 1:
// weight = (float)x/width;
// break;
//case 2:
// weight = (float)y/height;
// break;
case 3:
weight = dBottomLeft / maxDistanceCorner;
break;
case 4:
weight = dTopRight / maxDistanceCorner;
break;
default:
weight = 1;
break;
}
Таким образом, в основном, если вес цикла 1 или 2 не рассчитан перед циклом.
... Y loop code here
if (mode == 2) { weight = (float)y/height; } // calc only once per Y loop
... X loop here
if (mode == 1) { weight = (float)x/width; } // after this all cases have filled weight
calc_pixel_using_weight(weight);
Я считаю, что операторы switch очень недобрые, если данные редки. Для <4 элементов я бы выбрал if-then-else и убедился, что самые распространенные случаи находятся на вершине. Если первое условие улавливает 90% случаев, вы в основном попали в хомире. Аналогично, если какое-то другое условие <1%, ставьте его последним. </p>