Advertisement
jovanovski

КГ Коцка

Apr 28th, 2013
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 33.35 KB | None | 0 0
  1. /*---------------------------
  2. Rubiks Cube in openGL and C++
  3. Gorjan Jovanovski
  4. jovanovski@gorjan.info
  5. www.gorjan.info
  6. ---------------------------*/
  7.  
  8. #include <stdio.h>
  9. #include <windows.h>
  10. #include <stdarg.h>
  11. #include <math.h>
  12. #define GL_GLEXT_PROTOTYPES
  13. #include <GL/glut.h>
  14. #include <iostream>
  15.  
  16. using namespace std;
  17. void display();
  18. void specialKeys();
  19.  
  20. //Pocetna rotacija
  21. double rotate_y=135;
  22. double rotate_x=-45;
  23.  
  24. //Poceten prostor
  25. float prostor = 0.1;
  26.  
  27. //Poceten broj na kocki
  28. int brojnakocki = 3;
  29.  
  30. //Poceten selektor
  31. float selx, sely, selz;
  32. int selo=1;
  33. int selpoz=2;
  34.  
  35. //Poceten zoom
  36. int zoom = 10;
  37.  
  38. //Pocetno nepopuneta matrica za rotacija
  39. bool napravena = false;
  40.  
  41.  
  42.  
  43. class Cube2
  44. {
  45.  
  46. public:
  47.  
  48.     //Koordinati na sekoj od 8te kjosevi
  49.     float x1,y1,z1;
  50.     float x2,y2,z2;
  51.     float x3,y3,z3;
  52.     float x4,y4,z4;
  53.     float x5,y5,z5;
  54.     float x6,y6,z6;
  55.     float x7,y7,z7;
  56.     float x8,y8,z8;
  57.  
  58.     //Indeks na kockata, ne se koristi
  59.     int z;
  60.  
  61.     //Rotacija na kockata, se koristat za animacija
  62.     float rotx, roty, rotz;
  63.  
  64.     //Boenje na stranite na kockite
  65.     int tops=7, bottoms=7, lefts=7, rights=7, fronts=7, backs=7;
  66.  
  67.     Cube2()
  68.     {
  69.     }
  70.  
  71.     //Za animacijata
  72.     void setRotation(float x, float y, float z)
  73.     {
  74.         this->rotx = x;
  75.         this->roty = y;
  76.         this->rotz = z;
  77.     }
  78.  
  79.     //Postavuvanje na kockata na odredeni koordinati
  80.     void setCube(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float x4,float y4,float z4,float x5,float y5,float z5,float x6,float y6,float z6,float x7,float y7,float z7,float x8,float y8,float z8)
  81.     {
  82.         this->x1=x1;
  83.         this->y1=y1;
  84.         this->z1=z1;
  85.         this->x2=x2;
  86.         this->y2=y2;
  87.         this->z2=z2;
  88.         this->x3=x3;
  89.         this->y3=y3;
  90.         this->z3=z3;
  91.         this->x4=x4;
  92.         this->y4=y4;
  93.         this->z4=z4;
  94.         this->x5=x5;
  95.         this->y5=y5;
  96.         this->z5=z5;
  97.         this->x6=x6;
  98.         this->y6=y6;
  99.         this->z6=z6;
  100.         this->x7=x7;
  101.         this->y7=y7;
  102.         this->z7=z7;
  103.         this->x8=x8;
  104.         this->y8=y8;
  105.         this->z8=z8;
  106.         this->drawCube();
  107.     }
  108.  
  109.     //Iscrtuvanje na kockata
  110.     void drawCube()
  111.     {
  112.         glPushMatrix();
  113.  
  114.         glRotatef(rotx,1,0,0);
  115.         glRotatef(roty,0,1,0);
  116.         glRotatef(rotz,0,0,1);
  117.  
  118.         //bela - 1 - glColor3f(1,  1, 1);
  119.         //crvena - 2 - glColor3f(   1.0,  0, 0 );
  120.         //zuta - 3 - glColor3f(  1.0,  1.0,  0.0 );
  121.         //plava - 4 - glColor3f( 0.0,  0.0,  1.0 );
  122.         //zelena - 5 - glColor3f(   0.0,  1.0,  0.0 );
  123.         //portokalova - 6 - glColor3f(   1.0,  0.5,  0.0 );
  124.         //crna - 7 - glColor3f(0,0,0);
  125.  
  126.         //ZADNA STRANA
  127.         switch (backs)
  128.         {
  129.         case 1:
  130.             glColor3f(1, 1, 1);
  131.             break;
  132.         case 2:
  133.             glColor3f(1, 0, 0);
  134.             break;
  135.         case 3:
  136.             glColor3f(1, 1, 0);
  137.             break;
  138.         case 4:
  139.             glColor3f(0, 0, 1);
  140.             break;
  141.         case 5:
  142.             glColor3f(0,  1, 0);
  143.             break;
  144.         case 6:
  145.             glColor3f(1,  0.5, 0);
  146.             break;
  147.         case 7:
  148.             glColor3f(0,0,0);
  149.             break;
  150.         }
  151.  
  152.         glBegin(GL_POLYGON);
  153.         glVertex3f(  x1, y1, z1 );      // P1 is red
  154.         glVertex3f(  x2,  y2, z2 );      // P2 is green
  155.         glVertex3f(  x6,  y6, z6 );      // P2 is green
  156.         glVertex3f(  x5,  y5, z5 );      // P2 is green
  157.  
  158.         glEnd();
  159.  
  160.         //Napred
  161.         glBegin(GL_POLYGON);
  162.         switch (fronts)
  163.         {
  164.         case 1:
  165.             glColor3f(1, 1, 1);
  166.             break;
  167.         case 2:
  168.             glColor3f(1, 0, 0);
  169.             break;
  170.         case 3:
  171.             glColor3f(1, 1, 0);
  172.             break;
  173.         case 4:
  174.             glColor3f(0, 0, 1);
  175.             break;
  176.         case 5:
  177.             glColor3f(0,  1, 0);
  178.             break;
  179.         case 6:
  180.             glColor3f(1,  0.5, 0);
  181.             break;
  182.         case 7:
  183.             glColor3f(0,0,0);
  184.             break;
  185.         }
  186.         glVertex3f(  x4, y4, z4 );      // P1 is red
  187.         glVertex3f(  x3,  y3, z3 );      // P2 is green
  188.         glVertex3f(  x7,  y7, z7 );      // P2 is green
  189.         glVertex3f(  x8,  y8, z8 );      // P2 is green
  190.  
  191.         glEnd();
  192.  
  193.         //Levo
  194.         glBegin(GL_POLYGON);
  195.         switch (lefts)
  196.         {
  197.         case 1:
  198.             glColor3f(1, 1, 1);
  199.             break;
  200.         case 2:
  201.             glColor3f(1, 0, 0);
  202.             break;
  203.         case 3:
  204.             glColor3f(1, 1, 0);
  205.             break;
  206.         case 4:
  207.             glColor3f(0, 0, 1);
  208.             break;
  209.         case 5:
  210.             glColor3f(0,  1, 0);
  211.             break;
  212.         case 6:
  213.             glColor3f(1,  0.5, 0);
  214.             break;
  215.         case 7:
  216.             glColor3f(0,0,0);
  217.             break;
  218.         }
  219.         glVertex3f(  x2, y2, z2 );      // P1 is red
  220.         glVertex3f(  x3,  y3, z3 );      // P2 is green
  221.         glVertex3f(  x7,  y7, z7 );      // P2 is green
  222.         glVertex3f(  x6,  y6, z6 );      // P2 is green
  223.  
  224.         glEnd();
  225.  
  226.         //Desno
  227.         glBegin(GL_POLYGON);
  228.         switch (rights)
  229.         {
  230.         case 1:
  231.             glColor3f(1, 1, 1);
  232.             break;
  233.         case 2:
  234.             glColor3f(1, 0, 0);
  235.             break;
  236.         case 3:
  237.             glColor3f(1, 1, 0);
  238.             break;
  239.         case 4:
  240.             glColor3f(0, 0, 1);
  241.             break;
  242.         case 5:
  243.             glColor3f(0,  1, 0);
  244.             break;
  245.         case 6:
  246.             glColor3f(1,  0.5, 0);
  247.             break;
  248.         case 7:
  249.             glColor3f(0,0,0);
  250.             break;
  251.         }
  252.         glVertex3f(  x1, y1, z1 );      // P1 is red
  253.         glVertex3f(  x4,  y4, z4 );      // P2 is green
  254.         glVertex3f(  x8,  y8, z8 );      // P2 is green
  255.         glVertex3f(  x5,  y5, z5 );      // P2 is green
  256.  
  257.         glEnd();
  258.  
  259.         //Dole
  260.         glBegin(GL_POLYGON);
  261.         switch (bottoms)
  262.         {
  263.         case 1:
  264.             glColor3f(1, 1, 1);
  265.             break;
  266.         case 2:
  267.             glColor3f(1, 0, 0);
  268.             break;
  269.         case 3:
  270.             glColor3f(1, 1, 0);
  271.             break;
  272.         case 4:
  273.             glColor3f(0, 0, 1);
  274.             break;
  275.         case 5:
  276.             glColor3f(0,  1, 0);
  277.             break;
  278.         case 6:
  279.             glColor3f(1,  0.5, 0);
  280.             break;
  281.         case 7:
  282.             glColor3f(0,0,0);
  283.             break;
  284.         }
  285.         glVertex3f(  x6, y6, z6 );      // P1 is red
  286.         glVertex3f(  x7,  y7, z7 );      // P2 is green
  287.         glVertex3f(  x8,  y8, z8 );      // P2 is green
  288.         glVertex3f(  x5,  y5, z5 );      // P2 is green
  289.  
  290.         glEnd();
  291.  
  292.         //Gore
  293.         glBegin(GL_POLYGON);
  294.         switch (tops)
  295.         {
  296.         case 1:
  297.             glColor3f(1, 1, 1);
  298.             break;
  299.         case 2:
  300.             glColor3f(1, 0, 0);
  301.             break;
  302.         case 3:
  303.             glColor3f(1, 1, 0);
  304.             break;
  305.         case 4:
  306.             glColor3f(0, 0, 1);
  307.             break;
  308.         case 5:
  309.             glColor3f(0,  1, 0);
  310.             break;
  311.         case 6:
  312.             glColor3f(1,  0.5, 0);
  313.             break;
  314.         case 7:
  315.             glColor3f(0,0,0);
  316.             break;
  317.         }
  318.         glVertex3f(  x1, y1, z1 );      // P1 is red
  319.         glVertex3f(  x2,  y2, z2 );      // P2 is green
  320.         glVertex3f(  x3,  y3, z3 );      // P2 is green
  321.         glVertex3f(  x4,  y4, z4 );      // P2 is green
  322.         glEnd();
  323.         glPopMatrix();
  324.     }
  325.  
  326.     //Rotacija na boite na stranite
  327.     void rotRight()
  328.     {
  329.         int tmp = fronts;
  330.         fronts = lefts;
  331.         lefts = backs;
  332.         backs = rights;
  333.         rights = tmp;
  334.     }
  335.  
  336.     void rotLeft()
  337.     {
  338.         int tmp = fronts;
  339.         fronts = rights;
  340.         rights = backs;
  341.         backs = lefts;
  342.         lefts = tmp;
  343.     }
  344.  
  345.     void rotSideLeft()
  346.     {
  347.         int tmp = tops;
  348.         tops = rights;
  349.         rights = bottoms;
  350.         bottoms = lefts;
  351.         lefts = tmp;
  352.     }
  353.  
  354.     void rotSideRight()
  355.     {
  356.         int tmp = tops;
  357.         tops = lefts;
  358.         lefts = bottoms;
  359.         bottoms = rights;
  360.         rights = tmp;
  361.     }
  362.  
  363.     void rotBack()
  364.     {
  365.         int tmp = fronts;
  366.         fronts = bottoms;
  367.         bottoms = backs;
  368.         backs = tops;
  369.         tops = tmp;
  370.     }
  371.     void rotFwd()
  372.     {
  373.         int tmp = fronts;
  374.         fronts = tops;
  375.         tops = backs;
  376.         backs = bottoms;
  377.         bottoms = tmp;
  378.     }
  379.  
  380.     //Debug
  381.     void print()
  382.     {
  383.         cout<<"x1: "<<x1<<endl;
  384.         cout<<"y1: "<<y1<<endl;
  385.         cout<<"z1: "<<z1<<endl;
  386.         cout<<"x2: "<<x2<<endl;
  387.         cout<<"y2: "<<y2<<endl;
  388.         cout<<"z2: "<<z2<<endl;
  389.         cout<<"x3: "<<x3<<endl;
  390.         cout<<"y3: "<<y3<<endl;
  391.         cout<<"z3: "<<z3<<endl;
  392.         cout<<"x4: "<<x4<<endl;
  393.         cout<<"y4: "<<y4<<endl;
  394.         cout<<"z4: "<<z4<<endl;
  395.         cout<<"x5: "<<x5<<endl;
  396.         cout<<"y5: "<<y5<<endl;
  397.         cout<<"z5: "<<z5<<endl;
  398.         cout<<"x6: "<<x6<<endl;
  399.         cout<<"y6: "<<y6<<endl;
  400.         cout<<"z6: "<<z6<<endl;
  401.         cout<<"x7: "<<x7<<endl;
  402.         cout<<"y7: "<<y7<<endl;
  403.         cout<<"z7: "<<z7<<endl;
  404.         cout<<"x8: "<<x8<<endl;
  405.         cout<<"y8: "<<y8<<endl;
  406.         cout<<"z8: "<<z8<<endl;
  407.     }
  408. };
  409.  
  410. class BigCube
  411. {
  412.  
  413. public:
  414.  
  415.     //Broj na kocki na eden rab
  416.     int n;
  417.  
  418.     //Niza od kockite
  419.     Cube2 *niza;
  420.  
  421.     //Koordinati za premetki
  422.     int vamu;
  423.     int tamu;
  424.     int onamu;
  425.  
  426.     //Borjac
  427.     int brojac = 0;
  428.  
  429.     //Paren broj na kocki?
  430.     float parnost = 0;
  431.  
  432.     //Se koristat pri rotacii, za da se zameni kocka so druga kocka
  433.     int** matrica;
  434.     int** novamatrica;
  435.     int mbroji, mbrojj;
  436.  
  437.     BigCube()
  438.     {
  439.         this->n = brojnakocki;
  440.         opraviKocki();
  441.     }
  442.  
  443.     ~BigCube()
  444.     {
  445.         for(int i=0; i<n*n*n; i++)
  446.             delete &niza[i];
  447.         delete [] niza;
  448.     }
  449.  
  450.     //Pocetno boenje na kockata
  451.     void colorCube()
  452.     {
  453.  
  454.         //bela - 1 - glColor3f(1,  1, 1);
  455.         //crvena - 2 - glColor3f(   1.0,  0, 0 );
  456.         //zuta - 3 - glColor3f(  1.0,  1.0,  0.0 );
  457.         //plava - 4 - glColor3f( 0.0,  0.0,  1.0 );
  458.         //zelena - 5 - glColor3f(   0.0,  1.0,  0.0 );
  459.         //portokalova - 6 - glColor3f(   1.0,  0.5,  0.0 );
  460.         //crna - 7 - glColor3f(0,0,0);
  461.  
  462.         //boenje 1
  463.  
  464.         for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  465.         {
  466.             for(int j=i; j<(i+brojnakocki); j++)
  467.             {
  468.                 niza[j].tops = 6;
  469.             }
  470.         }
  471.  
  472.         //boenje 2
  473.  
  474.         int pluz = (brojnakocki-1)*brojnakocki;
  475.  
  476.         for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  477.         {
  478.             for(int j=i; j<(i+brojnakocki); j++)
  479.             {
  480.                 niza[j+pluz].bottoms = 5;
  481.             }
  482.         }
  483.  
  484.         //boenje 3
  485.         for(int i=brojnakocki-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  486.         {
  487.             niza[i].lefts = 3;
  488.  
  489.         }
  490.         //boenje 4
  491.         for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  492.         {
  493.             niza[i].rights = 4;
  494.  
  495.         }
  496.         //boenje 5
  497.  
  498.         for(int i=brojnakocki*brojnakocki*(brojnakocki-1); i<brojnakocki*brojnakocki*(brojnakocki-1) + brojnakocki*brojnakocki; i++)
  499.         {
  500.  
  501.  
  502.             niza[i].fronts = 2;
  503.  
  504.         }
  505.  
  506.         //boenje 6
  507.         for(int i=brojnakocki*brojnakocki*(0); i<brojnakocki*brojnakocki*(0) + brojnakocki*brojnakocki; i++)
  508.         {
  509.  
  510.  
  511.             niza[i].backs = 1;
  512.         }
  513.  
  514.  
  515.     }
  516.  
  517.     //Funckija za rotacija na matrica za 90 stepeni
  518.     void cyclic_roll(int &a, int &b, int &c, int &d)
  519.     {
  520.         int temp = a;
  521.         a = b;
  522.         b = c;
  523.         c = d;
  524.         d = temp;
  525.     }
  526.  
  527.     //Zamena na boite na stranite na kockite sto bile rotirani
  528.     void smeniindeksi()
  529.     {
  530.         Cube2 *tmpn;
  531.         tmpn = new Cube2[n*n*n];
  532.  
  533.         for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i++)
  534.         {
  535.             tmpn[i] = niza[i];
  536.             tmpn[i].setRotation(0,0,0);
  537.         }
  538.  
  539.         for(int i=0; i<brojnakocki; i++)
  540.         {
  541.             for(int j=0; j<brojnakocki; j++)
  542.             {
  543.                 cout<<"na mesto na "<<niza[matrica[i][j]].z<<" doagja "<<niza[novamatrica[i][j]].z<<endl;
  544.                 tmpn[matrica[i][j]].backs = niza[novamatrica[i][j]].backs;
  545.                 tmpn[matrica[i][j]].tops = niza[novamatrica[i][j]].tops;
  546.                 tmpn[matrica[i][j]].bottoms = niza[novamatrica[i][j]].bottoms;
  547.                 tmpn[matrica[i][j]].lefts = niza[novamatrica[i][j]].lefts;
  548.                 tmpn[matrica[i][j]].rights = niza[novamatrica[i][j]].rights;
  549.                 tmpn[matrica[i][j]].fronts = niza[novamatrica[i][j]].fronts;
  550.  
  551.             }
  552.         }
  553.         niza = tmpn;
  554.  
  555.     }
  556.  
  557.     //meh
  558.     void napravimatrica()
  559.     {
  560.         matrica = new int*[brojnakocki];
  561.         for(int i=0; i<brojnakocki; i++)
  562.         {
  563.             matrica[i] = new int[brojnakocki];
  564.         }
  565.         mbroji = mbrojj = 0;
  566.     }
  567.  
  568.     //meh
  569.     void punimatrica(int broj)
  570.     {
  571.         if(mbrojj==brojnakocki)
  572.         {
  573.             mbrojj=0;
  574.             mbroji++;
  575.         }
  576.  
  577.         matrica[mbroji][mbrojj] = broj;
  578.  
  579.         mbrojj++;
  580.     }
  581.  
  582.     //meh
  583.     void izbrisimatrica()
  584.     {
  585.         delete [] matrica;
  586.         delete [] novamatrica;
  587.     }
  588.  
  589.     //debug
  590.     void printajmatrica()
  591.     {
  592.         for(int i=0; i<brojnakocki; i++)
  593.         {
  594.             for(int j=0; j<brojnakocki; j++)
  595.             {
  596.                 cout<<novamatrica[i][j];
  597.                 cout<<" ";
  598.             }
  599.             cout<<endl;
  600.         }
  601.     }
  602.  
  603.     //Zemanje na matrica od indeksi na kocki sto treba da se rotiraat, i nejnino ciklicno rotiranje
  604.     void rotirajmatica(int br)
  605.     {
  606.         if(selo==1)  // ako e Y oska, smeni gi redicite vo matricata
  607.         {
  608.             int** tmpm = new int*[brojnakocki];
  609.             for(int i=0; i<brojnakocki; i++)
  610.             {
  611.                 tmpm[i] = new int[brojnakocki];
  612.             }
  613.  
  614.             for(int i=brojnakocki-1; i>=0; i--)
  615.             {
  616.                 for(int j=0; j<brojnakocki; j++)
  617.                 {
  618.                     tmpm[i][j] = matrica[brojnakocki-i-1][j];
  619.                 }
  620.             }
  621.  
  622.             matrica = tmpm;
  623.  
  624.         }
  625.         else if(selo==2)
  626.         {
  627.             //Ako e Z oska, transponiraj ja matricata
  628.             int** tmpm = new int*[brojnakocki];
  629.             for(int i=0; i<brojnakocki; i++)
  630.             {
  631.                 tmpm[i] = new int[brojnakocki];
  632.             }
  633.  
  634.             for(int i=0; i<brojnakocki; i++)
  635.             {
  636.                 for(int j=0; j<brojnakocki; j++)
  637.                 {
  638.                     tmpm[i][j] = matrica[j][i];
  639.                 }
  640.             }
  641.  
  642.             matrica = tmpm;
  643.         }
  644.         //Ako e X oska, ne pipaj nisto
  645.  
  646.         novamatrica = new int*[brojnakocki];
  647.         for(int i=0; i<brojnakocki; i++)
  648.         {
  649.             novamatrica[i] = new int[brojnakocki];
  650.         }
  651.  
  652.         for(int i=0; i<brojnakocki; i++)
  653.         {
  654.             for(int j=0; j<brojnakocki; j++)
  655.             {
  656.                 novamatrica[i][j] = matrica[i][j];
  657.             }
  658.         }
  659.  
  660.         for(int z=0; z<br; z++)
  661.         {
  662.             for(int i=0; i<n/2; i++)
  663.                 for(int j=0; j<(n+1)/2; j++)
  664.                     cyclic_roll(novamatrica[i][j], novamatrica[n-1-j][i], novamatrica[n-1-i][n-1-j], novamatrica[j][n-1-i]);
  665.         }
  666.  
  667.  
  668.         smeniindeksi();
  669.         cout<<"povikav"<<endl;
  670.     }
  671.  
  672.     //Presmetuvanje na koordinati na kocki, se povikuva na refresh samo
  673.     void opraviKocki()
  674.     {
  675.         brojac=0;
  676.         if(napravena)
  677.         {
  678.             delete [] niza;
  679.         }
  680.         else napravena=true;
  681.         this->n = brojnakocki;
  682.         niza = new Cube2[n*n*n];
  683.  
  684.  
  685.  
  686.         float tprostor = (-1) * (n/2) * prostor;
  687.         float vprostor = (-1) * (n/2) * prostor;
  688.         float zprostor = (-1) * (n/2) * prostor;
  689.  
  690.         if(n%2==0)
  691.         {
  692.             parnost = 0.505;
  693.         }
  694.  
  695.         for(int z = 0; z<n; z++)
  696.         {
  697.             if(z<(n/2))
  698.             {
  699.                 onamu = z - (n/2);
  700.             }
  701.             else if(z==(n/2))
  702.             {
  703.                 onamu = 0;
  704.             }
  705.             else
  706.             {
  707.                 onamu = z - (n/2);
  708.             }
  709.  
  710.             for(int j = 0; j<n; j++)
  711.             {
  712.                 if(j<(n/2))
  713.                 {
  714.                     tamu = j - (n/2);
  715.                 }
  716.                 else if(j==(n/2))
  717.                 {
  718.                     tamu = 0;
  719.                 }
  720.                 else
  721.                 {
  722.                     tamu = j - (n/2);
  723.                 }
  724.  
  725.                 for(int i = 0; i<n; i++)
  726.                 {
  727.                     //presmetka za lokacija
  728.                     if(i<(n/2))
  729.                     {
  730.                         vamu = i - (n/2);
  731.                     }
  732.                     else if(i==(n/2))
  733.                     {
  734.                         vamu = 0;
  735.                     }
  736.                     else
  737.                     {
  738.                         vamu = i - (n/2);
  739.                     }
  740.  
  741.                     niza[brojac].setRotation(0,0,0);
  742.                     niza[brojac].setCube(parnost+vamu+tprostor-0.5,-0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
  743.                                          parnost+vamu+tprostor+0.5,-0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
  744.                                          parnost+vamu+tprostor+0.5,-0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
  745.                                          parnost+vamu+tprostor-0.5,-0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
  746.                                          parnost+vamu+tprostor-0.5,0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
  747.                                          parnost+vamu+tprostor+0.5,0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
  748.                                          parnost+vamu+tprostor+0.5,0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
  749.                                          parnost+vamu+tprostor-0.5,0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor);
  750.                     niza[brojac].z = brojac;
  751.  
  752.                     brojac++;
  753.                     tprostor += prostor;
  754.  
  755.                 }
  756.                 vprostor += prostor;
  757.                 tprostor = (-1) * (n/2) * prostor;
  758.             }
  759.             zprostor += prostor;
  760.             vprostor = (-1) * (n/2) * prostor;
  761.         }
  762.         colorCube();
  763.     }
  764.  
  765.     //Iscrtuvanje na selektorot
  766.     void drawSelector()
  767.     {
  768.         float x1 = selx, y1 = sely, z1 = selz;
  769.         glEnable(GL_BLEND);
  770.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  771.         glColor4f(1,1,1,0.8);
  772.         if(selo==1)
  773.         {
  774.             glBegin(GL_POLYGON);
  775.  
  776.             glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1-1-brojnakocki/2*prostor-brojnakocki/2);
  777.  
  778.             if(brojnakocki%2==1)
  779.                 glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1, z1-1-brojnakocki/2*prostor-brojnakocki/2);
  780.             else
  781.                 glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1, z1-1-(brojnakocki/2)*prostor-brojnakocki/2);
  782.  
  783.             if(brojnakocki%2==1)
  784.                 glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1, z1+1+brojnakocki/2*prostor+brojnakocki/2);
  785.             else
  786.                 glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
  787.  
  788.             if(brojnakocki%2==1)
  789.                 glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1+1+brojnakocki/2*prostor+brojnakocki/2);
  790.             else
  791.                 glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
  792.  
  793.             glEnd();
  794.         }
  795.         else if(selo==2)
  796.         {
  797.             glBegin(GL_POLYGON);
  798.             glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1-1-brojnakocki/2*prostor-brojnakocki/2);
  799.  
  800.             if(brojnakocki%2==1)
  801.                 glVertex3f(x1, y1+1+brojnakocki/2*prostor + brojnakocki/2, z1-1-brojnakocki/2*prostor-brojnakocki/2);
  802.             else
  803.                 glVertex3f(x1, y1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, z1-1-(brojnakocki/2)*prostor-brojnakocki/2);
  804.  
  805.             if(brojnakocki%2==1)
  806.                 glVertex3f(x1, y1+1+brojnakocki/2*prostor + brojnakocki/2, z1+1+brojnakocki/2*prostor+brojnakocki/2);
  807.             else
  808.                 glVertex3f(x1, y1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
  809.  
  810.             if(brojnakocki%2==1)
  811.                 glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1+1+brojnakocki/2*prostor+brojnakocki/2);
  812.             else
  813.                 glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
  814.  
  815.             glEnd();
  816.         }
  817.         else
  818.         {
  819.             glBegin(GL_POLYGON);
  820.             glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1-1-brojnakocki/2*prostor-brojnakocki/2, z1);
  821.  
  822.             if(brojnakocki%2==1)
  823.                 glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1-1-brojnakocki/2*prostor-brojnakocki/2, z1);
  824.             else
  825.                 glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1-1-(brojnakocki/2)*prostor-brojnakocki/2, z1);
  826.  
  827.             if(brojnakocki%2==1)
  828.                 glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1+1+brojnakocki/2*prostor+brojnakocki/2, z1);
  829.             else
  830.                 glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2, z1);
  831.  
  832.             if(brojnakocki%2==1)
  833.                 glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1+1+brojnakocki/2*prostor+brojnakocki/2, z1);
  834.             else
  835.                 glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2, z1);
  836.  
  837.             glEnd();
  838.  
  839.         }
  840.     }
  841. };
  842.  
  843. BigCube *kocka;
  844.  
  845. //Represmetka na selektorot spored lokacija
  846. void srediSelektor()
  847. {
  848.     selx = 0;
  849.     sely = 0;
  850.     selz = 0;
  851.     if(selo==1)
  852.     {
  853.         if(brojnakocki%2==0)
  854.         {
  855.             sely += (0.5);
  856.         }
  857.     }
  858.     else if(selo==2)
  859.     {
  860.         if(brojnakocki%2==0)
  861.         {
  862.             selx += (0.5);
  863.         }
  864.     }
  865.     else
  866.     {
  867.         if(brojnakocki%2==0)
  868.         {
  869.             selz += (0.5);
  870.         }
  871.     }
  872.     if(brojnakocki%2==1)
  873.         selpoz = (brojnakocki/2)+1;
  874.     else selpoz = brojnakocki/2+1;
  875.  
  876. }
  877.  
  878. void display()
  879. {
  880.     glMatrixMode(GL_MODELVIEW);
  881.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  882.     glLoadIdentity();
  883.     //Za rotacija
  884.     glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  885.     glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
  886.     for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i++)
  887.     {
  888.         kocka->niza[i].drawCube();
  889.     }
  890.     kocka->drawSelector();
  891.  
  892.     glFlush();
  893.     glutSwapBuffers();
  894.  
  895.  
  896. }
  897.  
  898. void specialKeys( int key, int x, int y )
  899. {
  900.     //Rotacija na golema kocka
  901.     if (key == GLUT_KEY_RIGHT)
  902.         rotate_y += 5;
  903.     else if (key == GLUT_KEY_LEFT)
  904.         rotate_y -= 5;
  905.  
  906.     else if (key == GLUT_KEY_UP)
  907.         rotate_x += 5;
  908.  
  909.     else if (key == GLUT_KEY_DOWN)
  910.         rotate_x -= 5;
  911.     //Zoom
  912.     else if (key==GLUT_KEY_PAGE_DOWN)
  913.     {
  914.         zoom++;
  915.         glMatrixMode(GL_PROJECTION);
  916.         glLoadIdentity();
  917.         glRotatef(180, 0, 0, 1);
  918.         glOrtho((-1)*zoom, zoom, (-1) * zoom, zoom, -15.0, 15.0);
  919.         glMatrixMode(GL_MODELVIEW);
  920.         glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  921.         glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
  922.  
  923.     }
  924.     //Odzoom
  925.     else if (key==GLUT_KEY_PAGE_UP)
  926.     {
  927.         zoom--;
  928.         glMatrixMode(GL_PROJECTION);
  929.         glLoadIdentity();
  930.         glRotatef(180, 0, 0, 1);
  931.         glOrtho((-1)*zoom, zoom, (-1) * zoom, zoom, -15.0, 15.0);
  932.         glMatrixMode(GL_MODELVIEW);
  933.         glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  934.         glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
  935.  
  936.     }
  937.  
  938.     //Osvezuvanje
  939.     glutPostRedisplay();
  940.  
  941. }
  942. void processNormalKeys(unsigned char key, int x, int y)
  943. {
  944.     //Escape - exit
  945.     if (key == 27)
  946.         exit(0);
  947.  
  948.     //Smena broj na kocki
  949.     else if (key>='3' && key<='9')
  950.     {
  951.         brojnakocki=(int) key-48;
  952.         srediSelektor();
  953.         kocka = new BigCube();
  954.     }
  955.     //Prostor++
  956.     else if (key=='+'  && prostor<0.9)
  957.     {
  958.         prostor += 0.1;
  959.         srediSelektor();
  960.         kocka = new BigCube();
  961.     }
  962.     //Prostor--
  963.     else if (key=='-'  && prostor>0.2)
  964.     {
  965.         prostor -= 0.1;
  966.         srediSelektor();
  967.         kocka = new BigCube();
  968.     }
  969.     //Smena na oskite
  970.     else if (key=='x' || key=='y' || key=='z')
  971.     {
  972.         if(key=='x')
  973.             selo=3;
  974.         else if(key=='y')
  975.             selo=1;
  976.         else if (key=='z')
  977.             selo=2;
  978.         srediSelektor();
  979.     }
  980.     //Dvizenje na selektorot po oska
  981.     else if(key=='/')
  982.     {
  983.         bool smena = false;
  984.  
  985.         if((selpoz == brojnakocki && brojnakocki%2==1) || (selpoz== brojnakocki && brojnakocki%2==0))
  986.         {
  987.             if(selo==1)
  988.             {
  989.                 sely-=brojnakocki-1 + (brojnakocki-1)*prostor;
  990.             }
  991.             else if(selo==2)
  992.             {
  993.                 selx-=brojnakocki-1 + (brojnakocki-1)*prostor;
  994.             }
  995.             else
  996.             {
  997.                 selz-=brojnakocki-1 + (brojnakocki-1)*prostor;
  998.             }
  999.             selpoz=1;
  1000.             smena = true;
  1001.         }
  1002.         else
  1003.         {
  1004.             selpoz++;
  1005.         }
  1006.  
  1007.         if(!smena)
  1008.         {
  1009.             if(selo==1)
  1010.             {
  1011.                 sely += (1+prostor);
  1012.             }
  1013.             else if(selo==2)
  1014.             {
  1015.                 selx += (1+prostor);
  1016.             }
  1017.             else
  1018.             {
  1019.                 selz += (1+prostor);
  1020.             }
  1021.         }
  1022.  
  1023.         smena=false;
  1024.     }
  1025.     //Rotacija na edna strana
  1026.     else if(key==',')
  1027.  
  1028.     {
  1029.         kocka->napravimatrica();
  1030.         int pluz = (selpoz-1)*brojnakocki;
  1031.         if(selo==1)
  1032.         {
  1033.             //Rotiraj po Y oska vo desno
  1034.             bool napuneta = false;
  1035.             for(int br=0; br<90; br++)
  1036.             {
  1037.                 for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  1038.                 {
  1039.  
  1040.                     for(int j=i; j<(i+brojnakocki); j++)
  1041.                     {
  1042.                         if(!napuneta) kocka->punimatrica(j+pluz);
  1043.                         kocka->niza[j+pluz].setRotation(kocka->niza[j+pluz].rotx,kocka->niza[j+pluz].roty+1, kocka->niza[j+pluz].rotz);
  1044.                     }
  1045.                 }
  1046.                 display();
  1047.                 Sleep(1);
  1048.                 napuneta = true;
  1049.             }
  1050.             kocka->rotirajmatica(1);
  1051.             for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  1052.             {
  1053.  
  1054.                 for(int j=i; j<(i+brojnakocki); j++)
  1055.                 {
  1056.                     kocka->niza[j+pluz].setRotation(0,0,0);
  1057.                     kocka->niza[j+pluz].rotLeft();
  1058.                 }
  1059.             }
  1060.         }
  1061.         else if(selo==2)
  1062.         {
  1063.             //Rotiraj po Z oska vo levo, odnosno 3 vo desno
  1064.             bool napuneta = false;
  1065.             for(int br=0; br<90; br++)
  1066.             {
  1067.                 for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  1068.                 {
  1069.                     if(!napuneta) kocka->punimatrica(i);
  1070.                     kocka->niza[i].setRotation(kocka->niza[i].rotx+1,kocka->niza[i].roty,kocka->niza[i].rotz);
  1071.  
  1072.                 }
  1073.                 display();
  1074.                 Sleep(1);
  1075.                 napuneta = true;
  1076.             }
  1077.             kocka->rotirajmatica(3);
  1078.             for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  1079.             {
  1080.                 kocka->niza[i].setRotation(0,0,0);
  1081.                 kocka->niza[i].rotBack();
  1082.  
  1083.             }
  1084.         }
  1085.         else
  1086.         {
  1087.             //Rotiraj po X oska vo desno
  1088.             bool napuneta = false;
  1089.             for(int br=0; br<90; br++)
  1090.             {
  1091.                 for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
  1092.                 {
  1093.  
  1094.                     if(!napuneta) kocka->punimatrica(i);
  1095.                     kocka->niza[i].setRotation(kocka->niza[i].rotx,kocka->niza[i].roty,kocka->niza[i].rotz+1);
  1096.  
  1097.                 }
  1098.                 display();
  1099.                 Sleep(1);
  1100.                 napuneta = true;
  1101.             }
  1102.             kocka->rotirajmatica(1);
  1103.  
  1104.             for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
  1105.             {
  1106.                 kocka->niza[i].setRotation(0,0,0);
  1107.                 kocka->niza[i].rotSideLeft();
  1108.  
  1109.             }
  1110.         }
  1111.     }
  1112.     //Rotacija na druga strana
  1113.     else if(key=='.')
  1114.     {
  1115.         //Rotiraj po Y oska vo levo, te. 3 pati vo desno
  1116.         kocka->napravimatrica();
  1117.  
  1118.         int pluz = (selpoz-1)*brojnakocki;
  1119.         if(selo==1)
  1120.         {
  1121.             bool napuneta = false;
  1122.             for(int br=0; br<90; br++)
  1123.             {
  1124.                 for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  1125.                 {
  1126.                     for(int j=i; j<(i+brojnakocki); j++)
  1127.                     {
  1128.                         if(!napuneta) kocka->punimatrica(j+pluz);
  1129.                         kocka->niza[j+pluz].setRotation(kocka->niza[j+pluz].rotx,kocka->niza[j+pluz].roty-1, kocka->niza[j+pluz].rotz);
  1130.  
  1131.                     }
  1132.  
  1133.                 }
  1134.                 display();
  1135.                 Sleep(1);
  1136.                 napuneta = true;
  1137.             }
  1138.             kocka->rotirajmatica(3);
  1139.             for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
  1140.             {
  1141.                 for(int j=i; j<(i+brojnakocki); j++)
  1142.                 {
  1143.                     kocka->niza[j+pluz].setRotation(0,0,0);
  1144.                     kocka->niza[j+pluz].rotRight();
  1145.                 }
  1146.  
  1147.             }
  1148.         }
  1149.         else if(selo==2)
  1150.         {
  1151.             //Rotiraj po Z oska vo desno
  1152.             bool napuneta = false;
  1153.             for(int br=0; br<90; br++)
  1154.             {
  1155.                 for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  1156.                 {
  1157.                     if(!napuneta) kocka->punimatrica(i);
  1158.                     kocka->niza[i].setRotation(kocka->niza[i].rotx-1,kocka->niza[i].roty,kocka->niza[i].rotz);
  1159.  
  1160.                 }
  1161.                 display();
  1162.                 Sleep(1);
  1163.                 napuneta = true;
  1164.             }
  1165.             kocka->rotirajmatica(1);
  1166.             for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
  1167.             {
  1168.                 kocka->niza[i].setRotation(0,0,0);
  1169.                 kocka->niza[i].rotFwd();
  1170.  
  1171.             }
  1172.         }
  1173.         else
  1174.         {
  1175.             //rotiraj po X oska vo levo, t.e. 3 pati vo desno
  1176.             bool napuneta = false;
  1177.             for(int br=0; br<90; br++)
  1178.             {
  1179.  
  1180.                 for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
  1181.                 {
  1182.                     if(!napuneta) kocka->punimatrica(i);
  1183.  
  1184.                     kocka->niza[i].setRotation(kocka->niza[i].rotx,kocka->niza[i].roty,kocka->niza[i].rotz-1);
  1185.  
  1186.                 }
  1187.                 display();
  1188.                 Sleep(1);
  1189.                 napuneta = true;
  1190.             }
  1191.             kocka->rotirajmatica(3);
  1192.             for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
  1193.             {
  1194.                 kocka->niza[i].setRotation(0,0,0);
  1195.                 kocka->niza[i].rotSideRight();
  1196.  
  1197.             }
  1198.  
  1199.         }
  1200.     }
  1201.     //Extra option, resetiranje na kockata
  1202.     else if(key=='r')
  1203.     {
  1204.         //Reset
  1205.         rotate_y=135;
  1206.         rotate_x=-45;
  1207.         prostor = 0.1;
  1208.         brojnakocki = 3;
  1209.         selo=1;
  1210.         selpoz=2;
  1211.         zoom = 10;
  1212.         kocka = new BigCube();
  1213.         srediSelektor();
  1214.         kocka->colorCube();
  1215.         glMatrixMode(GL_PROJECTION);
  1216.         glLoadIdentity();
  1217.         glOrtho(-10.0, 10.0, -10.0, 10.0, -15.0, 15.0);
  1218.         glRotatef(180, 0, 0, 1);
  1219.         glMatrixMode(GL_MODELVIEW);
  1220.     }
  1221.  
  1222.  
  1223.  
  1224.  
  1225.     glutPostRedisplay();
  1226. }
  1227. int main(int argc, char* argv[])
  1228. {
  1229.     glutInit(&argc,argv);
  1230.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  1231.     glutInitWindowSize (1000,1000);
  1232.     glutCreateWindow("Rubiks - Gordz");
  1233.     glEnable(GL_DEPTH_TEST);
  1234.     glClearColor (0.0, 0.0, 0.0, 0.0);
  1235.     glMatrixMode(GL_PROJECTION);
  1236.     glLoadIdentity();
  1237.     glOrtho(-10.0, 10.0, -10.0, 10.0, -15.0, 15.0);
  1238.     glRotatef(180, 0, 0, 1);
  1239.     if(!napravena)
  1240.     {
  1241.         kocka = new BigCube();
  1242.         napravena = true;
  1243.     }
  1244.     int n = brojnakocki;
  1245.     glutDisplayFunc(display);
  1246.     glutSpecialFunc(specialKeys);
  1247.     glutKeyboardFunc(processNormalKeys);
  1248.  
  1249.     glutMainLoop();
  1250.     delete kocka;
  1251.     return 0;
  1252.  
  1253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement