short RandomInRange(short min, short max); typedef pascal struct plugInParameterNumber { double realPart, imPart; } plugInParameterNumber; typedef pascal plugInParameterNumber plugInParameterArray[]; typedef pascal plugInParameterArray* plugInParameterPtr; typedef pascal plugInParameterPtr* plugInParameterHandle; pascal enum {deg, rad, grad}; float WhereExt(short which, float rx, float rz, float range_x, float range_z, float rangeT_x, float rangeT_z, int intvls, float alpha, float beta, float xo, float zo); float randomVar(float mean, float rangeT); void pascal main(plugInParameterHandle params, int mode) { /*============================================================================ params Input parameters (fields 1,2,...) Result (field 0) ============================================================================ which rx rz range_x range_z rangeT_x rangeT_z intvls alpha beta xo zo 1 2 3 4 5 6 7 8 9 10 11 12 */ GetDateTime((unsigned long*) &qd.randSeed); float rx, rz, alpha, beta, xo, zo, range_x, range_z, rangeT_x, rangeT_z; int intvls; short which; which = (**params)[1].realPart; rx = (**params)[2].realPart; rz = (**params)[3].realPart; range_x = (**params)[4].realPart; range_z = (**params)[5].realPart; rangeT_x= (**params)[6].realPart; rangeT_z= (**params)[7].realPart; intvls = (**params)[8].realPart; alpha = (**params)[9].realPart; beta = (**params)[10].realPart; xo = (**params)[11].realPart; zo = (**params)[12].realPart; (**params)[0].realPart = WhereExt(which, rx, rz, range_x, range_z, rangeT_x, rangeT_z, intvls, alpha, beta, xo, zo); } float WhereExt(short which, float rx, float rz, float range_x, float range_z, float rangeT_x, float rangeT_z, int intvls, float alpha, float beta, float xo, float zo) { float *x_new = new float[intvls]; float *z_new = new float[intvls]; float *x_old = new float[intvls]; float *z_old = new float[intvls]; short *comb_matrix = new short[intvls]; float tot_x, tot_z, new_av_x, new_av_z; for(short i = 0; i <= intvls - 1; i++) comb_matrix[i] = i; for(short i = 0; i <= intvls - 1; i++) { x_old[i] = xo; z_old[i] = zo; } for(short gen = 1; gen <= 500; gen++) { tot_x = 0; tot_z = 0; for(short n = 1; n <= intvls * 10; n++) { short dummy; short i1 = RandomInRange(0, intvls - 1); short i2 = RandomInRange(0, intvls - 1); dummy = comb_matrix[i1]; comb_matrix[i1] = comb_matrix[i2]; comb_matrix[i2] = dummy; } for(short i = 0; i <= intvls - 1; i++) { short xi = i; short zi = comb_matrix[i]; x_new[xi] = randomVar(rx + range_x / intvls * xi, rangeT_x) * x_old[xi] * (1 - x_old[xi] - alpha * z_old[zi]); z_new[zi] = randomVar(rz + range_z / intvls * zi, rangeT_z) * z_old[zi] * (1 - z_old[zi] - beta * x_old[xi]); x_old[xi] = x_new[xi]; z_old[zi] = z_new[zi]; tot_x += x_new[xi]; tot_z += z_new[zi]; } new_av_x = tot_x / intvls; new_av_z = tot_z / intvls; if(which == 1) // x { if(new_av_x <= 0 && new_av_z > 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return gen; } if(new_av_z <= 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return 0; } } if(which == 2) // z { if(new_av_z <= 0 && new_av_x > 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return gen; } if(new_av_x <= 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return 0; } } if(which == 3) // both { if(new_av_x <= 0 && new_av_z <= 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return gen; } if(new_av_x <= 0 || new_av_z <= 0) { delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return 0; } } } delete x_new; delete z_new; delete x_old; delete z_old; delete comb_matrix; return 0; } short RandomInRange(short min, short max) { unsigned short value; short range; long temp; value = Random(); range = max - min; temp = ((long)range * value) / 65536; return (temp + min); } float randomVar(float mean, float rangeT) { float rand = (rangeT*Random())/65536.0; // uniform: 0-rangeT return rand - (rangeT/2) + mean; // uniform: mean(+/-)range/2 }