Hello! So, I’ve started to get into some mathematical drawing and stuff and I found openGL, magnificent tool! But I still did not get the hang of shaders and stuff… I can make them work fine with “solid” continuous surfaces, but for my porpuses, I don’t think it’ll work.
The way I do it is:
I generate a file with a bunch of points that belong to whatever I am trying to draw, usually hypercomplex fractals, by testing one point at a time on the xyz matrix (witha delta of 0.01, or 0.001 or whatever) and save them to a file (after distinguishing which ones are on the surface)
Then i read the file and create an icosahedron fo circumradius delta on that xyz position with a random orientation (If i do not give the random orientation it gets very ugly with the lighing, with the random orientation it gives out a more rough surface)
but that does not give out the greatest results, the image often looks sketchy and is hard to recognize when a part of it is closer or further away.
(I would post an example image here, but the page keeps saying it is not a valid image file…)
Here is the code to create the icosahedrons, specifing the normal vector correctly and everything
static void makeIcosahedron(double radius, double x, double y, double z, double angX, double angY, double angZ){
double side = radius/sin(2*PI/5);
Vector V1 = Vector(0,1*side/2,PHI*side/2);
Vector V2 = Vector(0,-1*side/2,PHI*side/2);
Vector V3 = Vector(PHI*side/2,0,1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
Vector V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0+1*side/2,0+PHI*side/2);
V2 = Vector(0,0-1*side/2,0+PHI*side/2);
V3 = Vector(0-PHI*side/2,0 ,0+1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0+1*side/2,0-PHI*side/2);
V2 = Vector(0,0-1*side/2,0-PHI*side/2);
V3 = Vector(0+PHI*side/2,0 ,0-1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0+1*side/2,0-PHI*side/2);
V2 = Vector(0,0-1*side/2,0-PHI*side/2);
V3 = Vector(0-PHI*side/2,0 ,0-1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + PHI*side/2,0,0+1*side/2);
V2 = Vector(0 + PHI*side/2,0,0-1*side/2);
V3 = Vector(0 + 1*side/2,0 + PHI*side/2 ,0);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + PHI*side/2,0,0+1*side/2);
V2 = Vector(0 + PHI*side/2,0,0-1*side/2);
V3 = Vector(0 + 1*side/2,0 - PHI*side/2 ,0);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 - PHI*side/2,0,0+1*side/2);
V2 = Vector(0 - PHI*side/2,0,0-1*side/2);
V3 = Vector(0 - 1*side/2,0 - PHI*side/2 ,0);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 - PHI*side/2,0,0+1*side/2);
V2 = Vector(0 - PHI*side/2,0,0-1*side/2);
V3 = Vector(0 - 1*side/2,0 + PHI*side/2 ,0);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + 1*side/2,0 - PHI*side/2,0);
V2 = Vector(0 - 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0,0 - 1*side/2 ,0 + PHI*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + 1*side/2,0 - PHI*side/2,0);
V2 = Vector(0 - 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0,0 - 1*side/2 ,0 - PHI*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + 1*side/2,0 + PHI*side/2,0);
V2 = Vector(0 - 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0,0 + 1*side/2 ,0 + PHI*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0 + 1*side/2,0 + PHI*side/2,0);
V2 = Vector(0 - 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0,0 + 1*side/2 ,0 - PHI*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 + 1*side/2,0 + PHI*side/2);
V2 = Vector(0 + 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0 + PHI*side/2,0,0 + 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 + 1*side/2,0 + PHI*side/2);
V2 = Vector(0 - 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0 - PHI*side/2,0,0 + 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 - 1*side/2,0 + PHI*side/2);
V2 = Vector(0 - 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0 - PHI*side/2,0,0 + 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 - 1*side/2,0 + PHI*side/2);
V2 = Vector(0 + 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0 + PHI*side/2,0,0 + 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 + 1*side/2,0 - PHI*side/2);
V2 = Vector(0 + 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0 + PHI*side/2,0,0 - 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 + 1*side/2,0 - PHI*side/2);
V2 = Vector(0 - 1*side/2,0 + PHI*side/2,0);
V3 = Vector(0 - PHI*side/2,0,0 - 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 - 1*side/2,0 - PHI*side/2);
V2 = Vector(0 - 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0 - PHI*side/2,0,0 - 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
V1 = Vector(0,0 - 1*side/2,0 - PHI*side/2);
V2 = Vector(0 + 1*side/2,0 - PHI*side/2,0);
V3 = Vector(0 + PHI*side/2,0,0 - 1*side/2);
V1 = Vector(V1.getXCoord(),cos(angX)*V1.getYCoord() - sin(angX)*V1.getZCoord(), sin(angX)*V1.getYCoord() + cos(angX)*V1.getZCoord());
V2 = Vector(V2.getXCoord(),cos(angX)*V2.getYCoord() - sin(angX)*V2.getZCoord(), sin(angX)*V2.getYCoord() + cos(angX)*V2.getZCoord());
V3 = Vector(V3.getXCoord(),cos(angX)*V3.getYCoord() - sin(angX)*V3.getZCoord(), sin(angX)*V3.getYCoord() + cos(angX)*V3.getZCoord());
V1 = Vector(cos(angY)*V1.getXCoord() + sin(angY)*V1.getZCoord(),V1.getYCoord(), -1*sin(angY)*V1.getXCoord() + cos(angY)*V1.getZCoord());
V2 = Vector(cos(angY)*V2.getXCoord() + sin(angY)*V2.getZCoord(),V2.getYCoord(), -1*sin(angY)*V2.getXCoord() + cos(angY)*V2.getZCoord());
V3 = Vector(cos(angY)*V3.getXCoord() + sin(angY)*V3.getZCoord(),V3.getYCoord(), -1*sin(angY)*V3.getXCoord() + cos(angY)*V3.getZCoord());
V1 = Vector(cos(angZ)*V1.getXCoord() - sin(angZ)*V1.getYCoord(),sin(angZ)*V1.getXCoord() + cos(angZ)*V1.getYCoord(), V1.getZCoord());
V2 = Vector(cos(angZ)*V2.getXCoord() - sin(angZ)*V2.getYCoord(),sin(angZ)*V2.getXCoord() + cos(angZ)*V2.getYCoord(), V2.getZCoord());
V3 = Vector(cos(angZ)*V3.getXCoord() - sin(angZ)*V3.getYCoord(),sin(angZ)*V3.getXCoord() + cos(angZ)*V3.getYCoord(), V3.getZCoord());
V4 = Vector::normalToPlane((Vector(x,y,z)+V2)-(Vector(x,y,z)+V1),(Vector(x,y,z)+V3)-(Vector(x,y,z)+V1));
glNormal3d(V4.getCoord(),V4.getYCoord(),V4.getZCoord()); //for the light
glBegin(GL_TRIANGLES);
glVertex3d(x+V1.getXCoord(),y+V1.getYCoord(),z+V1.getZCoord());
glVertex3d(x+V2.getXCoord(),y+V2.getYCoord(),z+V2.getZCoord());
glVertex3d(x+V3.getXCoord(),y+V3.getYCoord(),z+V3.getZCoord());
glEnd();
And here is the overall code, if you are interested
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <fstream>
#include <time.h>
#include "../../../../../Objects_and_Libraries/MyQuartenions/MyQuarterions.h"
#include "../../../../../Objects_and_Libraries/MyComplex/MyComplex.h"
#include "../../../../../Objects_and_Libraries/MyShapes/MyShapes.h"
#include "../../../../../Objects_and_Libraries/MyMaths/MyMaths.h"
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#define useScreenShot 0
#define useFile 1
#define minX -2.0
#define maxX 2.0
#define minY -2.0
#define maxY 2.0
#define minZ -2.0
#define maxZ 2.0
#define deltaX 0.01
#define deltaY 0.01
#define deltaZ 0.01
#define nOfScreenshots 6
using namespace std;
class Point_XYZ_RGBA
{
private:
double x;
double y;
double z;
bool blows;
public:
Point_XYZ_RGBA()
{
}
Point_XYZ_RGBA(double ix, double iy, double iz, double ir, double ig, double ib, double ia,bool iblows)
{
x = ix;
y = iy;
z = iz;
blows = iblows;
}
Point_XYZ_RGBA(double ix, double iy, double iz,bool iblows)
{
x = ix;
y = iy;
z = iz;
blows = iblows;
}
Point_XYZ_RGBA(double ix, double iy, double iz)
{
x = ix;
y = iy;
z = iz;
blows = true;
}
double getX()
{
return x;
}
double getY()
{
return y;
}
double getZ()
{
return z;
}
bool getBlows()
{
return blows;
}
void setX(double ix)
{
x = ix;
}
void setY(double iy)
{
y = iy;
}
void setZ(double iz)
{
z = iz;
}
void setBlows(bool iblows)
{
blows = iblows;
}
double lenght()
{
return sqrt(x*x + y*y + z*z);
}
};
float angleX = -45.0f;
float angleY = 0.0f;
float angleZ = 15.0f;
float distanceToOrigin = 5.5f;
float angleDelta = 1.0f;
float distanceDelta = 0.1f;
const unsigned long int totalPointsX = (int)(1-useFile)*((maxX-minX)/deltaX);
const unsigned long int totalPointsY = (int)(1-useFile)*((maxY-minY)/deltaY);
const unsigned long int totalPointsZ = (int)(1-useFile)*((maxZ-minZ)/deltaZ);
unsigned long int totalPoints;
Point_XYZ_RGBA* sPoint = new Point_XYZ_RGBA[(1-useFile)*totalPointsX*totalPointsY*totalPointsZ];
//bool Point[(1-useFile))*totalPointsX][(1-useFile)*totalPointsY][(1-useFile)*totalPointsZ];
int WINDOW_WIDHT = 600;
int WINDOW_HEIGHT = 600;
int WINDOW_POSITION_X = 100;
int WINDOW_POSITION_Y = 100;
char* WINDOW_NAME = "Window";
FILE * allPoints;
FILE * allSPoints;
//FILE * reader;
int maxIterations = 300;
int nIterations = 0;
double finalValue = 0;
char timeStr[100];
/*Functions Prototypes*/
void Reshape(int w, int h);
void Display();
void Initialize();
void Keyboard(unsigned char key, int x, int y);
void findMandelbulb(double x, double y, double z);
void drawMandelbulb();
void SaveTGA(void);
bool findInFile(double kx, double ky, double kz);
double finalRes(Point_XYZ_RGBA Point);
void timeAdjust(double t);
bool ifBlows(double x, double y, double z);
int main(int argc, char **argv)
{
srand(time(NULL));
if(useFile == 0)
{
unsigned int k = 0;
bool surf = false;
printf("Evaluating all the pixels without file assistence
");
for(double x = minX; x <= maxX; x = x + deltaX)
{
for(double y = minY; y <= maxY; y = y + deltaY)
{
for(double z = minZ; z <= maxZ; z = z + deltaZ)
{
if(ifBlows(x,y,z))
{
for(double dx = -deltaX; dx <= deltaX && surf == false; dx = dx + deltaX)
{
for(double dy = -deltaY; dy <= deltaY && surf == false; dy = dy + deltaY)
{
for(double dz = -deltaZ; dz <= deltaZ && surf == false; dz = dz + deltaZ)
{
if(dx != 0 || dy != 0 || dz != 0)
{
if(ifBlows(x+dx,y+dy,z+dz) == false)
{
surf = true;
}
}
}
}
}
if(surf == true)
{
sPoint[k] = Point_XYZ_RGBA(x,y,z,true);
k++;
}
surf = false;
}
printf("Finding the points that belong to the set and are on the surface: %.2lf%% %.2lf%% %.2%%
",100*((x-minX)/(maxX-minX)),100*((y-minY)/(maxY-minY)),100*((z-minZ)/(maxZ-minZ)));
nIterations = 0;
}
}
}
printf("All Points processed
");
totalPoints = k+1;
printf("Drawing the shape
Number of Voxels: %d
", k);
}
else
{
unsigned long int k = 0;
// clock_t t1,t2;
// t1 = clock();
allSPoints = fopen("AllSPoints.txt","w");
bool surf = false;
// t1 = clock();
for(double kx = minX; kx <= maxX; kx = kx + deltaX)
{
for(double ky = minY; ky <= maxY; ky = ky + deltaY)
{
for(double kz = minZ; kz <= maxZ; kz = kz + deltaZ)
{
if(ifBlows(kx,ky,kz) == true)
{
for(double dx = -deltaX; dx <= deltaX && surf == false; dx = dx + deltaX)
{
for(double dy = -deltaY; dy <= deltaY && surf == false; dy = dy + deltaY)
{
for(double dz = -deltaZ; dz <= deltaZ && surf == false; dz = dz + deltaZ)
{
if(dx != 0 || dy != 0 || dz != 0)
{
if(ifBlows(kx+dx,ky+dy,kz+dz) == false)
{
surf = true;
}
}
}
}
}
if(surf == true)
{
fprintf(allSPoints,"%lf %lf %lf
",kx,ky,kz);
k++;
}
}
}
// t2 = clock();
// timeAdjust((((float)t2-(float)t1)/1000000)/((kx-minX)/(maxX-minX))-((float)t2-(float)t1)/1000000);
printf("Finding the points that belong to the surface: %.2lf%% %.2lf%% %ld
",100*((kx-minX)/(maxX-minX)),100*((ky-minY)/(maxY-minY)),k);
}
}
fclose(allSPoints);
totalPoints = k + 1;
printf("Drawing the shape
Number of Voxels: %d
", k);
}
// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(WINDOW_POSITION_X, WINDOW_POSITION_Y);
glutInitWindowSize(WINDOW_WIDHT, WINDOW_HEIGHT);
glutCreateWindow(WINDOW_NAME);
Initialize();
// register callbacks
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
// glutIdleFunc(Display);
glutKeyboardFunc(Keyboard);
// enter GLUT event processing cycle
glutMainLoop();
return 0;
}
void Reshape(int w, int h)
{
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
h = 1;
float ratio = w * 1.0 / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
void Display(void)
{
glMatrixMode(GL_MODELVIEW);
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( 0.0f, 0.0f, distanceToOrigin,//Position of Camera
0.0f, 0.0f, 0.0f, //Looking at point x y z
0.0f, 1.0f, 0.0f);//What is "up"
glRotatef(angleX, 1.0f, 0.0f, 0.0f);
glRotatef(angleY, 0.0f, 1.0f, 0.0f);
glRotatef(angleZ, 0.0f, 0.0f, 1.0f);
glBegin(GL_LINES);
glColor3f(1.0,1.0,1.0);
glVertex3d(2.0,0.0,0.0);
glVertex3d(-2.0,0.0,0.0);
glVertex3d(0.0,2.0,0.0);
glVertex3d(0.0,-2.0,0.0);
glVertex3d(0.0,0.0,2.0);
glVertex3d(0.0,0.0,-2.0);
glEnd();
drawMandelbulb();
glutSwapBuffers();
glutPostRedisplay();
}
void Initialize()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glShadeModel(GL_SMOOTH);
//Lighting Setup
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
glEnable(GL_LIGHT3);
glEnable(GL_LIGHT4);
glEnable(GL_LIGHT5);
//Set Lighting Intensity and Color
GLfloat qaAmbientLight[] = {0.2, 0.2, 0.2, 1.0}; //R G B Alpha
GLfloat qaDiffuseLight[] = {0.5, 0.5, 0.5, 1.0}; //ususaly, Ambient + Diffuse = 1.0
GLfloat qaSpecularLight[] = {0.1, 0.1, 0.1, 0.1};
glLightfv(GL_LIGHT0, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);
glLightfv(GL_LIGHT1, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT1, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT1, GL_SPECULAR, qaSpecularLight);
glLightfv(GL_LIGHT2, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT2, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT2, GL_SPECULAR, qaSpecularLight);
glLightfv(GL_LIGHT3, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT3, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT3, GL_SPECULAR, qaSpecularLight);
glLightfv(GL_LIGHT4, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT4, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT4, GL_SPECULAR, qaSpecularLight);
glLightfv(GL_LIGHT5, GL_AMBIENT, qaAmbientLight);
glLightfv(GL_LIGHT5, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT5, GL_SPECULAR, qaSpecularLight);
//Set Light Position
GLfloat qaLightPosition0[] = {2.0, 0.0, 0.0, 1.0}; //X, Y, Z, 1.0 <-- set the 4th coord to 1
GLfloat qaLightPosition1[] = {0.0, 2.0, 0.0, 1.0};
GLfloat qaLightPosition2[] = {0.0, 0.0, 2.0, 1.0};
GLfloat qaLightPosition3[] = {-2.0, 0.0, 0.0, 1.0};
GLfloat qaLightPosition4[] = {0.0, -2.0, 0.0, 1.0};
GLfloat qaLightPosition5[] = {0.0, 0.0, -2.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition0);
glLightfv(GL_LIGHT1, GL_POSITION, qaLightPosition1);
glLightfv(GL_LIGHT2, GL_POSITION, qaLightPosition2);
glLightfv(GL_LIGHT3, GL_POSITION, qaLightPosition3);
glLightfv(GL_LIGHT4, GL_POSITION, qaLightPosition4);
glLightfv(GL_LIGHT5, GL_POSITION, qaLightPosition5);
}
void Keyboard(unsigned char key, int x, int y)
{
if(key == 27)
{
exit(0);
}
else if(key == 'd')
{
angleY += angleDelta;
}
else if(key == 'a')
{
angleY -= angleDelta;
}
else if(key == 's')
{
angleX += angleDelta;
}
else if(key == 'w')
{
angleX -= angleDelta;
}
else if(key == 'e')
{
angleZ += angleDelta;
}
else if(key == 'q')
{
angleZ -= angleDelta;
}
else if(key == 'z')
{
distanceToOrigin -= distanceDelta;
}
else if(key == 'x')
{
distanceToOrigin += distanceDelta;
}
else if(key == 'r')
{
angleX = 0.0f;
angleY = 0.0f;
angleZ = 0.0f;
distanceToOrigin = 10.0;
}
}
void findMandelbulb(double x, double y, double z)
{
double cx = x;
double cy = y;
double cz = z;
double t;
double p;
double r;
while(nIterations < maxIterations && sqrt(cx*cx + cy*cy + cz*cz) < 2.0)
{
r = sqrt(cx*cx + cy*cy + cz*cz);
t = 2*atan2(cy,cx);
p = 2*asin(cz/r);
cx = pow(r,2)*cos(t)*cos(p) + x;
cy = pow(r,2)*sin(t)*cos(p) + y;
cz = pow(r,2)*-1*sin(p) + z;
nIterations++;
}
finalValue = sqrt(cx*cx + cy*cy + cz*cz);
}
void drawMandelbulb()
{
if(useFile == 0)
{
for(unsigned int k = 0; k < totalPoints; k++)
{
GLfloat qaBlack[] = {0.0, 0.0, 0.0, 1.0};
GLfloat qaColor[] = {exp(-1*pow(finalRes(sPoint[k])-1.2,2)/0.4)/2,exp(-1*pow(finalRes(sPoint[k])-1.0,2)/0.05)/2,exp(-1*pow(finalRes(sPoint[k])-0.6,2)/0.05)/5, 1.0};
GLfloat qaWhite[] = {0.1, 0.1, 0.1, 1.0};
GLfloat qaLowAmbient[] = {0.2, 0.2, 0.2, 1.0};
GLfloat qaFullAmbient[] = {1.0, 1.0, 1.0, 1.0};
glMaterialfv(GL_FRONT, GL_AMBIENT, qaColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, qaColor);
glMaterialfv(GL_FRONT, GL_SPECULAR, qaColor);
glMaterialf(GL_FRONT, GL_SHININESS, 60.0); //0 to 128
glLightfv(GL_LIGHT0, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT1, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT2, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT3, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT4, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT5, GL_AMBIENT, qaLowAmbient);
MyShapes::makeIcosahedron((deltaX + deltaY + deltaZ)/3,sPoint[k].getX(),sPoint[k].getY(),sPoint[k].getZ(),MyMaths::randDouble(0,6.28),MyMaths::randDouble(0,6.28),MyMaths::randDouble(0,6.28));
}
}
else
{
allSPoints = fopen("AllSPoints.txt","r");
char string_0[256];
double x;
double y;
double z;
while((fgets(string_0,256,allSPoints)) != NULL)
{
fscanf(allSPoints,"%lf %lf %lf
",&x, &y, &z);
GLfloat qaBlack[] = {0.0, 0.0, 0.0, 1.0};
GLfloat qaColor[] = {exp(-1*pow(finalRes(Point_XYZ_RGBA(x,y,z))-1.2,2)/0.4)/2,exp(-1*pow(finalRes(Point_XYZ_RGBA(x,y,z))-1.0,2)/0.05)/2,exp(-1*pow(finalRes(Point_XYZ_RGBA(x,y,z))-0.6,2)/0.05)/5, 1.0};
GLfloat qaWhite[] = {0.1, 0.1, 0.1, 1.0};
GLfloat qaLowAmbient[] = {0.2, 0.2, 0.2, 1.0};
GLfloat qaFullAmbient[] = {1.0, 1.0, 1.0, 1.0};
glMaterialfv(GL_FRONT, GL_AMBIENT, qaColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, qaColor);
glMaterialfv(GL_FRONT, GL_SPECULAR, qaColor);
glMaterialf(GL_FRONT, GL_SHININESS, 60.0); //0 to 128
glLightfv(GL_LIGHT0, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT1, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT2, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT3, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT4, GL_AMBIENT, qaLowAmbient);
glLightfv(GL_LIGHT5, GL_AMBIENT, qaLowAmbient);
MyShapes::makeIcosahedron((deltaX+deltaY+deltaZ)/3,x,y,z,MyMaths::randDouble(0,6.28),MyMaths::randDouble(0,6.28),MyMaths::randDouble(0,6.28));
}
fclose(allSPoints);
}
if(useScreenShot == 1)
{
SaveTGA();
}
}
double finalRes(Point_XYZ_RGBA Point)
{
double cx = Point.getX();
double cy = Point.getY();
double cz = Point.getZ();
double t;
double p;
double r;
while(nIterations < maxIterations && sqrt(cx*cx + cy*cy + cz*cz) < 2.0)
{
r = (abs(sqrt(cx*cx + cy*cy + cz*cz-4))+0.01)*10;
t = 2*atan2(cy,cx);
p = 2*asin(cz/r);
cx = pow(r,2)*cos(t)*cos(p) + Point.getX();
cy = pow(r,2)*sin(t)*cos(p) + Point.getY();
cz = pow(r,2)*-1*sin(p) + Point.getZ();
nIterations++;
}
return sqrt(cx*cx + cy*cy + cz*cz);
}
bool ifBlows(double x, double y, double z)
{
{
double cx = x;
double cy = y;
double cz = z;
double t;
double p;
double r;
while(nIterations < maxIterations && sqrt(cx*cx + cy*cy + cz*cz) < 2.0)
{
r = sqrt(cx*cx + cy*cy + cz*cz);
t = 2*atan2(cy,cx);
p = 2*asin(cz/r);
cx = pow(r,2)*cos(t)*cos(p) + x;
cy = pow(r,2)*sin(t)*cos(p) + y;
cz = pow(r,2)*-1*sin(p) + z;
nIterations++;
}
if(nIterations == maxIterations)
{
nIterations = 0;
finalValue = 0;
return true;
}
else
{
nIterations = 0;
finalValue = 0;
return false;
}
}
}
void SaveTGA(void)
{
glPixelStorei(GL_PACK_ALIGNMENT,1);
char cFileName[64];
FILE *fScreenshot;
int nSize = WINDOW_WIDHT * WINDOW_HEIGHT * 3;
GLubyte *pixels = new GLubyte [nSize];
if (pixels == NULL) return;
int nShot = 0;
while (nShot < nOfScreenshots)
{
sprintf(cFileName,"screenshot_%d.tga",nShot);
fScreenshot = fopen(cFileName,"rb");
if (fScreenshot == NULL) break;
else fclose(fScreenshot);
++nShot;
if (nShot > 63)
{
printf("Screenshot limit of 64 reached. Remove some shots if you want to take more.");
return;
}
}
fScreenshot = fopen(cFileName,"wb");
glReadPixels(0, 0, WINDOW_WIDHT, WINDOW_HEIGHT, GL_RGB,
GL_UNSIGNED_BYTE, pixels);
//convert to BGR format
unsigned char temp;
int i = 0;
while (i < nSize)
{
temp = pixels[i]; //grab blue
pixels[i] = pixels[i+2];//assign red to blue
pixels[i+2] = temp; //assign blue to red
i += 3; //skip to next blue byte
}
unsigned char TGAheader[12]= {0,0,2,0,0,0,0,0,0,0,0,0};
unsigned char header[6] = {WINDOW_WIDHT%256,WINDOW_WIDHT/256,
WINDOW_HEIGHT%256,WINDOW_HEIGHT/256,24,0
};
fwrite(TGAheader, sizeof(unsigned char), 12, fScreenshot);
fwrite(header, sizeof(unsigned char), 6, fScreenshot);
fwrite(pixels, sizeof(GLubyte), nSize, fScreenshot);
fclose(fScreenshot);
delete [] pixels;
return;
}
/*
bool findInFile(double kx, double ky, double kz)
{
char ignore;
char fileN[256];
double iy;
double iz;
int b;
if(kx >= minX && ky >= minY && kz >= minZ)
{
sprintf(fileN,"%lf.txt",kx);
ifstream reader (fileN);
if(!reader.is_open())
{
printf("deu ruim abrindo
");
}
while(reader >> iy >> iz >> b)
{
//printf("%lf %lf %d
",iy,iz,b);
if(abs(iy - ky) < deltaY/10 && abs(iz - kz) < deltaZ/10)
{
reader.close();
// printf("veio ate aqui
");
if(b == 1)
{
// printf("true
");
return true;
}
else
{
// printf("false
");
return false;
}
}
}
reader.close();
printf("Nao achou
");
return false;
}
else
{
return false;
}
// return false;
}
void timeAdjust(double t){
int s = 0;
int m = 0;
int h = 0;
int d = 0;
int w = 0;
s = (int)t;
while(s >= 60){
s = s - 60;
m++;
}while(m >= 60){
m = m - 60;
h++;
}while(h >= 24){
h = h - 24;
d++;
}while(d >= 7){
d = d - 7;
w++;
}
if(w > 0){
sprintf(timeStr,"%dw %dd %dh %dm %ds",w,d,h,m,s);
}else if(d > 0){
sprintf(timeStr,"%dd %dh %dm %ds",d,h,m,s);
}else if(h > 0){
sprintf(timeStr,"%dh %dm %ds",h,m,s);
}else if(m > 0){
sprintf(timeStr,"%dm %ds",m,s);
}else{
sprintf(timeStr,"%ds",s);
}
}
*/