void mexFunction(int nlhs, mxArray *plhs[], /* Output variables */ int nrhs, const mxArray *prhs[]) /* Input variables */ { #define ccr(ai,bi) (ccr[ai+Nss[0]*bi]) #define cci(ai,bi) (cci[ai+Nss[0]*bi]) #define kk1(ai,bi) (kk1[ai+Nss[0]*bi]) #define kk2(ai,bi) (kk2[ai+Nss[0]*bi]) #define kb(loc1,loc2,ai,bi) kb[loc1+NB1*(loc2+NB2*(ai+Nss[0]*bi))] #define avgdx(loc1,loc2,ai,bi) avgdx[loc1+NB1*(loc2+NB2*(ai+Nss[0]*bi))] #define avgdy(loc1,loc2,ai,bi) avgdy[loc1+NB1*(loc2+NB2*(ai+Nss[0]*bi))] size_t ai, bi; int NB1, NB2, loc1, loc2, di = 0; double *kk1, *kk2, *ccr, *cci, *kb, *avgdx, *avgdy; double EXT, num_dir, da, dr, r, agl, R_low; double temp_energy; ccr = mxGetPr(prhs[0]); cci = mxGetPi(prhs[0]); kk1 = mxGetPr(prhs[1]); kk2 = mxGetPr(prhs[2]); EXT = mxGetScalar(prhs[3]); num_dir = mxGetScalar(prhs[4]); da = mxGetScalar(prhs[5]); dr = mxGetScalar(prhs[6]); NB1 = mxGetScalar(prhs[7]); NB2 = mxGetScalar(prhs[8]); R_low = mxGetScalar(prhs[9]); const mwSize *Nss = mxGetDimensions(prhs[0]); kb = mxGetPr(prhs[10]); avgdx = mxGetPr(prhs[11]); avgdy = mxGetPr(prhs[12]); nrhs = 13; nlhs = 0; for (ai=0;ai<Nss[0];ai++) { for (bi=0;bi<Nss[1];bi++) { if (kk1(ai,bi)<EXT) { r = sqrt(kk1(ai,bi)*kk1(ai,bi)+kk2(ai,bi)*kk2(ai,bi)); if (kk1(ai,bi)>=0) { agl = fmod(acos(kk2(ai,bi)/r),num_dir); } else agl = fmod(3.1415926-acos(kk2(ai,bi)/r),num_dir); loc1 = round((r-R_low)/dr); loc2 = round(agl/da); temp_energy = ccr(ai,bi)*ccr(ai,bi) + cci(ai,bi)*cci(ai,bi); kb(loc1,loc2,ai,bi) = kb(loc1,loc2,ai,bi) + temp_energy; avgdx(loc1,loc2,ai,bi) = avgdx(loc1,loc2,ai,bi) + r * cos(agl) * temp_energy; avgdy(loc1,loc2,ai,bi) = avgdy(loc1,loc2,ai,bi) + r * sin(agl) * temp_energy; /* cannot use kk since those are symmetric */ } } } return; }
static void set_dst_variable(EmbPattern* pattern, char* var, char* val) { unsigned int i; EmbThread t; for(i = 0; i <= (unsigned int)strlen(var); i++) { /* upcase var */ if(var[i] >= 'a' && var[i] <= 'z') { var[i] += 'A' - 'a'; } } /* macro converts 2 characters to 1 int, allows case statement... */ switch(cci(var[0],var[1])) { case cci('L','A'): /* Design Name (LA) */ /*pattern->set_variable("Design_Name",val); TODO: review this line. */ break; case cci('S','T'): /* Stitch count, 7 digits padded by leading 0's */ case cci('C','O'): /* Color change count, 3 digits padded by leading 0's */ case cci('+','X'): /* Design extents (+/-X,+/-Y), 5 digits padded by leading 0's */ case cci('-','X'): case cci('+','Y'): case cci('-','Y'): /* don't store these variables, they are recalculated at save */ break; case cci('A','X'): /* Relative coordinates of last point, 6 digits, padded with leading spaces, first char may be +/- */ case cci('A','Y'): case cci('M','X'): /* Coordinates of last point in previous file of multi-volume design, 6 digits, padded with leading spaces, first char may be +/- */ case cci('M','Y'): /* store these variables as-is, they will be converted to numbers and back at save; */ /*pattern->set_variable(var,val); TODO: review this line. */ break; case cci('P','D'): /* store this string as-is, it will be saved as-is, 6 characters */ if(strlen(val) != 6) { /*pattern->messages.add("Warning: in DST file read, PD is not 6 characters, but ",(int)strlen(val)); */ } /*pattern->set_variable(var,val);*/ break; /* Begin extended fields section */ case cci('A','U'): /* Author string, arbitrary length */ case cci('C','P'): /* Copyright string, arbitrary length */ /*pattern->set_variable(var,val); TODO: review this line. */ break; case cci('T','C'): /*Thread Color: #RRGGBB,Description,Catalog Number (1st field RGB hex values, 2nd&3rd fields optional arbitrary length) */ /* TODO: review these lines below. description=split_cell_str(val,2); catalog_number=split_cell_str(val,3); */ t.color = embColor_fromHexStr(val); t.description = ""; t.catalogNumber = ""; embPattern_addThread(pattern, t); break; default: /* unknown field, just save it. */ /*pattern->set_variable(var,val); TODO: review this line. */ break; } }