real get_omega(real ekin,int *seed,FILE *fp,char *fn) { static t_p2Ddata *p2Ddata = NULL; real r,ome,fx,fy; int eindex,oindex; if (p2Ddata == NULL) p2Ddata = read_p2Ddata(fn); /* Get energy index by binary search */ if ((eindex = my_bsearch(ekin,p2Ddata->nener,p2Ddata->ener,TRUE)) >= 0) { #ifdef DEBUG if (eindex >= p2Ddata->nener) gmx_fatal(FARGS,"eindex (%d) out of range (max %d) in get_omega", eindex,p2Ddata->nener); #endif /* Start with random number */ r = rando(seed); /* Do binary search in the energy table */ if ((oindex = my_bsearch(r,p2Ddata->n2Ddata,p2Ddata->prob[eindex],TRUE)) >= 0) { #ifdef DEBUG if (oindex >= p2Ddata->n2Ddata) gmx_fatal(FARGS,"oindex (%d) out of range (max %d) in get_omega", oindex,p2Ddata->n2Ddata); #endif fy = ((r-p2Ddata->prob[eindex][oindex])/ (p2Ddata->prob[eindex][oindex+1]-p2Ddata->prob[eindex][oindex])); ome = interpolate2D(p2Ddata->nener,p2Ddata->n2Ddata,p2Ddata->ener, p2Ddata->data,ekin,fy, eindex,oindex); /* ome = p2Ddata->data[eindex][oindex];*/ if (fp) fprintf(fp,"%8.3f %8.3f\n",ome,r); return ome; } } return 0; }
UtilityInterval DistXContourTest::eval(IAssignment ass) const { UtilityInterval ui(0.0, 0.0); std::pair<double, double> lastpoint; lastpoint.first = -18000 / 2; lastpoint.second = xMinVal; std::pair<double, double> nextpoint; nextpoint.first = 18000 / 2; nextpoint.second = xMaxVal; double val = 0; if (contourPoints.empty()) { return ui; } for (int i = 0; i < static_cast<int>(contourPoints.size()); ++i) { if (contourPoints[i].first < xAlloBall && contourPoints[i].first > lastpoint.first) { lastpoint = contourPoints[i]; } if (contourPoints[i].first > xAlloBall && contourPoints[i].first < nextpoint.first) { nextpoint = contourPoints[i]; } } if (xAlloBall > 18000 / 2) val = xMaxVal; else if (xAlloBall < -18000 / 2) val = xMinVal; else val = interpolate2D(lastpoint.first, lastpoint.second, nextpoint.first, nextpoint.second, xAlloBall); ui.setMin(val); ui.setMax(val); return ui; }
/*linear*/ void rot2dlin (float *image,float *rotimg,long sx,long sy,float *p_phi,float px,float py,int euler_dim) { float rm00, rm01, rm10, rm11; /* rot matrix */ float pi, pj; /* coordinates according to pivot */ float r_x, r_y; /* rotated pixel */ long i, j; /* loop variables */ long sx_1, sy_1; /* highest pixels | image width and height */ /*float *imgp;*/ float phi; phi=p_phi[0]; phi = phi * PI / 180; if (euler_dim == 1) { /* rotation matrix */ rm00 = cos(phi); rm01 = -sin(phi); rm10 = sin(phi); rm11 = cos(phi); /*printf("coeff: %f %f %f %f /n",rm00,rm01,rm10,rm11);*/ } else { rm00 = p_phi[0]; rm10 = p_phi[1]; rm01 = p_phi[2]; rm11 = p_phi[3]; } sx_1 = sx - 1; /*width*/ sy_1 = sy - 1; /*height*/ for (pj=-py, j=0; j<sy; j++, pj++) { for (pi=-px, i=0; i<sx; i++, pi++) { /* transformation of coordinates (rotataion)*/ r_x = px + rm00 * pi + rm10 * pj; if (r_x < 0 || r_x > sx_1 ) { *rotimg++ = 0; /* pixel not inside -> set 0*/ continue; } r_y = py + rm01 * pi + rm11 * pj; if (r_y < 0 || r_y > sy_1 ) { *rotimg++ = 0; continue; } /* Interpolation */ *rotimg++ = interpolate2D(image,sx,sy, r_x,r_y,__TOM_INTERPOL_LINEAR); } } }
/*cubic spline*/ void rot2dcspline (float *image,float *rotimg,long sx,long sy,float *p_phi,float px,float py,int euler_dim,float* fact) { float rm00, rm01, rm10, rm11; /* rot matrix */ float pi, pj; /* coordinates according to pivot */ float r_x, r_y; /* rotated pixel */ long i, j; /* loop variables */ long sx_1, sy_1; /* highest pixels | image width and height */ /*long floorx, floory;*/ /* rotated coordinates as integer */ /*float vx1, vx2;*/ /* interp. parameter */ /*float vy1, vy2;*/ /* ... */ /*float *imgp;*/ float phi; float f1,f2,f3,f4; long borderx1,borderx2,bordery1,bordery2; phi=p_phi[0]; phi = phi * PI / 180; if (euler_dim == 1) { /* rotation matrix */ rm00 = cos(phi); rm01 = -sin(phi); rm10 = sin(phi); rm11 = cos(phi); /*printf("coeff: %f %f %f %f /n",rm00,rm01,rm10,rm11);*/ } else { rm00 = p_phi[0]; rm10 = p_phi[1]; rm01 = p_phi[2]; rm11 = p_phi[3]; } /*cubic spline interpolation*/ sx_1 = sx - 1; sy_1 = sy - 1; /*values for natural spline , quadratic*/ if(fact != NULL){ f1=fact[0];/* -0.1556; 1556 , 0940*/ f2=fact[1];/* 0.3111; 3111 , 1880*/ f3=fact[2];/* -0.0889; 0889 , 0342*/ f4=fact[3];/* 0.0444; 0444 , 0171*/ }else{ f1= -0.1556; f2=0.3111; f3=-0.0889; f4=0.0444; } borderx1=2; bordery1=2; borderx2=sx-2; bordery2=sy-2; for (pj=-py, j=0; j<sy; j++, pj++) { for (pi=-px, i=0; i<sx; i++, pi++) { /*printf("x%d y%d %d %d\n",sx,sy,i,j);*/ /* transformation of coordinates */ /* rotate pixel of interest */ r_x = px + rm00 * pi + rm10 * pj; r_y = py + rm01 * pi + rm11 * pj; /*if any point of interpolation square out of bounds, return linear2D interpolation or 0*/ if (r_x < borderx1 || r_x > borderx2 || r_y < borderx1 || r_y > bordery2) { if(r_x < 1 || r_x > sx-1 || r_y < 1 || r_y > sy-1){ /*if not in image anymore, return 0*/ *rotimg++ = 0; continue; } *rotimg++ = interpolate2D(image,sx,sy, r_x,r_y,__TOM_INTERPOL_LINEAR); }else{ *rotimg++ = interpolate2D(image,sx,sy, r_x,r_y,__TOM_INTERPOL_CSPLINE); } } } }
void rot2dcubic(float *image,float *rotimg,long sx,long sy,float *p_phi,float px,float py,int euler_dim){ float rm00, rm01, rm10, rm11; /* rot matrix */ float pi, pj; /* coordinates according to pivot */ float r_x, r_y; /* rotated pixel */ long i, j; /* loop variables */ /*long sx_1, sy_1; *//* highest pixels | image width and height */ /*float *imgp;*/ float phi; long borderx1,borderx2,bordery1,bordery2; phi=p_phi[0]; phi = phi * PI / 180; if (euler_dim == 1) { /* rotation matrix */ rm00 = cos(phi); rm01 = -sin(phi); rm10 = sin(phi); rm11 = cos(phi); /*printf("coeff: %f %f %f %f /n",rm00,rm01,rm10,rm11);*/ } else { rm00 = p_phi[0]; rm10 = p_phi[1]; rm01 = p_phi[2]; rm11 = p_phi[3]; } borderx1=1; bordery1=1; borderx2=sx-1; bordery2=sy-1; for (pj=-py, j=0; j<sy; j++, pj++) { for (pi=-px, i=0; i<sx; i++, pi++) { /*printf("x%d y%d %d %d\n",sx,sy,i,j);*/ /* transformation of coordinates */ /* rotate pixel of interest */ r_x = px + rm00 * pi + rm10 * pj; r_y = py + rm01 * pi + rm11 * pj; /*if any point of interpolation square out of bounds, return linear2D interpolation or 0*/ if (r_x < borderx1 || r_x > borderx2 || r_y < borderx1 || r_y > bordery2) { if(r_x < 1 || r_x > sx-1 || r_y < 1 || r_y > sy-1){ /*if not in image anymore, return 0*/ *rotimg++ = 0; continue; } *rotimg++ = interpolate2D(image,sx,sy, r_x,r_y,__TOM_INTERPOL_LINEAR); }else{ *rotimg++ = interpolate2D(image,sx,sy, r_x,r_y,__TOM_INTERPOL_CUBIC); } } } }