Ejemplo n.º 1
0
bool xtal_origin_zero (int iw)
{
    if (!n[iw].xtal_mode)
    {
        printf ("Crystal translation is only available under Xtal mode.\n");
        return(FALSE);
    }
    if (V3LENGTH(n[iw].xtal_origin) < TINY) return(FALSE);
    V3ZERO(n[iw].xtal_origin);
    atom_xtal_origin (n[iw].xtal_origin);
    if (n[iw].bond_mode) bond_xtal_origin_update (iw);
    else n[iw].bond_xtal_origin_need_update = TRUE;
    return (TRUE);
} /* end xtal_origin_zero() */
Ejemplo n.º 2
0
/* Allocate arrows */
void Config_to_3D_Arrows(int arrow_idx, double scale_factor, double head_height, double head_width, double up[3], int overlay, double color[3])
{
  register int i, j, offset;
  double dx[3], head[3], head1[3], perp[3], perp2[3], sum;
  AX_3D_Lines tmp_arrows[1] = {{0}};
  tmp_arrows[0].LINE = NULL;

  if (overlay) {
    offset = arrows->n_lines;
    if (offset != 0) {
      AX_3D_Lines_Realloc(tmp_arrows, arrows->n_lines);
      for (i=0; i<arrows->n_lines; i++) {
	V3EQV(arrows->LINE[i].x0, tmp_arrows->LINE[i].x0);
	V3EQV(arrows->LINE[i].x1, tmp_arrows->LINE[i].x1);
	AX_3D_AssignRGB (tmp_arrows->LINE[i], arrows->LINE[i].r,  arrows->LINE[i].g,  arrows->LINE[i].b);
      }
    }
    AX_3D_Lines_Realloc(arrows, arrows->n_lines + 3*np);
    if (offset != 0) {
      for (i=0; i<tmp_arrows->n_lines; i++) {
	V3EQV(tmp_arrows->LINE[i].x0, arrows->LINE[i].x0);
	V3EQV(tmp_arrows->LINE[i].x1, arrows->LINE[i].x1);
	AX_3D_AssignRGB (arrows->LINE[i], tmp_arrows->LINE[i].r,  tmp_arrows->LINE[i].g,  tmp_arrows->LINE[i].b);
      }
      AX_3D_Lines_Free(tmp_arrows);
    }
  } else {
    AX_3D_Lines_Realloc(arrows, 3*np);
    offset = 0;
  }
  
  /* auto scale */
  if (scale_factor == 0.0) {
    sum = 0.0;
    for (i=0; i<np; i++) {
      dx[0] = *(CONFIG_auxiliary[arrow_idx+0]+i);
      dx[1] = *(CONFIG_auxiliary[arrow_idx+1]+i);
      dx[2] = *(CONFIG_auxiliary[arrow_idx+2]+i);

      sum += V3LENGTH(dx);
    }
    scale_factor = 1.0/(sum/np);
    printf("Config_to_3D_Arrows: average magnitude = %f, scale_factor set to %f\n", 1.0/scale_factor, scale_factor);
  }

  printf("Config_to_3D_Arrows: color = <%.3f,%.3f,%.3f>\n", color[0], color[1], color[2]);

  for (i=0; i<np; i++)
  {
    AX_3D_AssignRGB (arrows->LINE[offset+3*i],   color[0], color[1], color[2]);
    AX_3D_AssignRGB (arrows->LINE[offset+3*i+1], color[0], color[1], color[2]);
    AX_3D_AssignRGB (arrows->LINE[offset+3*i+2], color[0], color[1], color[2]);

    dx[0] = *(CONFIG_auxiliary[arrow_idx+0]+i)*scale_factor;
    dx[1] = *(CONFIG_auxiliary[arrow_idx+1]+i)*scale_factor;
    dx[2] = *(CONFIG_auxiliary[arrow_idx+2]+i)*scale_factor;

    if (V3EQZERO(dx)) {
      for (j=0; j<3; j++) {
	V3EQV(B->BALL[i].x, arrows->LINE[offset+3*i+j].x0);
	V3EQV(B->BALL[i].x, arrows->LINE[offset+3*i+j].x1);
      }
      
    } else {
      V3ADD(B->BALL[i].x, dx, head);
      V3EQV(B->BALL[i].x, arrows->LINE[offset+3*i+0].x0);
      V3EQV(head, arrows->LINE[offset+3*i+0].x1);
      V3EQV(head, arrows->LINE[offset+3*i+1].x0);
      V3EQV(head, arrows->LINE[offset+3*i+2].x0);

      V3CROSS(dx, up, perp2);

      if (V3EQZERO(perp2)) {
	V3ASSIGN(1.0, 0.0, 0.0,perp);
      } else {
	V3CROSS(dx, perp2, perp);
	V3normalize(perp);
      }
      V3mul(head_width*V3LENGTH(dx),perp,perp);
      
      V3EQV(dx, head1);
      V3mul(head_height,head1,head1);
      V3SUB(head,head1,head1);
    
      V3ADD(head1,perp,arrows->LINE[offset+3*i+1].x1);
      V3SUB(head1,perp,arrows->LINE[offset+3*i+2].x1);
    }
  }
}