Files
sibsutis/1Y-2H/prog.old/lab3/src/matrix2d.c
T
2026-04-25 17:23:04 +07:00

116 lines
3.1 KiB
C

#include "includes.h"
int getrand(int min, int max)
{
return (int)rand() / (RAND_MAX + 1.0) * (max - min) + min;
}
matrix2d* create_matrix2d(unsigned int x, unsigned int y)
{
matrix2d* mat = (matrix2d*)malloc(sizeof(matrix2d));
mat->ptr = (void***)malloc(sizeof(void**) * x);
for (int i = 0; i < x; i++)
mat->ptr[i] = (void**)malloc(sizeof(void*) * y);
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
mat->ptr[i][j] = (void*)create_led();
*((unsigned int*)&(mat->x)) = x;
*((unsigned int*)&(mat->y)) = y;
return mat;
}
void deconstruct_matrix2d( matrix2d* mat)
{
for (int i = 0; i < mat->x; i++){
for (int j = 0; j < mat->y; j++)
free(mat->ptr[i][j]);
free(mat->ptr[i]);
}
free(mat->ptr);
free(mat);
}
matrix2d* get_row_matrix2d(matrix2d* mat, int y)
{
if (y >= mat->y)
return NULL;
matrix2d* res = create_matrix2d( mat->x, 1);
for (int x = 0; x < mat->x; x++)
memcpy(res->ptr[x][0], mat->ptr[x][y], sizeof(rgbled));
return res;
}
matrix2d* get_column_matrix2d(matrix2d* mat, int x)
{
if (x >= mat->x)
return NULL;
matrix2d* res = create_matrix2d(1, mat->y);
for (int y = 0; y < mat->y; y++)
memcpy(res->ptr[0][y], mat->ptr[x][y], sizeof(rgbled));
return res;
}
void print_matrix2d(matrix2d* mat)
{
for (int y = 0; y < mat->y; y++) {
for (int x = 0; x < mat->x; x++) {
print_colorHEX((rgbled*)mat->ptr[x][y]);
putchar(' ');
}
putchar('\n');
}
}
void fill_rand_matrix2d(matrix2d* mat)
{
for (int y = 0; y < mat->y; y++)
for (int x = 0; x < mat->x; x++) {
set_R(mat->ptr[x][y], getrand(0, 255));
set_G(mat->ptr[x][y], getrand(0, 255));
set_B(mat->ptr[x][y], getrand(0, 255));
}
}
matrix2d* transpond_mtrx(matrix2d* mat)
{
matrix2d* res = create_matrix2d(mat->y, mat->x);
for (int y = 0; y < mat->y; y++)
for (int x = 0; x < mat->x; x++)
memcpy(res->ptr[y][x], mat->ptr[x][y], sizeof(rgbled));
return res;
}
bool equal_mtrx(matrix2d* matA, matrix2d* matB)
{
if (matA->x != matB->x || matA->y != matB->y)
return false;
for (int x = 0; x < matA->x; x++)
for (int y = 0; y < matA->y; y++) {
rgbled* ledA = (rgbled*)matA->ptr[x][y];
rgbled* ledB = (rgbled*)matB->ptr[x][y];
if ((ledA->rgbd != ledB->rgbd) || (ledA->efg != ledB->efg))
return false;
}
return true;
}
bool not_equal_mtrx(matrix2d* matA, matrix2d* matB)
{
if (matA->x != matB->x || matA->y != matB->y)
return true;
for (int x = 0; x < matA->x; x++)
for (int y = 0; y < matA->y; y++) {
rgbled* ledA = (rgbled*)matA->ptr[x][y];
rgbled* ledB = (rgbled*)matB->ptr[x][y];
if ((ledA->rgbd == ledB->rgbd) && (ledA->efg == ledB->efg))
return false;
}
return true;
}
void set_elem_matrix2d(matrix2d* mat, void* elem, unsigned int x, unsigned int y)
{
free(mat->ptr[x][y]);
mat->ptr[x][y] = elem;
}