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() */
/* 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); } } }