/** \file bouncexy.c \author Benoit Bayol \version 1.0 \date September 2006 - January 2007 \brief BOUNCEXY has to be used with bounce_ball block \see BOUNCEXY.sci in macros/scicos_blocks/Misc/ */ #include "scoMemoryScope.h" #include "scoWindowScope.h" #include "scoMisc.h" #include "scoGetProperty.h" #include "scoSetProperty.h" #include "scicos_block4.h" /** \fn bouncexy_draw(scicos_block * block, ScopeMemory ** pScopeMemory, int firstdraw) \brief Function to draw or redraw the window */ void bouncexy_draw(scicos_block * block, ScopeMemory ** pScopeMemory, int firstdraw) { scoGraphicalObject pAxes; scoGraphicalObject pTemp; double * z; double *rpar; int *ipar, nipar; int i,j; int dimension; double ymin, ymax, xmin, xmax; int win; int number_of_subwin; int number_of_curves_by_subwin; int * colors; int imode; double * size_balls; double radius_max; /*Retrieving Parameters*/ rpar = GetRparPtrs(block); ipar = GetIparPtrs(block); nipar = GetNipar(block); win = ipar[0]; if (win == -1) { win = 20000 + get_block_number() ; } dimension = 2; imode = ipar[1]; number_of_curves_by_subwin = GetInPortRows(block,1); radius_max = 0; size_balls = (double*)scicos_malloc(number_of_curves_by_subwin*sizeof(double)); z = GetDstate(block); for(i = 0 ; i < number_of_curves_by_subwin ; i++) { size_balls[i] = z[6*i+2]; if(radius_max < size_balls[i]) { radius_max = size_balls[i]; } } number_of_subwin = 1; xmin = rpar[0]; xmax = rpar[1]; ymin = rpar[2]; ymax = rpar[3]; colors = (int*)scicos_malloc(number_of_curves_by_subwin*sizeof(int)); for(i = 0 ; i < number_of_curves_by_subwin ; i++) { colors[i] = ipar[i+2]; } if(firstdraw == 1) { /*Allocating memory*/ scoInitScopeMemory(GetPtrWorkPtrs(block),pScopeMemory, number_of_subwin, &number_of_curves_by_subwin); } /*Creating the Scope*/ scoInitOfWindow(*pScopeMemory, dimension, win, NULL, NULL, &xmin, &xmax, &ymin, &ymax, NULL, NULL); if(scoGetScopeActivation(*pScopeMemory) == 1) { pTemp = scoGetPointerScopeWindow(*pScopeMemory); pAxes = scoGetPointerAxes(*pScopeMemory,0); pSUBWIN_FEATURE(pAxes)->isoview = TRUE; (pSUBWIN_FEATURE(pAxes)->axes).axes_visible[0] = FALSE; (pSUBWIN_FEATURE(pAxes)->axes).axes_visible[1] = FALSE; sciSetIsBoxed(pAxes, FALSE); pFIGURE_FEATURE(pTemp)->pixmap = 1; pFIGURE_FEATURE(pTemp)->wshow = 1; for(j = 0 ; j < number_of_curves_by_subwin ; j++) { scoAddSphereForShortDraw(*pScopeMemory, 0, j, size_balls[j], colors[j]); } scoAddRectangleForLongDraw(*pScopeMemory,0,0,xmin,(ymax-fabs(ymin)),fabs(xmax-xmin),fabs(ymax-ymin)); sciDrawObj(scoGetPointerLongDraw(*pScopeMemory,0,0)); } scicos_free(colors); scicos_free(size_balls); } /** \fn void bouncexy(scicos_block * block,int flag) \brief the computational function \param block A pointer to a scicos_block \param flag An integer which indicates the state of the block (init, update, ending) */ void bouncexy(scicos_block * block,int flag) { void **_work=GetPtrWorkPtrs(block); ScopeMemory * pScopeMemory; scoGraphicalObject pShortDraw; scoGraphicalObject pLongDraw; double * z; double t; int i; double * u1, *u2; double * size_balls; int **user_data_ptr,*size_ptr; switch(flag) { case Initialization: { bouncexy_draw(block,&pScopeMemory,1); break; } case StateUpdate: { /*Retreiving Scope in the _work*/ scoRetrieveScopeMemory(_work,&pScopeMemory); if(scoGetScopeActivation(pScopeMemory) == 1) { t = GetScicosTime(block); /*If window has been destroyed we recreate it*/ if(scoGetPointerScopeWindow(pScopeMemory) == NULL) { bouncexy_draw(block,&pScopeMemory,0); } //Cannot be factorized depends of the scope size_balls = (double*)scicos_malloc(scoGetNumberOfCurvesBySubwin(pScopeMemory,0)*sizeof(double)); z = GetDstate(block); for(i = 0 ; i < scoGetNumberOfCurvesBySubwin(pScopeMemory,0) ; i++) { size_balls[i] = z[6*i+2]; } u1 = GetRealInPortPtrs(block,1); u2 = GetRealInPortPtrs(block,2); for (i = 0 ; i < scoGetNumberOfCurvesBySubwin(pScopeMemory,0) ; i++) { pShortDraw = scoGetPointerShortDraw(pScopeMemory,0,i); pLongDraw = scoGetPointerLongDraw(pScopeMemory,0,i); pARC_FEATURE(pShortDraw)->x = u1[i]-size_balls[i]/2; pARC_FEATURE(pShortDraw)->y = u2[i]+size_balls[i]/2; } sciSetUsedWindow(scoGetWindowID(pScopeMemory)); if(pFIGURE_FEATURE(scoGetPointerScopeWindow(pScopeMemory))->pixmap == 1) { C2F(dr)("xset","wshow",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); sciDrawObj(scoGetPointerScopeWindow(pScopeMemory)); } else { sciDrawObj(scoGetPointerScopeWindow(pScopeMemory)); } scicos_free(size_balls); } break; } case Ending: { scoRetrieveScopeMemory(_work, &pScopeMemory); if(scoGetScopeActivation(pScopeMemory) == 1) { if(scoGetPointerScopeWindow(pScopeMemory) != NULL) { sciSetUsedWindow(scoGetWindowID(pScopeMemory)); pShortDraw = sciGetCurrentFigure(); sciGetPointerToUserData (pShortDraw,&user_data_ptr, &size_ptr); FREE(*user_data_ptr); *user_data_ptr=NULL; *size_ptr = 0; } } scoFreeScopeMemory(_work, &pScopeMemory); break; } } }