void PREFIX cmap_restraint(int i_c, struct mtd_data_s *mtd_data) { int iat, i, tot_con; struct sz_data *pmy_sz; struct cmap_inpack inpack; real cmap; int jj,k,j,ii,jjj,iii; int tot; real tmp4_r0_0,tmp4_r0_1,tmp4_r0_2; real tmp2_r0,tmp3_r0, dist_r0; real tmp1,tmp2,tmp3; real pow_P, pow_Q, R01; int P1,Q1; rvec rij; cmap = 0.; pmy_sz=&my_sz_list[ic_to_sz[i_c]]; for (i=0;i<colvar.natoms[i_c];i++){ iat = colvar.cvatoms[i_c][i]; inpack.r0[i][0] = mtd_data->pos[iat][0]; inpack.r0[i][1] = mtd_data->pos[iat][1]; inpack.r0[i][2] = mtd_data->pos[iat][2]; } cmap_running(i_c, &inpack,&pmy_sz->my_cmap_pack); tot_con=pmy_sz->my_cmap_pack.number+pmy_sz->my_cmap_pack.gnumber; for(i=0;i<tot_con;i++) cmap += inpack.cmap[i]; colvar.ss0[i_c] = cmap; // derivatives calculation for(i=0;i<colvar.natoms[i_c];i++) { colvar.myder[i_c][i][0] = 0.; colvar.myder[i_c][i][1] = 0.; colvar.myder[i_c][i][2] = 0.; } for(j=0;j<pmy_sz->my_cmap_pack.number;j++){ if(pmy_sz->my_cmap_pack.weight[j]!=0){ ii=pmy_sz->my_cmap_pack.index_from1[j]; jj=pmy_sz->my_cmap_pack.index_from2[j]; if(colvar.cell_pbc[i_c]){ minimal_image(inpack.r0[ii], inpack.r0[jj], &dist_r0, rij); } else { rij[0] = inpack.r0[ii][0]-inpack.r0[jj][0]; rij[1] = inpack.r0[ii][1]-inpack.r0[jj][1]; rij[2] = inpack.r0[ii][2]-inpack.r0[jj][2]; dist_r0=sqrt(pow2(inpack.r0[ii][0]-inpack.r0[jj][0])+ pow2(inpack.r0[ii][1]-inpack.r0[jj][1])+ pow2(inpack.r0[ii][2]-inpack.r0[jj][2])); }; R01=pmy_sz->my_cmap_pack.r0[j]; P1=pmy_sz->my_cmap_pack.nn[j]; Q1=pmy_sz->my_cmap_pack.nd[j]; if(fabs(dist_r0/R01-1.0)<0.00001){ colvar.myder[i_c][ii][0]+=rij[0]*P1*(P1-Q1)/Q1; colvar.myder[i_c][ii][1]+=rij[1]*P1*(P1-Q1)/Q1; colvar.myder[i_c][ii][2]+=rij[2]*P1*(P1-Q1)/Q1; colvar.myder[i_c][jj][0]-=rij[0]*P1*(P1-Q1)/Q1; colvar.myder[i_c][jj][1]-=rij[1]*P1*(P1-Q1)/Q1; colvar.myder[i_c][jj][2]-=rij[2]*P1*(P1-Q1)/Q1; } else { power(dist_r0/R01,P1,Q1,&pow_P,&pow_Q); tmp2_r0=(Q1*pow_Q*(1.-pow_P)-P1*pow_P*(1.-pow_Q))*R01/dist_r0*pmy_sz->my_cmap_pack.weight[j]; tmp3_r0=R01*(1.-pow_Q)*(1.-pow_Q); tmp4_r0_0=rij[0]/dist_r0; tmp4_r0_1=rij[1]/dist_r0; tmp4_r0_2=rij[2]/dist_r0; tmp1=tmp2_r0*tmp4_r0_0/tmp3_r0; tmp2=tmp2_r0*tmp4_r0_1/tmp3_r0; tmp3=tmp2_r0*tmp4_r0_2/tmp3_r0; colvar.myder[i_c][ii][0]+=tmp1; colvar.myder[i_c][ii][1]+=tmp2; colvar.myder[i_c][ii][2]+=tmp3; colvar.myder[i_c][jj][0]-=tmp1; colvar.myder[i_c][jj][1]-=tmp2; colvar.myder[i_c][jj][2]-=tmp3; } } } // group contacts if(pmy_sz->my_cmap_pack.logical_group){ for(j=0;j<pmy_sz->my_cmap_pack.gnumber;j++){ i=j+pmy_sz->my_cmap_pack.number; ii=pmy_sz->my_cmap_pack.index1[i]; jj=pmy_sz->my_cmap_pack.index2[i]; if(colvar.cell_pbc[i_c]){ minimal_image(pmy_sz->my_cmap_pack.group.rcm[ii], pmy_sz->my_cmap_pack.group.rcm[jj], &dist_r0, rij); } else { rij[0] = pmy_sz->my_cmap_pack.group.rcm[ii][0]-pmy_sz->my_cmap_pack.group.rcm[jj][0]; rij[1] = pmy_sz->my_cmap_pack.group.rcm[ii][1]-pmy_sz->my_cmap_pack.group.rcm[jj][1]; rij[2] = pmy_sz->my_cmap_pack.group.rcm[ii][2]-pmy_sz->my_cmap_pack.group.rcm[jj][2]; dist_r0=sqrt(pow2(pmy_sz->my_cmap_pack.group.rcm[ii][0]-pmy_sz->my_cmap_pack.group.rcm[jj][0])+ pow2(pmy_sz->my_cmap_pack.group.rcm[ii][1]-pmy_sz->my_cmap_pack.group.rcm[jj][1])+ pow2(pmy_sz->my_cmap_pack.group.rcm[ii][2]-pmy_sz->my_cmap_pack.group.rcm[jj][2])); }; R01=pmy_sz->my_cmap_pack.r0[i]; P1=pmy_sz->my_cmap_pack.nn[i]; Q1=pmy_sz->my_cmap_pack.nd[i]; if(fabs(dist_r0/R01-1.0)<0.00001){ for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[ii];jjj++){ iii=pmy_sz->my_cmap_pack.group.index_to_list[ii][jjj]; colvar.myder[i_c][iii][0]+=rij[0]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); colvar.myder[i_c][iii][1]+=rij[1]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); colvar.myder[i_c][iii][2]+=rij[2]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); } for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[jj];jjj++){ iii=pmy_sz->my_cmap_pack.group.index_to_list[jj][jjj]; colvar.myder[i_c][iii][0]-=rij[0]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); colvar.myder[i_c][iii][1]-=rij[1]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); colvar.myder[i_c][iii][2]-=rij[2]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); } }else{ power(dist_r0/R01,P1,Q1,&pow_P,&pow_Q); tmp2_r0=(Q1*pow_Q*(1.-pow_P)-P1*pow_P*(1.-pow_Q))*R01/dist_r0*pmy_sz->my_cmap_pack.weight[i]; tmp3_r0=R01*(1.-pow_Q)*(1.-pow_Q); tmp4_r0_0=rij[0]/dist_r0; tmp4_r0_1=rij[1]/dist_r0; tmp4_r0_2=rij[2]/dist_r0; tmp1=tmp2_r0*tmp4_r0_0/tmp3_r0; tmp2=tmp2_r0*tmp4_r0_1/tmp3_r0; tmp3=tmp2_r0*tmp4_r0_2/tmp3_r0; for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[ii];jjj++){ iii=pmy_sz->my_cmap_pack.group.index_to_list[ii][jjj]; colvar.myder[i_c][iii][0]+=tmp1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); colvar.myder[i_c][iii][1]+=tmp2/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); colvar.myder[i_c][iii][2]+=tmp3/((real) pmy_sz->my_cmap_pack.group.numatom[ii]); } for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[jj];jjj++){ iii=pmy_sz->my_cmap_pack.group.index_to_list[jj][jjj]; colvar.myder[i_c][iii][0]-=tmp1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); colvar.myder[i_c][iii][1]-=tmp2/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); colvar.myder[i_c][iii][2]-=tmp3/((real) pmy_sz->my_cmap_pack.group.numatom[jj]); } } } } return; }
int pow2(int b , int n ) { if ( n == 0 ) return 1; return pow2(b,n-1) * b; }
Array1D<T> zero_pad(const Array1D<T>& v) { int n = pow2(needed_bits(v.size())); return n==v.size() ? v : zero_pad(v, n); }
unsigned __stdcall StructureTensor2DiffusionTensorThread(float **Args) { #else void StructureTensor2DiffusionTensorThread(float **Args) { #endif /* Matrices of Eigenvector calculation */ double Ma[3][3]; double Davec[3][3]; double Daeig[3]; /* Eigenvector and eigenvalues as scalars */ double mu1, mu2, mu3, v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z; /* Magnitude of gradient */ float *gradA; /* Amplitudes of diffustion tensor */ double lambda1, lambda2, lambda3; double lambdac1, lambdac2, lambdac3; double lambdae1, lambdae2, lambdae3; /* Eps for finite values */ const float eps=(float)1e-20; /* Loop variable */ int i; /* Number of pixels */ int npixels=1; /* The diffusion tensors and structure tensors */ float *Jxx, *Jxy, *Jxz, *Jyy, *Jyz, *Jzz; float *Dxx, *Dxy, *Dxz, *Dyy, *Dyz, *Dzz; int dimsu[3]; float *dimsu_f, *constants_f, *Nthreads_f, *ThreadID_f; /* Number of threads */ int ThreadOffset, Nthreads; /* Constants */ double C, m, alpha, lambda_h, lambda_e, lambda_c; /* Choice of eigenvalue equation */ int eigenmode; /* Temporary variables */ double di, epsilon, xi; Jxx=Args[0]; Jxy=Args[1]; Jxz=Args[2]; Jyy=Args[3]; Jyz=Args[4]; Jzz=Args[5]; Dxx=Args[6]; Dxy=Args[7]; Dxz=Args[8]; Dyy=Args[9]; Dyz=Args[10]; Dzz=Args[11]; gradA=Args[12]; dimsu_f=Args[13]; constants_f=Args[14]; ThreadID_f=Args[15]; Nthreads_f=Args[16]; for(i=0;i<3;i++){ dimsu[i]=(int)dimsu_f[i]; } eigenmode=(int)constants_f[0]; C=(double)constants_f[1]; m=(double)constants_f[2]; alpha=(double)constants_f[3]; lambda_e=(double)constants_f[4]; lambda_h=(double)constants_f[5]; lambda_c=(double)constants_f[6]; ThreadOffset=(int)ThreadID_f[0]; Nthreads=(int)Nthreads_f[0]; npixels=dimsu[0]*dimsu[1]*dimsu[2]; for(i=ThreadOffset; i<npixels; i=i+Nthreads) { /* Calculate eigenvectors and values of local Hessian */ Ma[0][0]=(double)Jxx[i]+eps; Ma[0][1]=(double)Jxy[i]; Ma[0][2]=(double)Jxz[i]; Ma[1][0]=(double)Jxy[i]; Ma[1][1]=(double)Jyy[i]+eps; Ma[1][2]=(double)Jyz[i]; Ma[2][0]=(double)Jxz[i]; Ma[2][1]=(double)Jyz[i]; Ma[2][2]=(double)Jzz[i]+eps; eigen_decomposition(Ma, Davec, Daeig); /* Convert eigenvector and eigenvalue matrices back to scalar variables */ mu1=Daeig[2]; mu2=Daeig[1]; mu3=Daeig[0]; v1x=Davec[0][0]; v1y=Davec[1][0]; v1z=Davec[2][0]; v2x=Davec[0][1]; v2y=Davec[1][1]; v2z=Davec[2][1]; v3x=Davec[0][2]; v3y=Davec[1][2]; v3z=Davec[2][2]; /* Scaling of diffusion tensor */ if(eigenmode==0) /* Weickert line shaped */ { di=(mu1-mu3); if((di<eps)&&(di>-eps)) { lambda1 = alpha; } else { lambda1 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); } lambda2 = alpha; lambda3 = alpha; } else if(eigenmode==1) /* Weickert plane shaped */ { di=(mu1-mu3); if((di<eps)&&(di>-eps)) { lambda1 = alpha; } else { lambda1 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); } di=(mu2-mu3); if((di<eps)&&(di>-eps)) { lambda2 = alpha; } else { lambda2 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); } lambda3 = alpha; } else if (eigenmode==2) /* EED */ { if(gradA[i]<eps){ lambda3 = 1; } else { lambda3 = 1 - exp(-3.31488/pow4(gradA[i]/pow2(lambda_e))); } lambda2 = 1; lambda1 = 1; } else if (eigenmode==3) /* CED */ { lambda3 = alpha; lambda2 = alpha; if((mu2<eps)&&(mu2>-eps)){ lambda1=1;} else if ((mu3<eps)&&(mu3>-eps)) { lambda1=1; } else { lambda1= alpha + (1.0- alpha)*exp(-0.6931*pow2(lambda_c)/pow4(mu2/(alpha+mu3))); } } else if (eigenmode==4) /* Hybrid Diffusion with Continous Switch */ { if(gradA[i]<eps) { lambdae3 = 1; } else { lambdae3 = 1 - exp(-3.31488/pow4(gradA[i]/pow2(lambda_e))); } lambdae2 = 1; lambdae1 = 1; lambdac3 = alpha; lambdac2 = alpha; if((mu2<eps)&&(mu2>-eps)){ lambdac1=1;} else if ((mu3<eps)&&(mu3>-eps)) { lambdac1=1;} else { lambdac1 = alpha + (1.0- alpha)*exp(-0.6931*pow2(lambda_c)/pow4(mu2/(alpha+mu3))); } xi= ( (mu1 / (alpha + mu2)) - (mu2 / (alpha + mu3) )); di=2.0*pow4(lambda_h); epsilon = exp(mu2*(pow2(lambda_h)*(xi-absd(xi))-2.0*mu3)/di); lambda1 = (1-epsilon) * lambdac1 + epsilon * lambdae1; lambda2 = (1-epsilon) * lambdac2 + epsilon * lambdae2; lambda3 = (1-epsilon) * lambdac3 + epsilon * lambdae3; } /* Construct the diffusion tensor */ Dxx[i] = (float)(lambda1*v1x*v1x + lambda2*v2x*v2x + lambda3*v3x*v3x); Dyy[i] = (float)(lambda1*v1y*v1y + lambda2*v2y*v2y + lambda3*v3y*v3y); Dzz[i] = (float)(lambda1*v1z*v1z + lambda2*v2z*v2z + lambda3*v3z*v3z); Dxy[i] = (float)(lambda1*v1x*v1y + lambda2*v2x*v2y + lambda3*v3x*v3y); Dxz[i] = (float)(lambda1*v1x*v1z + lambda2*v2x*v2z + lambda3*v3x*v3z); Dyz[i] = (float)(lambda1*v1y*v1z + lambda2*v2y*v2z + lambda3*v3y*v3z); } /* explicit end thread, helps to ensure proper recovery of resources allocated for the thread */ #ifdef _WIN32 _endthreadex( 0 ); return 0; #else pthread_exit(NULL); #endif }
/* Options on options */ double OptionsOnOptions( int typeflag, double S, double X1, double X2, double t1, double T2, double r, double b, double v) { double result, bv2, vst1, vsT2, I, Rho, _y1, y2, z1, z2; int fCall; assert_valid_price(S); assert_valid_strike(X1); assert_valid_strike(X2); assert_valid_time(t1); assert_valid_time(T2); assert_valid_interest_rate(r); assert_valid_cost_of_carry(b); assert_valid_volatility(v); bv2 = b + pow2(v) / 2.0; vst1 = v * sqrt(t1); vsT2 = v * sqrt(T2); assert(typeflag == OOO_CALL_ON_CALL || typeflag == OOO_CALL_ON_PUT || typeflag == OOO_PUT_ON_CALL || typeflag == OOO_PUT_ON_PUT); if(typeflag == OOO_CALL_ON_CALL || typeflag == OOO_PUT_ON_CALL) fCall = 1; else fCall = 0; I = CriticalValueOptionsOnOptions(fCall, X1, X2, T2 - t1, r, b, v); Rho = sqrt(t1 / T2); _y1 = (log(S / I) + bv2 * t1) / vst1; y2 = _y1 - vst1; z1 = (log(S / X1) + bv2 * T2) / vsT2; z2 = z1 - vsT2; if(typeflag == OOO_CALL_ON_CALL) { result = S * exp((b - r) * T2) * cbnd(z1, _y1, Rho) - X1 * exp(-r * T2) * cbnd(z2, y2, Rho) - X2 * exp(-r * t1) * cnd(y2); } else if(typeflag == OOO_PUT_ON_CALL) { result = X1 * exp(-r * T2) * cbnd(z2, -y2, -Rho) - S * exp((b - r) * T2) * cbnd(z1, -_y1, -Rho) + X2 * exp(-r * t1) * cnd(-y2); } else if(typeflag == OOO_CALL_ON_PUT) { result = X1 * exp(-r * T2) * cbnd(-z2, -y2, Rho) - S * exp((b - r) * T2) * cbnd(-z1, -_y1, Rho) - X2 * exp(-r * t1) * cnd(-y2); } else if(typeflag == OOO_PUT_ON_PUT) { result = S * exp((b - r) * T2) * cbnd(-z1, _y1, -Rho) - X1 * exp(-r * T2) * cbnd(-z2, y2, -Rho) + X2 * exp(-r * t1) * cnd(y2); } else { /* Abort to be on the safe side */ abort(); } assert(is_sane(result)); return result; }
double pow(double x, int n) { return pow2(); }
Gradient::Gradient(Grid * g){ //cout << "Trying to create gradient with h = " << g->getH() << endl; this->g = g; double h = g->getH(); constantTerm.resize(g->faces.size()); constantTerm = 0; for(int i = g->iMin; i <= g->iMax; i++){ for(int j = g->jMin; j <= g->jMax; j++){ if(g->cells(i,j)->isUncovered()){ //cout << " is uncovered." << endl; CellIndex cellIndex(i,j); TinyVector<Face*,5> faces = g->cells(i,j)->faces; if(g->isFaceUncovered(i,j,B)){ FaceIndex faceIndex = faces(B)->getIndex(); Coord centroid = faces(B)->getCentroid(); TinyVector<double,2> n = faces(B)->getNormal(); double x, y, r; x = centroid(0); y = centroid(1); r = sqrt(pow2(x) + pow2(y)); TinyVector<double,2> gradU; double pi = acos(-1); //gradU(0) = 3*pow(x,2)*pow(y-2,2)+sin(2*(x-pow(y,2))); //gradU(1) = 2*pow(x,3)*(y-2) - 2*y*sin(2*(x-pow(y,2))); gradU(0) = 0;//-2*pi*sin(2*pi*r)*x/r; gradU(1) = 0;//-2*pi*sin(2*pi*r)*y/r; constantTerm(faceIndex) += gradU(0)*n(0) + gradU(1)*n(1); //cout << "\tAdding boundary condition to constant term." << endl; } if(faces(N) != 0){ FaceIndex faceIndex = faces(N)->getIndex(); if(faces(N)->isRegular()){ coefficients[faceIndex][cellIndex] = -1/h; } else if(faces(N)->isIrregular()){ if(coefficients[faceIndex].count(cellIndex) == 0){ double alpha = g->cells(i,j)->getFace(N)->getArea(); if(g->isFaceUncovered(i+1,j,N)){ CellIndex ind1(i,j); CellIndex ind2(i,j+1); CellIndex ind3(i+1,j); CellIndex ind4(i+1,j+1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } else if(g->isFaceUncovered(i-1,j,N)){ CellIndex ind1(i,j); CellIndex ind2(i,j+1); CellIndex ind3(i-1,j); CellIndex ind4(i-1,j+1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } } } //cout << "\tDid north face" << endl; } if(faces(S) != 0){ FaceIndex faceIndex = faces(S)->getIndex(); if(faces(S)->isRegular()){ coefficients[faceIndex][cellIndex] = 1/h; } else if(faces(S)->isIrregular()){ if(coefficients[faceIndex].count(cellIndex) == 0){ double alpha = g->cells(i,j)->getFace(S)->getArea(); if(g->isFaceUncovered(i+1,j,S)){ CellIndex ind1(i,j-1); CellIndex ind2(i,j); CellIndex ind3(i+1,j-1); CellIndex ind4(i+1,j); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } else if(g->isFaceUncovered(i-1,j,S)){ CellIndex ind1(i,j-1); CellIndex ind2(i,j); CellIndex ind3(i-1,j-1); CellIndex ind4(i-1,j); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } } } //cout << "\tDid south face" << endl; } if(faces(E) != 0){ FaceIndex faceIndex = faces(E)->getIndex(); CellIndex cellIndex(i,j); if(faces(E)->isRegular()){ coefficients[faceIndex][cellIndex] = -1/h; } else if(faces(E)->isIrregular()){ if(coefficients[faceIndex].count(cellIndex) == 0){ double alpha = g->cells(i,j)->getFace(E)->getArea(); if(g->isFaceUncovered(i,j+1,E)){ CellIndex ind1(i,j); CellIndex ind2(i+1,j); CellIndex ind3(i,j+1); CellIndex ind4(i+1,j+1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } else if(g->isFaceUncovered(i,j-1,E)){ CellIndex ind1(i,j); CellIndex ind2(i+1,j); CellIndex ind3(i,j-1); CellIndex ind4(i+1,j-1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } } } //cout << "\tDid east face" << endl; } if(faces(W) != 0){ FaceIndex faceIndex = faces(W)->getIndex(); CellIndex cellIndex(i,j); if(faces(W)->isRegular()){ coefficients[faceIndex][cellIndex] = 1/h; } else if(faces(W)->isIrregular()){ if(coefficients[faceIndex].count(cellIndex) == 0){ double alpha = g->cells(i,j)->getFace(W)->getArea(); if(g->isFaceUncovered(i,j+1,W)){ CellIndex ind1(i+1,j); CellIndex ind2(i,j); CellIndex ind3(i+1,j+1); CellIndex ind4(i,j+1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } else if(g->isFaceUncovered(i,j-1,W)){ CellIndex ind1(i+1,j); CellIndex ind2(i,j); CellIndex ind3(i+1,j-1); CellIndex ind4(i,j-1); interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex); } } } //cout << "\tDid west face" << endl; } } } } //cout << "Resized" << endl; /* for(int i = g->iMin; i <= g->iMax; i++){ for(int j = g->jMin; j <= g->jMax; j++){ cout << "i = " << i << " j = " << j << endl; if(g->cells(i,j)->isUncovered()){ cout << "Uncovered" << endl; double c = 1; CellIndex index(i,j); TinyVector<Face*,5> faces = g->cells(i,j)->faces; cout << "Got faces" << endl; for(int k = 0; k < 5; k++){ cout << "Testing face " << k << endl; if(faces(k) != 0 && faces(k)->isUncovered()){ cout << "Face " << k << " is uncovered "; cout << "and has index " << faces(k)->getIndex() << endl; cout << coefficients(faces(k)->getIndex()).empty() << endl; coefficients(faces(k)->getIndex())[index] = c; } } } } }*/ }
/** * @brief Handles input to the map overlay. */ int ovr_input( SDL_Event *event ) { unsigned int pid; Pilot *p; int mx, my; double x, y, r, rp; double d, dp; Planet *pnt; JumpPoint *jp; int pntid, jpid; /* We only want mouse events. */ if (event->type != SDL_MOUSEBUTTONDOWN) return 0; /* Player must not be NULL. */ if (player_isFlag(PLAYER_DESTROYED) || (player.p == NULL)) return 0; /* Selection. */ if (event->button.button == SDL_BUTTON_LEFT) { /* Translate from window to screen. */ mx = event->button.x; my = event->button.y; gl_windowToScreenPos( &mx, &my, mx, my ); /* Translate to space coords. */ x = ((double)mx - SCREEN_W/2.) * ovr_res; y = ((double)my - SCREEN_H/2.) * ovr_res; /* Get nearest pilot and jump point/planet. */ dp = pilot_getNearestPos( player.p, &pid, x, y, 1 ); d = system_getClosest( cur_system, &pntid, &jpid, x, y ); p = pilot_get(pid); rp = MAX( 1.5 * PILOT_SIZE_APROX * p->ship->gfx_space->sw / 2, 20.*ovr_res ); if (pntid >=0) { /* Planet is closer. */ pnt = cur_system->planets[ pntid ]; r = MAX( 1.5 * pnt->radius, 20. * ovr_res ); } else if (jpid >= 0) { jp = &cur_system->jumps[ jpid ]; r = MAX( 1.5 * jp->radius, 20. * ovr_res ); } else r = 0.; /* Pilot is closest, or new jump point/planet is the same as the old. */ if ((dp < pow2(rp) && player.p->target != pid) && (dp < d || ((pntid >=0 && player.p->nav_planet == pntid) || (jpid >=0 && player.p->nav_planet == jpid)))) player_targetSet( pid ); else if ((pntid >= 0) && (d < pow2(r))) /* Planet is closest. */ player_targetPlanetSet( pntid ); else if ((jpid >= 0) && (d < pow2(r))) /* Jump point is closest. */ player_targetHyperspaceSet( jpid ); else return 0; return 1; } /* Autogo. */ else if (event->button.button == SDL_BUTTON_RIGHT) { if ((player.p == NULL) || pilot_isFlag( player.p, PILOT_MANUAL_CONTROL ) || pilot_isFlag( player.p, PILOT_HYP_PREP ) || pilot_isFlag( player.p, PILOT_HYP_BEGIN ) || pilot_isFlag( player.p, PILOT_HYPERSPACE )) return 1; /* Translate from window to screen. */ mx = event->button.x; my = event->button.y; gl_windowToScreenPos( &mx, &my, mx, my ); /* Translate to space coords. */ x = ((double)mx - SCREEN_W/2.) * ovr_res; y = ((double)my - SCREEN_H/2.) * ovr_res; /* Go to position. */ player_autonavPos( x, y ); return 1; } return 0; }
/** * @fn void player_board (void) * * @brief Attempt to board the player's target. * * Creates the window on success. */ void player_board (void) { Pilot *p; unsigned int wdw; if (player->target==PLAYER_ID) { player_message("You need a target to board first!"); return; } p = pilot_get(player->target); if (!pilot_isDisabled(p)) { player_message("You cannot board a ship that isn't disabled!"); return; } else if (vect_dist(&player->solid->pos,&p->solid->pos) > p->ship->gfx_space->sw * PILOT_SIZE_APROX) { player_message("You are too far away to board your target."); return; } else if ((pow2(VX(player->solid->vel)-VX(p->solid->vel)) + pow2(VY(player->solid->vel)-VY(p->solid->vel))) > (double)pow2(MAX_HYPERSPACE_VEL)) { player_message("You are going too fast to board the ship."); return; } else if (pilot_isFlag(p,PILOT_BOARDED)) { player_message("Your target cannot be boarded again."); return; }; /* pilot will be boarded */ pilot_setFlag(p,PILOT_BOARDED); player_message("Boarding ship %s.", p->name); /* * create the boarding window */ wdw = window_create( "Boarding", -1, -1, BOARDING_WIDTH, BOARDING_HEIGHT ); window_addText( wdw, 20, -30, 120, 60, 0, "txtCargo", &gl_smallFont, &cDConsole, "Credits:\n" "Cargo:\n" "Fuel:\n" ); window_addText( wdw, 80, -30, 120, 60, 0, "txtData", &gl_smallFont, &cBlack, NULL ); window_addButton( wdw, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCredits", "Credits", board_stealCreds); window_addButton( wdw, 20+BUTTON_WIDTH+20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCargo", "Cargo", board_stealCargo); window_addButton( wdw, 20+2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCargo", "Fuel", board_stealFuel); window_addButton( wdw, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBoardingClose", "Leave", board_exit ); board_update(wdw); /* * run hook if needed */ pilot_runHook(p, PILOT_HOOK_BOARD); }