Example #1
0
void dessine_route(route r, int steps) {
  int i, start = 1;
  double tex_x = 0.0;
  point3d_cell previous_centre;
  vecteur3d_cell ecart_centre;
  glEnable (GL_TEXTURE_2D);
  glBindTexture (GL_TEXTURE_2D, texture_route);
  glColor3f(   1.0f,  1.0f,  1.0f ); 
  glBegin(GL_QUAD_STRIP);
  for(i=0;i<=steps;i++) {
    double t = (float) i / (float) steps;
    point3d_cell centre,x1,x2;
    vecteur3d_cell devant, cote, vertical;
    repere_route(r, t, &centre, &devant, &cote, &vertical);
    if (start) {previous_centre = centre; start = 0;};
    vec3d(&ecart_centre, &previous_centre, &centre);
    tex_x = tex_x + norm3d(&ecart_centre)/(texture_ratio*2*r->largeur);
    glNormal3dv((double*) &vertical);
    x1 =centre; x2 = centre;
    translate3d(&x1, r->largeur, &cote);
    translate3d(&x2, -r->largeur, &cote);
    glTexCoord2f(0.0, tex_x);
    glVertex3dv((double*) &x1);
    glTexCoord2f(1.0, tex_x);
    glVertex3dv((double*) &x2);
    previous_centre = centre;
  }
  glEnd();
  glDisable (GL_TEXTURE_2D);
}
__global__ void test_norm3d(hipLaunchParm lp, double *a, double* b, double *c, double *d){
    int tid = hipThreadIdx_x;
    d[tid] = norm3d(a[tid], b[tid], c[tid]);
}
Example #3
0
__global__ void test_norm3d(double* a, double* b, double* c, double* d) {
    int tid = threadIdx.x;
    d[tid] = norm3d(a[tid], b[tid], c[tid]);
}
__device__ void double_precision_math_functions() {
    int iX;
    double fX, fY;

    acos(1.0);
    acosh(1.0);
    asin(0.0);
    asinh(0.0);
    atan(0.0);
    atan2(0.0, 1.0);
    atanh(0.0);
    cbrt(0.0);
    ceil(0.0);
    copysign(1.0, -2.0);
    cos(0.0);
    cosh(0.0);
    cospi(0.0);
    cyl_bessel_i0(0.0);
    cyl_bessel_i1(0.0);
    erf(0.0);
    erfc(0.0);
    erfcinv(2.0);
    erfcx(0.0);
    erfinv(1.0);
    exp(0.0);
    exp10(0.0);
    exp2(0.0);
    expm1(0.0);
    fabs(1.0);
    fdim(1.0, 0.0);
    floor(0.0);
    fma(1.0, 2.0, 3.0);
    fmax(0.0, 0.0);
    fmin(0.0, 0.0);
    fmod(0.0, 1.0);
    frexp(0.0, &iX);
    hypot(1.0, 0.0);
    ilogb(1.0);
    isfinite(0.0);
    isinf(0.0);
    isnan(0.0);
    j0(0.0);
    j1(0.0);
    jn(-1.0, 1.0);
    ldexp(0.0, 0);
    lgamma(1.0);
    llrint(0.0);
    llround(0.0);
    log(1.0);
    log10(1.0);
    log1p(-1.0);
    log2(1.0);
    logb(1.0);
    lrint(0.0);
    lround(0.0);
    modf(0.0, &fX);
    nan("1");
    nearbyint(0.0);
    nextafter(0.0, 0.0);
    fX = 1.0;
    norm(1, &fX);
    norm3d(1.0, 0.0, 0.0);
    norm4d(1.0, 0.0, 0.0, 0.0);
    normcdf(0.0);
    normcdfinv(1.0);
    pow(1.0, 0.0);
    rcbrt(1.0);
    remainder(2.0, 1.0);
    remquo(1.0, 2.0, &iX);
    rhypot(0.0, 1.0);
    rint(1.0);
    fX = 1.0;
    rnorm(1, &fX);
    rnorm3d(0.0, 0.0, 1.0);
    rnorm4d(0.0, 0.0, 0.0, 1.0);
    round(0.0);
    rsqrt(1.0);
    scalbln(0.0, 1);
    scalbn(0.0, 1);
    signbit(1.0);
    sin(0.0);
    sincos(0.0, &fX, &fY);
    sincospi(0.0, &fX, &fY);
    sinh(0.0);
    sinpi(0.0);
    sqrt(0.0);
    tan(0.0);
    tanh(0.0);
    tgamma(2.0);
    trunc(0.0);
    y0(1.0);
    y1(1.0);
    yn(1, 1.0);
}
Example #5
0
void normalize3d(vecteur3d A) {
  double n = norm3d(A);
  scal_prod3d(A,1.0/n);
}
Example #6
0
void update_position(route r, position p, double cur_time) {
  point3d_cell centre;
  vecteur3d_cell devant, cote, dessus;

  // calcul du repère à l'index t = p->index
  repere_route(r, p->index, &centre, &devant, &cote, &dessus);

  point3d_cell centre_d;
  vecteur3d_cell devant_d, cote_d, dessus_d;
  
  // et ç l'index t + dt. 
  repere_route(r, p->index+1e-6, &centre_d, &devant_d, &cote_d, &dessus_d);

  if (debug) fprintf(stderr, "centre = (%lf, %lf, %lf)\n", centre.x, centre.y , centre.z);
  if (debug) fprintf(stderr, "devant = (%lf, %lf, %lf)\n", devant.x, devant.y , devant.z);
  if (debug) fprintf(stderr, "cote = (%lf, %lf, %lf)\n", cote.x, cote.y , cote.z);
  if (debug) fprintf(stderr, "dessus = (%lf, %lf, %lf)\n", dessus.x, dessus.y , dessus.z);

  // cacule du gradient de P(t) = P'(t) 
  vecteur3d_cell d_centre;
  vec3d(&d_centre,&centre,&centre_d);
  scal_prod3d(&d_centre, 1e6);

  // intervalle de temps écoulé et mise à jour de p->lastime.
  double delta_t = cur_time - p->last_update;
  p->last_update = cur_time;

  if (debug) fprintf(stderr,"delta = %lf\n", delta_t);

  /* Rotation : on a directement la vitesse de rotation dans la variable globale rotation */
  double alpha = rotation * delta_t;
  
  // on fait cette rotation en modifiant les vecteur p->rel_devant et p->rel_dessus 
  // on aurait pu faire avec p->devant et p->dessus
  vecteur3d_cell rel_cote;
  vec_prod3d(&rel_cote, &(p->rel_dessus), &(p->rel_devant));
  scal_prod3d(&p->rel_devant, cos(alpha));
  translate3d((point3d) &(p->rel_devant), sin(alpha), &rel_cote);
  normalize3d(&(p->rel_devant));

  if (debug) fprintf(stderr, "p->rel_devant = (%lf, %lf, %lf)\n", p->rel_devant.x, p->rel_devant.y , p->rel_devant.z);

  // on calcule les coordonnées absolue de p->devant et p->dessus à partir 
  // des coordonnées relatives à la route. Elle ne sont pas mie à jour plus tôt.
  zero3d(&(p->devant));
  translate3d((point3d) &(p->devant), p->rel_devant.x, &devant);
  translate3d((point3d) &(p->devant), p->rel_devant.y, &cote);
  translate3d((point3d) &(p->devant), p->rel_devant.z, &dessus);
  normalize3d(&(p->devant));

  if (debug) fprintf(stderr, "p->devant = (%lf, %lf, %lf)\n", p->devant.x, p->devant.y , p->devant.z);

  zero3d(&(p->dessus));
  translate3d((point3d) &(p->dessus), p->rel_dessus.x, &devant);
  translate3d((point3d) &(p->dessus), p->rel_dessus.y, &cote);
  translate3d((point3d) &(p->dessus), p->rel_dessus.z, &dessus);
  normalize3d(&(p->dessus));

  if (debug) fprintf(stderr, "p->dessus = (%lf, %lf, %lf)\n", p->dessus.x, p->dessus.y , p->dessus.z);

  /* Mise à jour vitesse, après calcul de l'accélération */
  // initialization avec le force de gravité.
  vecteur3d_cell accel = { .x = 0.0, .y = 0.0, .z = -9.81 };
  if (debug) fprintf(stderr,"acceleration = %lf\n", acceleration);
  if (acceleration > 0.0) if (debug) fprintf(stderr, "  non zero\n");
  // acceleration du à l'accelerateur (dans la variable globale accelerateur 
  translate3d((point3d) &accel, p->coef_accel*acceleration, &(p->devant));
  if (p->z <= 0.0) {
    //si on touche la route
    //calcul des forttements
    double coef2 = fabs(p->y)>r->largeur?r->largeur-fabs(p->y)-p->frot_quad:-p->frot_quad;
    translate3d((point3d) &accel, coef2*norm3d(&(p->vitesse))-p->frot_lin, &(p->vitesse));
    //projecttion de la vitesse et de l'acceleration pour qu'elles soient parallèle à la route.
    double t = dot_prod3d(&accel, &dessus);
    translate3d((point3d) &accel, -t, &dessus);
    t = dot_prod3d(&(p->vitesse), &dessus);
    translate3d((point3d) &accel, -t, &dessus);
  }
  // on peut enfin mettre à jour la vitesse
  if (debug) fprintf(stderr, "accel = (%lf, %lf, %lf)\n", accel.x, accel.y , accel.z);
  translate3d((point3d) &(p->vitesse), delta_t, &accel);
  p->z = 0.0;

  if (debug) fprintf(stderr, "p->vitesse = (%lf, %lf, %lf)\n", p->vitesse.x, p->vitesse.y , p->vitesse.z);

  // on met maintenant à jour les coordonnées relative. Attention pour l'index,
  // cela dépend de la norme de P'(t) = d_centre.
  double d_index = dot_prod3d(&d_centre, &(p->vitesse)) / norm2_3d(&d_centre);
  double d_y = dot_prod3d(&cote, &(p->vitesse));
  double d_z = dot_prod3d(&dessus, &(p->vitesse));
  p->index += d_index * delta_t;
  // l'index doit rester entre 0 et 1 !
  while (p->index >= 1.0) p->index -= 1.0;
  while (p->index < 0.0) p->index += 1.0;
  p->y += d_y * delta_t;
  p->z += d_z * delta_t;

  if (debug) fprintf(stderr, "d_index = %lf, d_y = %lf, d_z = %lf\n", d_index, d_y, d_z);

  /* calcul des nouvelles coordonnées absolues */

  p->centre = centre;
  translate3d(&(p->centre), p->y, &cote);
  translate3d(&(p->centre), p->z, &dessus);

  if (debug) fprintf(stderr, "p->centre = (%lf, %lf, %lf)\n", p->centre.x, p->centre.y , p->centre.z);
  
  /* calcule des coordonnées relative dans le nouveau reprère, on vient de bouger */
  repere_route(r, p->index, &centre, &devant, &cote, &dessus);
  
  // on calcule d'abord le déplacement. 
  vecteur3d_cell delta_centre;
  vec3d(&delta_centre, &centre, &(p->centre));

  // x ci dessous doit rester petit, mais on fait une simple approximation linéaire et il ne reste pas
  // si petit que ça.
  double x = dot_prod3d(&delta_centre, &devant); 
  p->y = dot_prod3d(&delta_centre, &cote);
  p->z = dot_prod3d(&delta_centre, &dessus);

  if (debug) fprintf(stderr, "x = %lf, p->y = %lf; p->z = %lf\n", x, p->y, p->z);

  // mise à jour du vecteur p->rel_devant en fonction du nouveau repère.
  p->rel_devant.x = dot_prod3d(&devant, &(p->devant));
  p->rel_devant.y = dot_prod3d(&cote, &(p->devant));
  p->rel_devant.z = dot_prod3d(&dessus, &(p->devant));
  normalize3d(&(p->rel_devant));

  /* on garde la caméra parallèle à la route,
     sinon ça saute. Dommage, ce n'est pas très realiste
     en cas de saut !, mais il faudrait sinon mettre des suspensions et 
     tenir compte des points de contact, et du moment d'intertie de la voiture */
  p->rel_dessus.x = 0.0;
  p->rel_dessus.y = 0.0;
  p->rel_dessus.z = 1.0;
  p->rel_devant.z *= 0.0;
  normalize3d(&(p->rel_devant));

  if (debug) fprintf(stderr, "p->rel_devant = (%lf, %lf, %lf)\n", p->rel_devant.x, p->rel_devant.y , p->rel_devant.z);
  if (debug) fprintf(stderr, "p->rel_dessus = (%lf, %lf, %lf)\n\n\n", p->rel_dessus.x, p->rel_dessus.y , p->rel_dessus.z);
}

void initialize_position(route r, position p, double curtime) {
  p->index = 0.0;
  p->y = 0.0;
  p->z = 0.0;
  p->last_update = curtime;
  zero3d(&(p->rel_devant));
  p->rel_devant.x = 1.0;
  zero3d(&(p->rel_dessus));
  p->rel_dessus.z = 1.0;

  p->coef_accel = 30.0;
  p->frot_quad = 0.03;
  p->frot_lin = 0.5;

  /* calcule des autres champs, on utilise le fait que acceleration = rotation = 0.0 
     au départ */
  update_position(r, p, curtime);
}