void calc_midpoints(Atom *atoms, int n_atoms, double *prd, Point *mid_points) { int i,j,k,i1,i2,i3,i4,im; int n_dna=2; int nbp=n_atoms/(2*n_dna); double *n1, *n2; double x[3], x0[3], dn, max; int nx=0,k_max; for (i=0;i<n_dna;i++) { for (j=0;j<nbp;j++) { i1 = 2*nbp*i+j; i2 = 2*nbp*i+nbp+j; im = i*nbp+j; nx = 0; max = 0.0; n1 = unit_vector(atoms[i1].x, atoms[i2].x, prd); // n1 = (x2 - x1)/|x2-x1| x[0] = x[1] = x[2] = 0.0; for (k=-3;k<=3;++k) { if (k==0 || j+k<0 || j+k>=nbp) continue; i3 = 2*nbp*i+j+k; i4 = 2*nbp*i+nbp+j+k; n2 = unit_vector(atoms[i3].x, atoms[i4].x, prd); // n2 = (x4 - x3)/|x4-x3| dn = 1-dot(n1,n2,1.0); if (dn>max) { max=dn; k_max=k; } if (dn>0.05) { find_intersect(i1, i2, i3, i4, atoms, prd, n1, n2, x, nx==0 ? NULL : x0); if (nx==0) { x0[0] = x[0]; x0[1] = x[1]; x0[2] = x[2]; } nx++; } } if (nx==0) { i3 = 2*nbp*i+j+k_max; i4 = 2*nbp*i+nbp+j+k_max; n2 = unit_vector(atoms[i3].x, atoms[i4].x, prd); // n2 = (x4 - x3)/|x4-x3| find_intersect(i1, i2, i3, i4, atoms, prd, n1, n2, x, nx==0 ? NULL : x0); nx++; } mid_points[im].x = x[0]/nx; mid_points[im].y = x[1]/nx; mid_points[im].z = x[2]/nx; } } }
void display(void) { int i; glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPointSize(1.0); glBegin(GL_POINTS); init_buffer(); //initialize buffer rotate_all(); //rotate object project_data(); //project object drawPoly_zbuffer(); //draws cube performUpdate(); //moves balls and handles collisions //draws the balls for(i=0;i<no_balls;i++) { find_intersect(Balls[i].pos[0],Balls[i].pos[1],Balls[i].pos[2],Balls[i].r); fill_color(Balls[i].pos[0],Balls[i].pos[1],Balls[i].pos[2],i%6); } //draws the z-buffer disp_zbuf(); glEnd(); glutSwapBuffers(); }