4.1.3. Листинг блока моделирующего двухкомпонентную смесь с выборкой нитей.
UINT иХ =0, uY =0, uN =0,uL =0, і =0, иН -0, uNumberCopper =0, ul =0, muNumberThreadCell =0;
UINT ulndicationlnclude =0, uDeviationX =0, uDeviationY =0, uCurrentX =0, uCurrentY =0, uCurrentZ = 0;
char buffer[10];
intiXI=0, iYl=0;
int iDeviation [2][2][9][2] = //массив последовательности проверки окружающих частиц
{//инициализация массива
последовательности проверки окружающих частиц
1,1,1,0,0,1,0,0,1,-1,-1,1,0,-1,- 1,0,-1,-1,//Сектор4:(1;1)(1;0)(0;1)(0;0)(1;-1)(-1;1)(0;-1)(-1;0) (-1;-1)
-1,1,-1,0,0,1,0,0,-1,-1,1,1,0,- 1,1,-1,1,0//СекторЗ:(-1;1)(-1;0) (0;1)(0;0)(-1;-1)(1;1) (0;-1)(1;-1) (1;0)
1,-1,1,0,0,-1,0,0,-1,-1,-1,0,-1,- 1,0,1,1Л,//Сектор1:(1;-1)(1;0) (0;-1)(0;0) (-1;-1) (-1;0)(-1;-1)(0;1)(1;1)
-1,-1,0,-1,-1,0,0,0,1,-1,-
1,1,1,0,0,1,1,1,//Сектор 2: (-1;-1) (0;-1) (-1;0) (0;0) (1;-1) (-1;1) (1;0) (0;1)(1;1)
};
/*
{1Д},{1,0},{0,1},{0,0},{1,-1},{-1,1},{0,-1},{-1,0},{-1,-1}У {-1,1},{-1,0},{0,1},{0,0},{-1,-1},{1,1},{0г1},{1,-1},{1,0},/ {1,-1},{1,0},{0,-1},{0,0},{-1,-1},{-1,0},{-1,-1},{0,1},{1,1}, {-1,-1},{0,-1},{-1,0},{0,0},{1,-1},{-1,1},{1,0},{0,1},{1,1},/
*/
m_sTypeCopper = 1 ;//типа медь m_sType2 = 2;//типа фторопласт m_sType3 = 3;//буфер m_iNumberThread = 0; m_ArrayTreadCoordinat.SetSize (0, 0);
InputlnitialData dialog; dialog.DoModal();
m_fSizePaticle = dialog.
m_fSizePaticle;m_uNumber_cell_Z = dialog.m_uNumber_cell_Z;//pa3Mep моделируемого объема в ячейках по оси Z
m_uNumber_cell_X = dialog.m_uNumber_cell_X;//pa3Mep моделируемого объема в ячейках по оси X
m uNumber_cel 1_Y = dialog.m_uNumber_cell_Y;//pa3Mep моделируемого объема в ячейках по оси Y
//выделение места под массив указателей относительно оси Z
pppMassiv = new BYTE **[dialog.m_uNumber_cell_Z];
if (pppMassiv == NULL)
{
CErrorMemory dig;
dlg.m_sMessage = "Невозможно выделить память для массива указателей оси Z.";
dlg.DoModal(); геїшті;
}
srand( (unsigned)time( NULL ));
//расчет порога распределения
і = (32768 * dialog.m_fPercentCopper) / 100;
//выделение места под массивы указателей относительно оси Y for (uN = 0; uN < dialog.m_uNumber_cell_Z; uN++)
{
pppMassiv[uN] = new BYTE *[dialog.m_uNumber_cell_Y]; if (pppMassiv[uN] = NULL)
{
CErrorMemory dig;
dlg.m_sMessage = "Невозможно выделить память для массива указателей оси Y.";
dlg.DoModalO;
//освобождение выделенной памяти
delete [jpppMassiv;
return;
}
//выделение места под массив элементов относительно оси X for (uL-0; uL < dialog.m_uNumber_ceIl_Y; uL++ )
{
pppMassiv[uN][uL] = new BYTE [dialog.m_uNumber_cell_X]; if (pppMassiv[uN][uL] == NULL)
{
CErrorMemory dig;
dlg.m_sMessage = "Невозможно выделить память для массива элементов оси X.";
dlg.DoModal();
//освобождение выделенной памяти
delete [JpppMassiv;
return
}
for ( uH = 0; uH < dialog.m_uNumber_ceIl_X; uH++ )
{
if((int)i>rand())
{
//медь
pppMassiv[uN][uL][uH] = m_sTypeCopper; uNumberCopper++;
}
else
{
//фторопласт
pppMassiv[uN][uL][uH] = m_sType2;
}
}
}
>
m_sReport += "\\n"; _ultoa( uNumberCopper, buffer, 10 ); m_sReport += "uNumberCopper = m_sReport += buffer; mjiReport += "\\n";
_ultoa( m_uNumber__cell_X*m_uNumber_cel 1_Z* m_uNumber_cell_Y, buffer,
10);
m_sReport += "Всего элементов:";
m_sReport += buffer;
m_sReport+="\\n";
_ultoa( dialog.m_uNumber_cell_X, buffer, 10 );
m_sReport += "Число ячеек по оси X = "; m^sReport += buffer; mjjReport += "Wn"; ultoa( dialog.m_uNumber_cell_Z, buffer, 10); m_sReport += "Число ячеек по оси Z = "; m_sReport += buffer; m_sReport+="\\n";
_ultoa( dialog.m_uNumber_ceIl_Y, buffer, 10 ); m_sReport += "Число ячеек по оси Y = "; m_sReport += buffer; m_sReport+=,,\\nM;
ultoa( dialog.m_fPercentCopper, buffer, 10 ); m_sReport += "Процентов порошка меди по объему: "; m_sReport += buffer; m_sReport += "\\n";
//формирование распечатки массива отклонений for ( uN = 0 ; uN < 2 ; uN++ )
{
for(i=0;i<2;i++) {
_ultoa( uN, buffer, 10 ); mjsReport+=" индекс X:"; m_sReport +- buffer; _itoa( i, buffer, 10 ); m_sReport +=" индекс Y:"; mjsReport += buffer; m_sReport += "\\n"; for (ul=0 ; ul<9 ; ul++ )
{
_itoa( iDeviation[uN][i][uI][0], buffer, 10); m_sReport += buffer; mjsReport +^ V;
_jtoa( iDeviation[uN][i][uI][l], buffer, 10); m_sReport += buffer; m_sReport +=","; }
m_sReport+="\\n";
}
}
// формирование распечатки массива
for (uN = 0; uN < dialog.m_uNumber_cell_Z; uN++)
{
m_sReport += "\\пНомер плоскости XY по оси Z: "; _ultoa( uN, buffer, 10); m_sReport += buffer; m_sReport+= "\\n";
for (uL=0; uL < dialog.m_uNumber_cell_Y; uL++ ) {
for (uH = 0; uH < dialog.m_uNumber_cell_X ; uH++ ) {
_itoa( (mt)pppMassiv[uN][uL][uH], buffer, 10 ); m_sReport += buffer;
}
m_sReport += "Wn";
}
//определение числа нитей от поверхности YX(0) к поверхности YX(m_uNumber_cell_Z)
//pppMassiv[m_uNumber_cell_Z][m_uNumber_ceH_Y]
for ( uY = 0; uY < m_uNumber_cell__Y; uY++ )//начальная Y координата на нулевой плоскости
{//начало цикла передвижения по оси Y
for ( uX = 0 ; uX < m_uNumber_ceil_X; иХ++)//начальная X координата на нулевой плоскости
{//начало цикла передвижения по оси X
//в любом отдельно взятом кубе должно быть не более 3 ячеек принадлекащих какой либо нити uCurrentY ~ uY; uCurrentX - uX;
uCurrentZ = 0;//установление нулевой плоскости TRACE3 ("# 12 начальные координаты uCurrentX= %d uCurrentY~%d uCurrentZ=%d \n", uCurrentX, uCurrentY,uCurrentZ); //проверка текущей ячейки
if ( pppMassiv[uCurrentZ][uCurrentY] [uCurrentX] !=
msTypeCopper)
{
TRACE 1("# 13 начальная ячейка не является медной - материал=%гі\п", (int)pppMassiv[uCurrentZ][uCurrentY][uCurrentX]);
сопипие;//начальная ячейка не является медной
}
TRACE3("#1 начальная ячейка X=%d Y=%d Z =%d", uCurrentX,uCurrentY,uCurrentZ);
TRACE 1 (" MaTepHan=%d\n",
(int)pppMassiv[uCurrentZ][uCurrentY][uCurrentX]);
//включение координаты в список
m_CoordinateCurrentPointm_uX = uCurrentX;
m_CoordinateCurrentPoint.m_uY - uCurrentY; m_CoordinateCurrentPoint.m_u2 = 0; m_ArrayTreadCoordinat.Add(rn_CoordinateCurrentPoint);
for ( uCurrentZ=l; uCurrentZ < m_uNumber_cell_Z; uCurrentZ++)//TeKynjaa Z координата
{//начало цикла выявления цепочки
//проверка на наличие нулевого отклонения if ( ( uX - uCurrentX ) + (uY - uCurrentY) == 0 ) {
//проверка ячейки выше текущей
if (
pppMassiv[uCurTentZ][uCurrentY][uCurrentX] = m_sTypeCopper)
{
//включение координаты в список m_CoordinateCurrentPoint.m_uX =
uCurrentX;
m_CoordinateCurrentPoint.m_uY =
uCurrentY;
m_CoordinateCurrentPomt.m_uZ =
uCurrentZ;
m_ArrayTreadCoordinat.Add(m_CoordinateCurrentPoint);
ulndicationlnclude =0;
TRACE3 ("#11 включение uCurrentX= %d uCurrentY=%d uCurrentZ=%d uCurrentX, uCurrentY,uCurrentZ);
TRACE 1 ("#11,1 материал^%а\пи, (int)pppMassiv[uCiirrentZ][uCurrentY][uCurrentX]);
continue;
}
}
//выбор проверки последовательности 9 частиц по
секторам
uDeviationX = ( uX - uCurrentX < 0 ) ? ( 0 ) : ( 1 );//-1 заменяем на 0 для облегчения адресации в массиве
uDeviationY = ( uY - uCurrentY < 0 ) ? ( 0 ): ( 1 );
for ( uN =0 ;uN <9 ; uN++ )
{//начало цикла просмотра вышележащих 9
координат
//расчет координат соответственно
отклонениям
ІХ1 = uCurrentX +
iDeviation№eviationX][uDeviationY][uN][0];
if (iXl >= (int)m_uNumber_cell_X )
{
ІХІ = m_uNumber_ceII_X -1;
}
if(iXK0)iXl =0;
iYl = uCurrentY +
iDeviation[uDeviationY][uDeviationY][uN][l];
if (iYl >- (int)m_uNumber_cell"Y) {
iYl = m_uNumber_cell_Y -1;
}
if(iYK0)iYl=0;
//просмотр согласно выбранной
последовательности проверки 9 частиц в выше лежащей плоскости
//strncpy (&m_sType3, &pppMassiv[uCurrentZ +
l][iYl][iXl], 1);
TRACE3 ("#2 просмотр iXl= %d iYl=%d
Z=%d", iXl, iYl,uCurrentZ);
TRACE 1 ("#2.1 материал=%а\п*\
(int)pppMassiv[uCurrentZ][iYl][iXl]);
if ( pppMassiv[uCurrentZ][iYl][iXl] =
m_sTypeCopper)
{
TRACE3 ("#5 включение iXl= %d iYl=%d
Z=%d ", iXl, iYl,uCurrentZ);
TRACE 1 ("#4.1 материал*%а\пп,
(int)pppMassiv[uCurrentZ][iYl][iXl]);
//включение координаты в список m_CoordinateCurrentPoint.m_uX =
iXl;
m_CoordinateCurrentPoint.m_uY =
iYl;
m_CoordinateCurrentPoint.m_uZ =
uCurrentZ;
m_ArrayTreadCoordinat.Add(m_CoordinateCurrentPoint);
//установление новых текущих
координат по осям XY
uCurrentX = (UINT)iXl; uCurrentY = (UINT)iYl; ulndicationlnclude =1; break;
}//конец цикла просмотра вышележащих 9
координат
if (ulndicationlnclude = 1)
{
ulndicationlnclude - 0; continue;
}
//если дошли до сюда то в плоскоси на высоте uCurrentZ + 1 нет ни одной медной частицы
//установление установление новых текущих
координат по осям XY
if (m_ArrayTreadCoordinatGetSize()-2 < 0) {//нить оказалась полностью тупиковой
TRACE0("#3 нить оказалась полностью
тупиковойЛп");
m_ArrayTreadCoordinat.RemoveAll();
uCurrentZ = 0;
break;
}
TRACE0("#4 тупике");
uCurrentX =
m_ArrayTreadCoordinat. GetAt(m_ArrayTreadCoordinat GetSize()-2).m_uX;
uCurrentY =
m_ArrayTreadCooraUnat.GetAt(m_ArrayTreadCoordinat.GetSize()-2).m_uY;
uCurrentZ =
m_ArrayTreadCoordinat.GetAt(m_ArrayTreadCoordinat.GetSize()-2).m_uZ;
//следовательно последняя частица нити тупиковая и
ее необходио удалить
pppMassiv[
m_ArrayTreadCoordmat.GetAt(m_ArrayTreadCoordinat.GetSize()-1 ).m_uZ ]
[
m_ArrayTreadCoordinat.GetAt(m_ArrayTreadCoordinat.GetSize()-1 ).m_uY ]
[
m_ArrayTreadCoordinat.GetAt(m_ArrayTreadCoordinat.GetSize()-l).m_uX ] m_sType2;
m_An4ayTreadCoordinat.RemoveAt(m_ArrayTreadCoordinat.GetSize()-l); }//конец цикла выявления цепочки if( uCurrentZ == 0 )
{//нить оказалась полностью тупиковой m_ArrayTreadCoordinat.Remove А11(); continue;
}
//выход на конечную плосткость m_iNumberThread-H-; //удаление обнаруженной нити TRACE0 ("#6 удаление обнаруженной нити\п"); for ( ul 0; ul <=
(UINT)m_ArrayTreadCoordinat.GetSize ()-l; ul++)
{
pppMassiv[
m_ArrayTreadCoordinat.GetAt(uI).m_uZ ]
[
m_ArrayTreadCoordinat.GetAt(uI).m_uY ]
[
m_ArrayTreadCoordinat.GetAt(uI).m_uX ] = m_sType2;
//удаление координат нити
TRACE 1 ("#8 номер нити = %d\n'\
m_iNumberThread);
m_ArrayTreadCoordinat.Remove Al 1(); }//конец цикла передвижения по оси X }//конец цикла передвижения по оси Y TRACE 1 ("#7 число нитей = %d\n", m_iNumberThread); m_sReport += "Wn"; _ultoa( m_iNumberThread, buffer, 10 ); m_sReport += "число нитей = "; m_sReport +== buffer; m_sReport += "\\n"; /* // формирование распечатки обработанного массива for (uN = 0; uN < dialog.m_uNumber_cell_Z; uN++) {
m_sReport += "\\пНомер плоскости XY по оси Z:"; __ultoa( uN, buffer, 10 ); m_sReport += buffer; m_sReport += "\\n";
for (uL=0; uL < dialog.m_uNumber_cell_Y; uL-н-) {
for (uH = 0; uH < dialog.m_uNumber_cell_X ; uH++) {
_itoa( (int)pppMassiv[uN][uL][uH], buffer, 10); m_sReport +- buffer;
}
m_sReport+="\\n";
} */
//возврат выделенной памяти под массив элементов относительно оси
for (uN = 0; uN < dialog.m_uNumber_cell_Z; uN++)
{
TRACE1 ("#9 возврат выделенной памяти uN = %d\n", uN); for (uL=0; uL < dialog.m_uNumber_cell_Y; uL++)
{
delete []pppMassiv[uN][uL];
}
delete []pppMassiv[uN];
}
TRACEO ("#10 возврат выделенной памяти pppMassivW); delete [JpppMassiv;
TRACE1 ("#9.1 конец возврата выделенной памяти uN = %d\n'\ uN);
}