diff --git a/Release/Skeleton.iobj b/Release/Skeleton.iobj index e571ac5c83b90e6a8902f0fa0edd721833a739f2..fe299cd45c9b798101cf805d67cbac30721ad38e 100644 Binary files a/Release/Skeleton.iobj and b/Release/Skeleton.iobj differ diff --git a/Release/Skeleton.ipdb b/Release/Skeleton.ipdb index 9da25f2880633d1e51615cdbd9778f34b0abce4e..5c6769afa455808ac5f2719814975bbc04eef49f 100644 Binary files a/Release/Skeleton.ipdb and b/Release/Skeleton.ipdb differ diff --git a/Release/Skeleton.log b/Release/Skeleton.log index 212e8d4eeece5d7ce386ea700b99238b4c94250d..a8166d9833c3e9f32d8f034e15ade9070815070b 100644 --- a/Release/Skeleton.log +++ b/Release/Skeleton.log @@ -1,14 +1,22 @@ Skeleton.cpp D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\framework.h(167,17): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(100,39): warning C4244: 'return': conversion from 'double' to 'float', possible loss of data -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(209,1): warning C4305: 'initializing': truncation from 'double' to 'float' -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(274,22): warning C4018: '<': signed/unsigned mismatch -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(285,22): warning C4018: '<': signed/unsigned mismatch -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(372,21): warning C4018: '<': signed/unsigned mismatch -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(379,21): warning C4018: '<': signed/unsigned mismatch -D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(425,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(254,1): warning C4305: 'initializing': truncation from 'double' to 'float' +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(321,22): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(330,22): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(435,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(442,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(460,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(470,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(472,22): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(488,23): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(491,26): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(495,27): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(496,28): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(543,21): warning C4018: '<': signed/unsigned mismatch +D:\Grafika\GrafikaHaziCsomag\Programs\Skeleton\Skeleton\Skeleton.cpp(603,22): warning C4018: '<': signed/unsigned mismatch Generating code - 2 of 355 functions ( 0.6%) were compiled, the rest were copied from previous compilation. + 1 of 435 functions ( 0.2%) were compiled, the rest were copied from previous compilation. 0 functions were new in current compilation 1 functions had inline decision re-evaluated but remain unchanged Finished generating code diff --git a/Release/Skeleton.obj b/Release/Skeleton.obj index 859a97819b021f8837d210371c29890f457de942..3315e53801203ebbd4d99c3cfc9690b3398ce368 100644 Binary files a/Release/Skeleton.obj and b/Release/Skeleton.obj differ diff --git a/Release/Skeleton.tlog/Skeleton.write.1u.tlog b/Release/Skeleton.tlog/Skeleton.write.1u.tlog index 630d328eec2b9f4d2ebbd6dbee193f1297bf25b9..733505bf90c8e2220b931f0da4c2b71f65943768 100644 Binary files a/Release/Skeleton.tlog/Skeleton.write.1u.tlog and b/Release/Skeleton.tlog/Skeleton.write.1u.tlog differ diff --git a/Release/vc142.pdb b/Release/vc142.pdb index 3361c42ccd828524e52c405b676b8d4c7cbabc90..139c895ec49ffb2ad996bc8a6ea48326799e6e39 100644 Binary files a/Release/vc142.pdb and b/Release/vc142.pdb differ diff --git a/Skeleton.cpp b/Skeleton.cpp index fee95f5bc141915606d1157af40901be980552cb..3b7eb60fd6ad8bee598cb3457ac2b9676238660c 100644 --- a/Skeleton.cpp +++ b/Skeleton.cpp @@ -59,21 +59,15 @@ const char* const fragmentSource = R"( outColor = vec4(color, 1); // computed color is the color of the primitive } )"; - // // Global variables // -const int CIRCLESEG = 25; //how many triangle the base stands from - -GPUProgram gpuProgram; // vertex and fragment shaders - -unsigned int vao; +float movedTocX; +float movedTocY; - -// -// Global structs -// +float clickedOncX; +float clickedOncY; struct Color { float r, g, b; @@ -87,6 +81,12 @@ struct Color { } }; +const int CIRCLESEG = 25; //how many triangle the base stands from + +GPUProgram gpuProgram; // vertex and fragment shaders + +int GraphPointSize = 50; + // //Global functions // @@ -106,6 +106,7 @@ float degToRad(float courrentTriangleAngle) { class drawableBase { protected: + unsigned int vao; unsigned int vbo; //vertex buffer obj std::vector<vec2> points; Color color; @@ -148,14 +149,31 @@ public: } }; -int cntr = 0; // TODO: remove this cntr class GraphPoint : drawableBase { - vec3 p3D; //center of the point in hyperbolic splace + //center of the point in hyperbolic splace + vec3 p3D; + + //radius used for the circle float r = 20.0f; - vec2 p; // center on the base disk + + //center of the point in 2D, + //NOT USED for displaying + vec2 p; + + //Here stores the point the direct neighbours std::vector<GraphPoint*> neighbours; + + //This is for algorithm. If it's true, + //it wont be drawn again bool Drawn; + + //This is for the cluster search algorithm + //if this GraphPoint has benn added to a cluster, + //the algorithm won't put it again in another cluster + bool searched; + + Texture texture; public: GraphPoint() { @@ -166,44 +184,71 @@ public: Drawn = false; } + //Returns if the point is drawn bool getDrawn() { return Drawn; } + //Set the drawn state void setDrawn(bool _d) { Drawn = _d; } + bool getSearched() { + return searched; + } + + //Set the drawn state + void setSearched(bool _d) { + searched = _d; + } + + //Add a neighbour to vector void addNeighbour(GraphPoint *gp){ neighbours.push_back(gp); } + //returns with the neighbour vector. + //Needed for the custer search algorithm + std::vector<GraphPoint*> getNeighbourVec() { + return neighbours; + } + + //Returns the size of the neigbours vector int getNeighboursSize() { return neighbours.size(); } + //Returns the 2D point. I'm not sure if i use this.... vec2 getPoint() { return p; } + //Returns the point coordinates in hyperbolic space. + //NOT divided by Z (not ready for display) vec3 getPoint3D() { return p3D; } + //Sets the point to the given coordinates + //and calculates the point in hyperbolic space void setCoordinates(vec2 _p) { p = _p; p3D = Vec2ToVec3(p); placeCircleToNewCoordinates(); } + //Converts the 2D point into point in hyperbolic space vec3 Vec2ToVec3(vec2 p) { return vec3(p.x, p.y, (float)sqrt(p.x * p.x + p.y * p.y + 1)); } + //Returns the gradient of the point vec3 grad(vec3 _p) { return vec3(2 * _p.x, 2 * _p.y, -2 * _p.z); } + //This calculates the triangles for the circle in hyperbolic space void placeCircleToNewCoordinates() { points.clear(); float piece = 360.0 / CIRCLESEG; @@ -246,10 +291,9 @@ public: p3D.y / p3D.z + (sinf(degToRad(courrentTriangleAngle)) / r) / p3D.z * -cosf(atanf(2 * abs(p3D.y))))); } - - //printf("x=%f, y=%f xALPHA=%f \n", p3D.x, p3D.y, sinf(atanf(2 * abs(p3D.x) + 2 * abs(p3D.y)))); } + //Never used it. Projects the 3D point to 2D vec2 vec3tovec2(vec3 c) { vec2 temp; temp.x = c.x; @@ -257,15 +301,18 @@ public: return temp; } + //Recolors the point void reColor() const { int location = glGetUniformLocation(gpuProgram.getId(), "color"); glUniform3f(location, color.r, color.g, color.b); // 3 floats } + //sets the color of the color of the point to given rgb values void setColor(Color newColor) override{ color = newColor; } + //Iterates through the neighbours and sets them to new coordinates void gpNeighbourAlgorithm(float angle) { try { float deg = 360.0f / neighbours.size(); @@ -273,8 +320,6 @@ public: for (int i = 0; i < neighbours.size(); i++) { if (neighbours[i]->getDrawn() == false) { - - printf("kirajzolva: %d \n", ++cntr); neighbours[i]->setCoordinates(vec2(p.x + cosf(degToRad(currAngle)), p.y + sinf(degToRad(currAngle)))); currAngle += deg; } @@ -290,11 +335,12 @@ public: } } } - catch (...) { - printf("Somethings wrong here"); - } +catch (...) { + printf("Somethings wrong here"); +} } + //Actually draws the calculated circle/point void draw() { Drawn = true; @@ -307,26 +353,40 @@ public: } }; -//Can't put it to the structs, becouse GraphPoint not declared there +// +// Global structs +// + struct pairs { GraphPoint* p1; GraphPoint* p2; }; +struct Cluster { + std::vector<GraphPoint*> data; + int size; + Cluster* next; +}; + +// +// End of Global structs +// + class Line : drawableBase { GraphPoint* p1; GraphPoint* p2; public: - Line(GraphPoint *_p1, GraphPoint *_p2) { + Line(GraphPoint* _p1, GraphPoint* _p2) { setColor(Color(254, 254, 0)); p2 = _p2; p1 = _p1; } void set() { + vec3 temp = p1->getPoint3D(); - points.push_back(vec2(temp.x / temp.z, temp.y/ temp.z)); + points.push_back(vec2(temp.x / temp.z, temp.y / temp.z)); temp = p2->getPoint3D(); points.push_back(vec2(temp.x / temp.z, temp.y / temp.z)); } @@ -351,16 +411,19 @@ public: class graphManager { - GraphPoint* gps = new GraphPoint[50]; + GraphPoint* gps = new GraphPoint[GraphPointSize]; std::vector<pairs> pair; std::vector<Line> line; + + //Variables for the sorting algorithms + std::vector<GraphPoint*> twoOrLess; + std::vector<Cluster> clstrs; public: graphManager() { - - for (int i = 0; i < 50; i++) { - for (int j = i+1; j < 50; j++) { - int rndm = rand() % 100; + for (int i = 0; i < GraphPointSize; i++) { + for (int j = i + 1; j < GraphPointSize; j++) { + int rndm = rand() % 100; if (rndm < 5) { pairs p; p.p1 = &gps[i]; p.p2 = &gps[j]; gps[i].addNeighbour(&gps[j]); @@ -380,18 +443,114 @@ public: line[i].draw(); } - for (int i = 0; i < 50; i++) { + for (int i = 0; i < GraphPointSize; i++) { gps[i].draw(); } } + void lessThanThreeNGB() { + for (int i = 0; i < GraphPointSize; i++) { + if (gps[i].getNeighboursSize() < 3) { + twoOrLess.push_back(&gps[i]); + } + } + } + + bool findInVector(std::vector<GraphPoint*> vec, GraphPoint* p) { + for (int j = 0; j < vec.size(); j++) { + if (vec[j] == p) { + return true; + } + } + return false; + } + + //returns if a Graphpoint is in any of the clusters + bool inCluster(GraphPoint* p) { + for (int i = 0; i < clstrs.size(); i++) { + std::vector<GraphPoint*> temp = clstrs[i].data; + for (int j = 0; j < temp.size(); j++) { + if (temp[j] == p) { + return true; + } + } + } + return false; + } + int cntr = 0; + void clusterFinder() { + for (int i = 0; i < GraphPointSize; i++) { + if (!findInVector(twoOrLess, &gps[i])) { + Cluster tempClstr; + std::vector<GraphPoint*> search; + search = gps[i].getNeighbourVec(); + + for (int j = 0; j < search.size(); j++) { //szomszedain megy vegig + if (!findInVector(twoOrLess, search[j])) { //ha a szomszed nincs benne a 2 vagy kevesebb tombben + if (!inCluster(search[i])) { // es nincs semelyik clusterben + for (int k = 0; k < search[j] -> getNeighbourVec().size(); k++) { //vegigmegy a aszomszed szomszedain + //azonossagot keres a hivo pont szomszedaival + std::vector<GraphPoint*> tempNGBVec; + tempNGBVec = search[j]->getNeighbourVec(); + for (int l = 0; l < tempNGBVec.size(); l++) { + for (int m = 0; m < search.size(); m++) { + if (tempNGBVec[l] == search[m]) { + printf("belepve %d \n", ++cntr); + search[j]->setSearched(true); tempNGBVec[l]->setSearched(true); gps[i].setSearched(true); + if (tempClstr.size == 0) { + tempClstr.data.push_back(search[j]); + tempClstr.data.push_back(tempNGBVec[l]); + tempClstr.data.push_back(&gps[i]); + tempClstr.size += 3; + } + else { + tempClstr.data.push_back(search[j]); + tempClstr.data.push_back(tempNGBVec[l]); + tempClstr.size += 2; + } + } + } + } + + } + } + } + } + if(tempClstr.size > 2) + clstrs.push_back(tempClstr); + } + } + } + + void forceDrivenSort() { + //resulant forces storing vector + std::vector<vec2> resulants; + + for (int i = 0; i < GraphPointSize; i++) { + vec2 pointResulatn; + + } + } + void sortGraph() { + + // Delete previous graph from buffer + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + line.clear(); + + //reset all the lines TODO: fix this later + for (int i = 0; i < pair.size(); i++) { + Line temp(pair[i].p1, pair[i].p2); + line.push_back(temp); + } + // //Select the graphpoint with the most pair // GraphPoint biggest = gps[0]; gps[0].setDrawn(false); - for (int i = 1; i < 50; i++) { + for (int i = 1; i < GraphPointSize; i++) { if (gps[i].getNeighboursSize() > biggest.getNeighboursSize()) biggest = gps[i]; gps[i].setDrawn(false); @@ -406,29 +565,49 @@ public: //kirajzolja az elsot biggest.setDrawn(true); biggest.gpNeighbourAlgorithm(currAngle); - currAngle += deg; + currAngle -= deg; //vegigiteral az osszesen - for (int i = 0; i < 50; i++) { + for (int i = 0; i < GraphPointSize; i++) { //ha meg nics felrajzolva if (gps[i].getDrawn() == false) { // beallitja a koordinatat ay elsohoz kepest - gps[i].setCoordinates(vec2(biggest.getPoint3D().x + cosf(degToRad(currAngle)) /0.9f, biggest.getPoint3D().y + sinf(degToRad(currAngle))/0.9f)); + gps[i].setCoordinates(vec2(biggest.getPoint3D().x + cosf(degToRad(currAngle)) , biggest.getPoint3D().y + sinf(degToRad(currAngle)))); gps[i].setDrawn(true); - gps[i].gpNeighbourAlgorithm(currAngle); - currAngle += deg; + if (gps[i].getNeighboursSize() != 0) { + gps[i].gpNeighbourAlgorithm(currAngle + deg); + } + currAngle -= deg; } } - // Delete previous graph from buffer - glClear(GL_COLOR_BUFFER_BIT); - glClear(GL_DEPTH_BUFFER_BIT); - for (int i = 0; i < line.size(); i++) { - line[i].draw(); - } - for (int i = 0; i < 50; i++) { - gps[i].draw(); + draw(); + //glutSwapBuffers(); + glutPostRedisplay(); + + clusterFinder(); + //Count as 1 cluster, if there are at least 3 point, + //wich contains each-other as a neigbour + printf("%d db cluster van", clstrs.size()); + lessThanThreeNGB(); + printf(" kevesebb mint 3 szomszedos pontok: %d \n", twoOrLess.size()); + } + + void MoveAllPoints() { + + + for (int i = 0; i < GraphPointSize; i++) { + vec2 temp = gps[i].getPoint(); + vec2 p1((clickedOncX - temp.x), (clickedOncY - temp.y)); + gps[i].setCoordinates(vec2((movedTocX - p1.x), (movedTocY - p1.y))); + line.clear(); + for (int i = 0; i < pair.size(); i++) { + Line temp(pair[i].p1, pair[i].p2); + line.push_back(temp); + } } - glutSwapBuffers(); + draw(); + glutPostRedisplay(); + //glutSwapBuffers(); } }; graphManager gm; @@ -462,19 +641,22 @@ void onKeyboard(unsigned char key, int pX, int pY) { void onKeyboardUp(unsigned char key, int pX, int pY) { } + // Move mouse with key pressed void onMouseMotion(int pX, int pY) { // pX, pY are the pixel coordinates of the cursor in the coordinate system of the operation system // Convert to normalized device space - float cX = 2.0f * pX / windowWidth - 1; // flip y axis - float cY = 1.0f - 2.0f * pY / windowHeight; - printf("Mouse moved to (%3.2f, %3.2f)\n", cX, cY); + movedTocX = 2.0f * pX / windowWidth - 1; // flip y axis + movedTocY = 1.0f - 2.0f * pY / windowHeight; + printf("Mouse moved to (%3.2f, %3.2f)\n", movedTocX, movedTocY); + + gm.MoveAllPoints(); } // Mouse click event void onMouse(int button, int state, int pX, int pY) { // pX, pY are the pixel coordinates of the cursor in the coordinate system of the operation system // Convert to normalized device space - float cX = 2.0f * pX / windowWidth - 1; // flip y axis - float cY = 1.0f - 2.0f * pY / windowHeight; + clickedOncX = 2.0f * pX / windowWidth - 1; // flip y axis + clickedOncY = 1.0f - 2.0f * pY / windowHeight; char* buttonStat; switch (state) { @@ -483,9 +665,9 @@ void onMouse(int button, int state, int pX, int pY) { // pX, pY are the pixel co } switch (button) { - case GLUT_LEFT_BUTTON: printf("Left button %s at (%3.2f, %3.2f)\n", buttonStat, cX, cY); break; - case GLUT_MIDDLE_BUTTON: printf("Middle button %s at (%3.2f, %3.2f)\n", buttonStat, cX, cY); break; - case GLUT_RIGHT_BUTTON: printf("Right button %s at (%3.2f, %3.2f)\n", buttonStat, cX, cY); break; + case GLUT_LEFT_BUTTON: printf("Left button %s at (%3.2f, %3.2f)\n", buttonStat, clickedOncX, clickedOncY); break; + case GLUT_MIDDLE_BUTTON: printf("Middle button %s at (%3.2f, %3.2f)\n", buttonStat, clickedOncX, clickedOncY); break; + case GLUT_RIGHT_BUTTON: printf("Right button %s at (%3.2f, %3.2f)\n", buttonStat, clickedOncX, clickedOncY); break; } }