Доброго!
Смотрел способы транспонирования матриц.
И возникла такая мысль: как минимальными средствами сдвинуть только контур (пусть будет квадтратной) матрицы. Например, на 1 позицию, или последовательно на несколько позиций (в цикле).
Конутром матрицы считается:1) Верхняя строка
2) Правый столбец
3) Нижняя строка
4) Левый столбец
Относительно пользователя, глядящего в экран :)Пока получился такой алгоритм: сохранить контур в отельном массиве - contour.
1) Циклически сдвинуть на 1 позицию массив contour.
2) Переписать строки и столбцы в матрице.Для матрицы размером 3*3, получается так:
<?php/*Циклическое смещение контура на единицу*/
/*Матрица*/
$matrix[0]=array( 1,1,1);
$matrix[1]=array( 2,2,2);
$matrix[2]=array( 3,3,3);
/*Контур матрицы */
$contour=array(1,1,1,2,3,3,3,2);
for ($j=0; $j < 8; $j++)
{
/*Сдвигаем массив*/
$temp=array_pop($contour);
array_unshift($contour, $temp);
/*Смещение верхней и правой границы*/
foreach ($matrix[0] as $k => $value)
{
$matrix[0][$k]=$contour[$k];
$matrix[$k][2]=$contour[$k+2];
}
/*Смещение нижней границы*/
$x=3;
for ($i=0; $i < 3; $i++)
$matrix[2][--$x]=$contour[$i+4];
/*Смещение левой границы*/
$x=2;
for ( $i=0; $i < 1; $i++)
$matrix[--$x][0]=$contour[$i+7];
/*Печатаем*/
print '<br/>';
print_r($matrix[0]);
print '<br/>';
print_r($matrix[1]);
print '<br/>';
print_r($matrix[2]);
print '<br/>';
print_r($matrix[3]);
print '<br/>';
print '<br/>';
print '<br/>';
}
?>
> Доброго!Ух мать, это тебе в первый класс по каэс 50. Потом приходи с вопросом - объясню как оптимально.
>> Доброго!
> Ух мать, это тебе в первый класс по каэс 50. Потом приходи
> с вопросом - объясню как оптимально.Спасибо. Не знал про такой курс.
По видео - долго. Привык к тексту.
Но зачем мне самое начало? :)P.S.
Топ развлекательный.
> По видео - долго. Привык к тексту.это ни шняга ютупная, тот случай когда можно, на пальцах по другому ни рассказать
Зыж на такой тип матредцы лихко ложаца все алгоритмы работы с rgb, тысячи их, в чем развлекуха то должна заключацо ?
> Зыж на такой тип матредцы лихко ложаца все алгоритмы работы с rgb,
> тысячи их, в чем развлекуха то должна заключацо ?Не знал. Я залип над этим вопросом из любопытства. Подумал, может, уже есть красивый алгоритм.
Кто-то ведь иногда решает бесполезные задачи.
Но вроде бы какой-то алго выстроился у меня.
> Но вроде бы какой-то алго выстроился у меня.на
https://github.com/hankking11/ImageManip/blob/master/ppm.c
первае что в бошку пришло, и что важно - это работает и есть аптимизираванныи реализации хоть под канкретный камень
//This function takes in a ppmPic structure
//and returns a ppmPic structure representing an
//inverted version of the original picture (inverts the colors)
ppmPic *
invertppmPic(ppmPic *a)
{
int i;
int j; //j is the row number
for (j = 0; j < a->rows; j++)
{ //This for loop inverts each row one at a time
i = 0;
//i is the column number
while(i < a->cols)
{ //This while loop inverts one row (row j)
a->pixels[j][i].red = a->colors - a->pixels[j][i].red;
a->pixels[j][i].green = a->colors - a->pixels[j][i].green;
a->pixels[j][i].blue = a->colors - a->pixels[j][i].blue;
i++;
}
}
return a;
}//This function takes in a ppmPic structure
//and returns a ppmPic structure representing a
//horizontally flipped version of the original picture
ppmPic *
swapppmPic(ppmPic *a)
{
int i;
Pixel temp;
int j; //j is the row number
for (j = 0; j < a->rows; j++)
{ //This for loop swaps each row, one at a time
i = 0; //i is the column number
while(i < a->cols / 2) //integer division is used, so the middle row is not
{ //swapped with itself if there's an odd number of cols
temp = a->pixels[j][i]; //This while loop swaps one row (row j)
a->pixels[j][i] = a->pixels[j][a->cols - i - 1];
a->pixels[j][a->cols - i - 1] = temp;
i++;
}
}
return a;
}//This function takes in a ppmPic structure
//and returns a ppmPic structure representing an
//upside-down version of the original picture
ppmPic *
flipppmPic(ppmPic *a)
{
int i; // integer division is used, so the middle row
Pixel temp; //is not swapped with itself if there is an
int j; //odd number of rows. (in the for loop
for (j = 0; j < a->rows / 2; j++) //condition)
{ //This for loop switches the top half to the bottom half
i = 0; //i is the column number
while(i < a->cols)
{ //This while loop switches an upper half row with
temp = a->pixels[j][i]; //a corresponding lower half row
a->pixels[j][i] = a->pixels[a->rows - 1 - j][i];
a->pixels[a->rows - 1 - j][i] = temp;
i++;
}
}
return a;
}