#pragma once

#include <math.h>
#include <ctime>

double myPI = 3.14159265358979323846;

void sarch_gauss(double *a, double *u) 
{
	double det = a[0] * (a[4] * a[8] - a[7] * a[5]) - a[3] * (a[1] * a[8] - a[7] * a[2]) + a[6] * (a[1] * a[5] - a[4] * a[2]);
	double f[3]; 
	for (int i = 0; i < 3; i++) 
	{ 
		f[i] = u[i]; 
	}
	u[0] = f[0] * (a[4] * a[8] - a[7] * a[5]) - f[1] * (a[1] * a[8] - a[7] * a[2]) + f[2] * (a[1] * a[5] - a[4] * a[2]);
	u[0] /= det;
	u[1] = f[0] * (a[3] * a[8] - a[6] * a[5]) - f[1] * (a[0] * a[8] - a[6] * a[2]) + f[2] * (a[0] * a[5] - a[3] * a[2]);
	u[1] /= (-det);
	u[2] = f[0] * (a[3] * a[7] - a[6] * a[4]) - f[1] * (a[0] * a[7] - a[6] * a[1]) + f[2] * (a[0] * a[4] - a[3] * a[1]);
	u[2] /= det;
}

double sarch_dot(double* u, double* v)
{
	return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]);
}

void sarch_cross(double* u, double* v, double *res)
{
	res[0] = u[1] * v[2] - u[2] * v[1];
	res[1] = u[2] * v[0] - u[0] * v[2];
	res[2] = u[0] * v[1] - u[1] * v[0];
}

double sarch_norm(double *u) 
{
	return sqrt((u[0] * u[0]) + (u[1] * u[1]) + (u[2] * u[2]));
}

void sarch_normalize(double *u, double *res)
{
	double dot = sqrt((u[0] * u[0]) + (u[1] * u[1]) + (u[2] * u[2]));
	res[0] = u[0] / dot;
	res[1] = u[1] / dot;
	res[2] = u[2] / dot;	
}
