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;
		}
	}
}
Beispiel #2
0
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();
}