Files
player/Project_App_Chat/App_Src/calc/ellipsoid.c

210 lines
4.5 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "ellipsoid.h"
#include "stdio.h"
#include "string.h"
#include "math.h"
#define printf(a,fmt...)
2025-07-05 19:47:28 +08:00
/*=================================<3D><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>˽<EFBFBD>к<EFBFBD><D0BA><EFBFBD>=====================================*/
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//ȡ<><C8A1><EFBFBD><EFBFBD>ֵ
2025-06-27 00:32:57 +08:00
static float Abs(float a)
{
return a < 0 ? -a : a;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>λ<EFBFBD><CEBB>
2025-06-27 00:32:57 +08:00
static void Row2_swop_Row1(float matrix[MATRIX_SIZE][MATRIX_SIZE+1],int row1, int row2)
{
float tmp = 0;
for (int column = 0; column < MATRIX_SIZE + 1; column++)
{
tmp = matrix[row1][column];
matrix[row1][column] = matrix[row2][column];
matrix[row2][column] = tmp;
}
}
2025-07-05 19:47:28 +08:00
//<2F>ð<EFBFBD>row<6F>е<EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD>һ<EFBFBD><D2BB>ϵ<EFBFBD><CFB5>k
2025-06-27 00:32:57 +08:00
static void k_muiltply_Row(float matrix[MATRIX_SIZE][MATRIX_SIZE+1],float k, int row)
{
for (int column = 0; column < MATRIX_SIZE + 1; column++)
matrix[row][column] *= k;
}
2025-07-05 19:47:28 +08:00
//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>row1<77>мӵ<D0BC>row2<77><32><EFBFBD><EFBFBD>ȥ
2025-06-27 00:32:57 +08:00
static void Row2_add_kRow1(float matrix[MATRIX_SIZE][MATRIX_SIZE+1],float k, int row1, int row2)
{
for (int column = 0; column < MATRIX_SIZE + 1; column++)
matrix[row2][column] += k*matrix[row1][column];
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>k<EFBFBD><6B><EFBFBD><EFBFBD>Ԫ֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD>k<EFBFBD>е<EFBFBD>MATRIX_SIZE<5A><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>е<EFBFBD>Ԫ<EFBFBD>صĴ<D8B5>С
2025-06-27 00:32:57 +08:00
static void MoveBiggestElement_to_Top(float matrix[MATRIX_SIZE][MATRIX_SIZE+1],int k)
{
int row = 0, column = 0;
for (row = k + 1; row < MATRIX_SIZE; row++)
{
if (Abs(matrix[k][k]) < Abs(matrix[row][k]))
{
Row2_swop_Row1(matrix,k, row);
}
}
}
2025-07-05 19:47:28 +08:00
//<2F><>˹<EFBFBD><CBB9>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD>,<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
static int Matrix_GaussElimination(float matrix[MATRIX_SIZE][MATRIX_SIZE+1])
{
float k = 0;
2025-07-05 19:47:28 +08:00
for (int cnt = 0; cnt < MATRIX_SIZE; cnt++)//<2F><><EFBFBD>е<EFBFBD>k<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><E3A3AC>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>е<EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>0
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
//<2F><>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>е<EFBFBD>Ԫ<EFBFBD>ش<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
MoveBiggestElement_to_Top(matrix,cnt);
if (matrix[cnt][cnt] == 0)
2025-07-05 19:47:28 +08:00
return(1);//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
//<2F><>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>б
2025-06-27 00:32:57 +08:00
for (int row = cnt + 1; row < MATRIX_SIZE; row++)
{
k = -matrix[row][cnt] / matrix[cnt][cnt];
Row2_add_kRow1(matrix,k, cnt, row);
}
// DispMatrix();
}
return 0;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE>󣬼<EFBFBD><F3A3ACBC>ѶԽ<D1B6><D4BD>ߵ<EFBFBD>Ԫ<EFBFBD><D4AA>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
2025-06-27 00:32:57 +08:00
static void Matrix_RowSimplify(float matrix[MATRIX_SIZE][MATRIX_SIZE+1])
{
float k = 0;
for (int row = 0; row < MATRIX_SIZE; row++)
{
k = 1 / matrix[row][row];
k_muiltply_Row(matrix,k, row);
}
// DispMatrix();
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>
2025-06-27 00:32:57 +08:00
static void Matrix_Solve(float matrix[MATRIX_SIZE][MATRIX_SIZE+1],float* solve)
{
for (short row = MATRIX_SIZE - 1; row >= 0; row--)
{
solve[row] = matrix[row][MATRIX_SIZE];
for (int column = MATRIX_SIZE - 1; column >= row + 1; column--)
solve[row] -= matrix[row][column] * solve[column];
}
printf(" a = %f| b = %f| c = %f| d = %f| e = %f| f = %f ", solve[0], solve[1], solve[2], solve[3], solve[4], solve[5]);
printf("\r\n");
printf("\r\n");
}
2025-07-05 19:47:28 +08:00
/*=================================<3D><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>˽<EFBFBD>к<EFBFBD><D0BA><EFBFBD>End=====================================*/
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void ellipsoid_reset(ellipsoid_struct *ell)
{
if(ell==0) return;
memset(ell,0,sizeof(ellipsoid_struct));
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ӵ㲢<D3B5><E3B2A2><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void ellipsoid_add_point(ellipsoid_struct *ell,float x,float y,float z)
{
if(ell==0) return;
ell->num++;
double V[MATRIX_SIZE + 1];
V[0] = y*y;
V[1] = z*z;
V[2] = x;
V[3] = y;
V[4] = z;
V[5] = 1.0;
V[6] = -x*x;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>󣬲<EFBFBD><F3A3ACB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>
2025-06-27 00:32:57 +08:00
for (int row = 0; row < MATRIX_SIZE; row++)
{
for (int column = 0; column < MATRIX_SIZE + 1; column++)
{
ell->sum[row][column] += V[row] * V[column];
}
}
2025-07-05 19:47:28 +08:00
//b<><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_matrix[row][6]
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ƽ<EFBFBD><C6BD>ֵ
2025-06-27 00:32:57 +08:00
void ellipsoid_average(ellipsoid_struct *ell)
{
if(ell==0) return;
for (int row = 0; row < MATRIX_SIZE; row++)
for (int column = 0; column < MATRIX_SIZE + 1; column++)
ell->avr[row][column]=ell->sum[row][column] / ell->num;
2025-07-05 19:47:28 +08:00
//b<><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_matrix[row][6]
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void ellipsoid_fitting(ellipsoid_struct *ell)
{
if(ell==0) return;
float solve[6]={0};
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ȡƽ<C8A1><C6BD>ֵ
2025-06-27 00:32:57 +08:00
ellipsoid_average(ell);
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(Matrix_GaussElimination(ell->avr)==0)
{
Matrix_RowSimplify(ell->avr);
Matrix_Solve(ell->avr,solve);
float a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;
a = solve[0];
b = solve[1];
c = solve[2];
d = solve[3];
e = solve[4];
f = solve[5];
ell->x = -c / 2;
ell->y = -d / (2 * a);
ell->z = -e / (2 * b);
ell->a = sqrt(ell->x*ell->x + a*ell->y*ell->y + b*ell->z*ell->z - f);
ell->b = ell->a / sqrtf(a);
ell->c = ell->a / sqrtf(b);
2025-07-05 19:47:28 +08:00
printf(" ((x - x0) / A) ^ 2 + ((y - y0) / B) ^ 2 + ((z - z0) / C) ^ 2 = 1 Ellipsoid result as below<6F><77>\r\n");
2025-06-27 00:32:57 +08:00
printf("\r\n");
printf(" X0 = %f| Y0 = %f| Z0 = %f| A = %f| B = %f| C = %f \r\n", ell->x, ell->y,ell->z, ell->a, ell->b, ell->c);
}
}