Алгоритм компактного хранения и решения СЛАУ высокого порядка - (реферат)
p>return ! Output(fn3, X, Y, Z, FE, NumPoints, 0, NumFE, Bounds, NumBounds); }if (CurrentType == BASE3D_8)
{
if (! ReadCubeData(fn1, fn2, in1, in2, X, Y, Z, FE, NumPoints, NumFE)) return false; if (! strcmp(Op, "/6"))
{
// Create 6*Tetraedr(4)
Convert824(FE, NumFE);
}
Convert(X, Y, Z, FE, NumFE, Bounds, NumBounds);
return ! Output(fn3, X, Y, Z, FE, NumPoints, 0, NumFE, Bounds, NumBounds); }
return false;
}
void Convert824(Matrix& FE, DWORD& NumFE)
{
Matrix nFE(6 * NumFE, 4);
DWORD data[][4] = {
{ 0, 2, 3, 6 },
{ 4, 5, 1, 7 },
{ 0, 4, 1, 3 },
{ 6, 7, 3, 4 },
{ 1, 3, 7, 4 },
{ 0, 4, 6, 3 }
},
Current = 0;
for (DWORD i = 0; i < NumFE; i++)
for (DWORD j = 0; j < 6; j++)
{
for (DWORD k = 0; k < 4; k++)
nFE[Current][k] = FE[i][data[j][k]];
Current++;
}
CurrentType = BASE3D_4;
NumFE = Current;
FE = nFE;
}
void Convert1024(Matrix& FE, DWORD& NumFE)
{
Matrix nFE(8 * NumFE, 4);
DWORD data[][4] = {
{ 3, 7, 8, 9 },
{ 0, 4, 7, 6 },
{ 2, 5, 9, 6 },
{ 7, 9, 8, 6 },
{ 4, 8, 5, 1 },
{ 4, 5, 8, 6 },
{ 7, 8, 4, 6 },
{ 8, 9, 5, 6 }
},
Current = 0;
for (DWORD i = 0; i < NumFE; i++)
for (DWORD j = 0; j < 8; j++)
{
for (DWORD k = 0; k < 4; k++)
nFE[Current][k] = FE[i][data[j][k]];
Current++;
}
CurrentType = BASE3D_4;
NumFE = Current;
FE = nFE;
}
bool ReadTetraedrData(char* fn1, char* fn2, FILE* in1, FILE* in2, Vector& X, Vector& Y, Vector& Z,
Matrix& FE, DWORD& NumPoints, DWORD& NumFE)
{
double tx,
ty,
tz;
char TextBuffer[1001];
DWORD Current = 0L,
tmp;
while (! feof(in1))
{
if (fgets(TextBuffer, 1000, in1) == NULL)
{
if (feof(in1)) break;
printf("Unable read file %s", fn1);
fclose(in1);
fclose(in2);
return false;
}
if (sscanf(TextBuffer, "%ld %lf %lf %lf", &NumPoints, &tx, &ty, &tz) ! = 4) continue;
X[Current] = tx;
Y[Current] = ty;
Z[Current] = tz;
if (++Current == 999)
{
Vector t1 = X,
t2 = Y,
t3 = Z;
X. ReSize(2 * X. Size());
Y. ReSize(2 * X. Size());
Z. ReSize(2 * X. Size());
for (DWORD i = 0; i < Current; i++)
{
X[i] = t1[i];
Y[i] = t2[i];
Z[i] = t3[i];
}
}
if (Current % 100 == 0)
printf("Line: %ld\r", Current);
}
fclose(in1);
printf(" \r");
NumPoints = Current;
Current = 0L;
while (! feof(in2))
{
if (fgets(TextBuffer, 1000, in2) == NULL)
{
if (feof(in2)) break;
printf("Unable read file %s", fn2);
fclose(in2);
return false;
}
if (sscanf(TextBuffer, "%d %d %d %d %d %ld %ld %ld %ld %ld %ld %ld %ld", &tmp, &tmp, &tmp, &tmp, &tmp,
&FE[Current][0], &FE[Current][1], &FE[Current][2], &FE[Current][3], &FE[Current][4], &FE[Current][5], &FE[Current][6], &FE[Current][7]) ! = 13) continue;
if (fgets(TextBuffer, 1000, in2) == NULL)
{
printf("Unable read file %s", fn2);
fclose(in2);
return false;
}
if (sscanf(TextBuffer, "%ld %ld", &FE[Current][8], &FE[Current][9]) ! = 2) {
printf("Unable read file %s", fn2);
fclose(in2);
return false;
}
{
if (fabs((tx = 0. 5*(X[FE[Current][0] - 1] + X[FE[Current][1] - 1])) X[FE[Current][4] - 1]) > Eps)
X[FE[Current][4] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][0] - 1] + Y[FE[Current][1] - 1])) Y[FE[Current][4] - 1]) > Eps)
Y[FE[Current][4] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][0] - 1] + Z[FE[Current][1] - 1])) Z[FE[Current][4] - 1]) > Eps)
Z[FE[Current][4] - 1] = tz;
if (fabs((tx = 0. 5*(X[FE[Current][2] - 1] + X[FE[Current][1] - 1])) X[FE[Current][5] - 1]) > Eps)
X[FE[Current][5] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][2] - 1] + Y[FE[Current][1] - 1])) Y[FE[Current][5] - 1]) > Eps)
Y[FE[Current][5] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][2] - 1] + Z[FE[Current][1] - 1])) Z[FE[Current][5] - 1]) > Eps)
Z[FE[Current][5] - 1] = tz;
if (fabs((tx = 0. 5*(X[FE[Current][0] - 1] + X[FE[Current][2] - 1])) X[FE[Current][6] - 1]) > Eps)
X[FE[Current][6] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][0] - 1] + Y[FE[Current][2] - 1])) Y[FE[Current][6] - 1]) > Eps)
Y[FE[Current][6] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][0] - 1] + Z[FE[Current][2] - 1])) Z[FE[Current][6] - 1]) > Eps)
Z[FE[Current][6] - 1] = tz;
if (fabs((tx = 0. 5*(X[FE[Current][0] - 1] + X[FE[Current][3] - 1])) X[FE[Current][7] - 1]) > Eps)
X[FE[Current][7] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][0] - 1] + Y[FE[Current][3] - 1])) Y[FE[Current][7] - 1]) > Eps)
Y[FE[Current][7] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][0] - 1] + Z[FE[Current][3] - 1])) Z[FE[Current][7] - 1]) > Eps)
Z[FE[Current][7] - 1] = tz;
if (fabs((tx = 0. 5*(X[FE[Current][3] - 1] + X[FE[Current][1] - 1])) X[FE[Current][8] - 1]) > Eps)
X[FE[Current][8] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][3] - 1] + Y[FE[Current][1] - 1])) Y[FE[Current][8] - 1]) > Eps)
Y[FE[Current][8] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][3] - 1] + Z[FE[Current][1] - 1])) Z[FE[Current][8] - 1]) > Eps)
Z[FE[Current][8] - 1] = tz;
if (fabs((tx = 0. 5*(X[FE[Current][3] - 1] + X[FE[Current][2] - 1])) X[FE[Current][9] - 1]) > Eps)
X[FE[Current][9] - 1] = tx;
if (fabs((ty = 0. 5*(Y[FE[Current][3] - 1] + Y[FE[Current][2] - 1])) Y[FE[Current][9] - 1]) > Eps)
Y[FE[Current][9] - 1] = ty;
if (fabs((tz = 0. 5*(Z[FE[Current][3] - 1] + Z[FE[Current][2] - 1])) Z[FE[Current][9] - 1]) > Eps)
Z[FE[Current][9] - 1] = tz;
}
if (++Current == 999)
{
Matrix t = FE;
FE. ReSize(2 * FE. Size1(), 10);
for (DWORD i = 0; i < Current; i++)
for (DWORD j = 0; j < 10; j++)
FE[i][j] = t[i][j];
}
if (Current % 100 == 0)
printf("Line: %ld\r", Current);
}
NumFE = Current;
for (DWORD i = 0; i < NumFE; i++)
for (DWORD j = 0; j < 10; j++)
FE[i][j]--;
printf(" \r");
return true;
}
bool ReadCubeData(char* fn1, char*fn2, FILE* in1, FILE* in2, Vector& X, Vector& Y, Vector& Z,
Matrix& FE, DWORD& NumPoints, DWORD& NumFE)
{
double tx,
ty,
tz;
char TextBuffer[1001];
DWORD Current = 0L,
tmp;
while (! feof(in1))
{
if (fgets(TextBuffer, 1000, in1) == NULL)
{
if (feof(in1)) break;
printf("Unable read file %s", fn1);
fclose(in1);
fclose(in2);
return false;
}