<<
>>

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);

}

<< | >>
Источник: Кузнецов Василий Юрьевич. АВТОМАТИЗАЦИЯ ТЕХНОЛОГИЙ ПРОИЗВОДСТВА АРМИРОВАННЫХ КОМПОЗИЦИОННЫХ МАТЕРИАЛОВ И ПОКРЫТИЙ ДЛЯ КОНСТРУКЦИЙ ЛЕТАТЕЛЬНЫХАППАРАТОВ. 2003

Еще по теме 4.1.3. Листинг блока моделирующего двухкомпонентную смесь с выборкой нитей.: