#include "disk.h" Disk::Disk() { int i, j; float angle; diskQuad=gluNewQuadric(); gluQuadricDrawStyle(diskQuad, GLU_FILL); gluQuadricNormals(diskQuad, GLU_SMOOTH); thickness=.1; radius=.3; circle_points=20; orient0_angle=orient1_angle=0; orig_center[0]=center[0]=0; orig_center[1]=center[1]=0; orig_center[2]=center[2]=0; for(i=0;i<8;i++) nextStick[i]=NULL; orient=0; //place holes on disk holes[0][0]=0;holes[0][1]=0;holes[0][2]=-.01; holes[1][0]=0;holes[1][1]=0;holes[1][2]=thickness+.01; for(i=2;i<8;i++) { angle=(i-2)*3.1415926535897/3; holes[i][0]=radius*cos(angle); holes[i][1]=radius*sin(angle); holes[i][2]=.5*thickness; } for(i=0;i<8;i++) for(j=0;j<3;j++) { orig_holes[i][j]=holes[i][j]; } initDisplayList(); } Disk::~Disk() { } void Disk::initDisplayList() { int i; diskList=glGenLists(1); glNewList(diskList, GL_COMPILE); //draw the disk glColor3f(1.0, 1.0, 0.0); glPushMatrix(); gluCylinder(diskQuad, radius, radius, thickness, circle_points, circle_points); //rad, rad, height, slice, stack glPopMatrix(); //draw each end glPushMatrix(); glTranslated(0.0, 0.0, thickness); gluDisk(diskQuad, 0, radius, circle_points, circle_points); glPopMatrix(); glPushMatrix(); glRotated(180, 0.0, 1.0, 0.0); gluDisk(diskQuad, 0, radius, circle_points, circle_points); glPopMatrix(); //draw the holes glColor3f(1.0, 0.8, 1.0); for(i=0;i<2;i++) { //glColor3f(1.0, 0, .1*i); glPushMatrix(); glTranslatef(holes[i][0], holes[i][1], holes[i][2]); gluDisk(diskQuad, 0, .05, circle_points, circle_points); glPopMatrix(); } glPushMatrix(); glRotated(90.0, 0.0, 1.0, 0.0); glTranslatef(-.5*thickness, 0.0, 0.0); for(i=2;i<8;i++) { //glColor3f(1.0, 0, .1*i); glRotated(60, 1.0, 0.0, 0.0); glTranslatef(0.0, 0.0, -radius); gluDisk(diskQuad, 0, .05, circle_points, circle_points); glTranslatef(0.0, 0.0, radius); } glPopMatrix(); glEndList(); } void Disk::draw(int calc) { int i; glPushMatrix(); glRotatef(orient0_angle, 0, 0, 1); if(orient==0) { if(calc==0) glCallList(diskList); if(calc==1) updatePoints(); glTranslatef(0, 0, .5*thickness); if(nextStick[1]!=NULL) nextStick[1]->draw(calc); glRotatef(90, 0, 1, 0); for(i=2;i<8;i++) { if(i>2) glRotatef(-60, 1, 0, 0); if(nextStick[i]!=NULL) nextStick[i]->draw(calc); } } else { glRotatef(90, 0, 1, 0); glRotatef(orient1_angle, 1, 0, 0); if(calc==1) updatePoints(); if(calc==0) { glPushMatrix(); glTranslated(0.0, 0.0, -.5*thickness); glCallList(diskList); glPopMatrix(); } for(i=0;i<8;i++) { if(i==0) { glPushMatrix(); glRotatef(180, 0, 1, 0); nextStick[i]->draw(calc); glPopMatrix(); } if(i==2) glRotatef(90, 0, 1, 0); if(i>2) glRotatef(-60, 1, 0, 0); if(i!=2 && i!=0 && nextStick[i]!=NULL) nextStick[i]->draw(calc); } } glPopMatrix(); } int Disk::full() { int i; if(orient==1) { if(nextStick[0]==NULL || nextStick[1]==NULL) return 0; for(i=3;i<8;i++) if(nextStick[i]==NULL) return 0; return 1; } else { for(i=1;i<8;i++) if(nextStick[i]==NULL) return 0; return 1; } } int Disk::setNextStick(Stick *nextOne, float p[3]) { int i, hole; float best=100; float curDist; if(orient==1) { for(i=0;i<8;i++) { if(i!=2 && nextStick[i]==NULL) { curDist=distance(p, holes[i]); if(curDistclosestStick(p, &dist); if(distclosestStick(p, &dist); if(distclosestDisk(p, &dist); if(distclosestDisk(p, &dist); if(dist