Advertisement
Guest User

Operacja "Mennica"

a guest
Oct 14th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.14 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class Point {
  7. public:
  8.         float x, y, z;
  9. };
  10.  
  11. class Node {
  12. public:
  13.     Point start, end;
  14.     bool is_inside;
  15.     Node *leaf[8];
  16. };
  17.  
  18. int counter = 1;
  19. int divisions_number = 0;
  20.  
  21. // Wczytanie danych
  22. void Space_input(Node trunk)
  23. {
  24.     cout << "Wczytywanie danych przestrzeni, podaj wsp poczatku: ";
  25.     cin >> trunk.start.x >> trunk.start.y >> trunk.start.z;
  26.     cout << "Wczytywanie danych przestrzeni, podaj wsp konca: ";
  27.     cin >> trunk.end.x >> trunk.end.y >> trunk.end.z;
  28. }
  29.  
  30. void Object_input(Node object)
  31. {
  32.     cout << "Wczytywanie danych obiektu, podaj wsp poczatku: ";
  33.     cin >> object.start.x >> object.start.y >> object.start.z;
  34.     cout << "Wczytywanie danych obiektu, podaj wsp konca: ";
  35.     cin >> object.end.x >> object.end.y >> object.end.z;
  36. }
  37.  
  38. // Wyswietlanie wpisanych wartosci
  39. void First_screen(Node &trunk, Node &object)
  40. {
  41.     cout << "MATRIX v1.1" << endl << endl;
  42.     cout << "Obiekt" << endl;
  43.     cout << "Wspolrzedne:" << " X " << object.end.x << " Y " << object.end.y << " Z " << object.end.z << endl << endl;
  44.     cout << endl << "Przestrzen" << endl;
  45.     cout << "Wspolrzedne:" << " X " << trunk.end.x << " Y " << trunk.end.y << " Z " << trunk.end.z << endl << endl;
  46. }
  47.  
  48. // Funkcja od wciec w wyswietlaniu drzewa
  49. void T_cout(int t_counter)
  50. {
  51.     for (int i = 0; i < t_counter; i++)
  52.     {
  53.         cout << "\t";
  54.     }
  55. }
  56.  
  57. void Check(Node &leaf, Node object, int leaf_number, int pktX, int pktY, int pktZ)
  58. {
  59.     leaf.is_inside = 0;
  60.     //W zależności od nr liścia, sprawdzamy różne warunki współrzędnych
  61.     switch (leaf_number)
  62.     {
  63.     case 0:
  64.         if (object.start.x < pktX && object.start.y < pktY && object.start.z < pktZ)leaf.is_inside = true;
  65.         break;
  66.     case 1:
  67.         if (object.end.x > pktX && object.start.y < pktY && object.start.z < pktZ)leaf.is_inside = true;
  68.         break;
  69.     case 2:
  70.         if (object.end.x > pktX && object.start.y < pktY && object.end.z > pktZ)leaf.is_inside = true;
  71.         break;
  72.     case 3:
  73.         if (object.start.x < pktX && object.start.y < pktY && object.end.z > pktZ)leaf.is_inside = true;
  74.         break;
  75.     case 4:
  76.         if (object.start.x < pktX && object.end.y > pktY && object.start.z < pktZ)leaf.is_inside = true;
  77.         break;
  78.     case 5:
  79.         if (object.end.x > pktX && object.end.y > pktY && object.start.z < pktZ)leaf.is_inside = true;
  80.         break;
  81.     case 6:
  82.         if (object.end.x > pktX && object.end.y > pktY && object.end.z > pktZ)leaf.is_inside = true;
  83.         break;
  84.     case 7:
  85.         if (object.start.x < pktX && object.end.y > pktY && object.end.z > pktZ)leaf.is_inside = true;
  86.         break;
  87.     }
  88. }
  89.  
  90. void Division(Node &branch, Node object, int pktX, int pktY, int pktZ, int gen, int &t_counter)
  91. {
  92.     divisions_number++;
  93.  
  94.     for (int leaf_number = 0; leaf_number < 8; leaf_number++)
  95.     {
  96.         branch.leaf[leaf_number] = new Node;
  97.         branch.leaf[leaf_number]->is_inside = 0;
  98.  
  99.         cout << endl;
  100.         T_cout(t_counter);
  101.         cout << "Nr liscia: " << leaf_number << endl;
  102.         T_cout(t_counter);
  103.         cout << "Wspolrzedne konca: X " << pktX << " Y " << pktY << " Z " << pktZ << endl;
  104.        
  105.  
  106.         Check(*branch.leaf[leaf_number], object, leaf_number, pktX, pktY, pktZ);
  107.         if (branch.leaf[leaf_number]->is_inside)
  108.         {
  109.             T_cout(t_counter);
  110.             cout << "Obiekt w obszarze, aktualny licznik: " << counter << endl;
  111.             t_counter++;
  112.             counter++;
  113.             if (gen >= 2)
  114.             {
  115.                 switch (leaf_number)
  116.                 {
  117.                 case 0:
  118.                     Division(*branch.leaf[leaf_number], object, pktX - gen / 2, pktY - gen / 2, pktZ - gen / 2, gen / 2, t_counter);
  119.                     break;
  120.                 case 1:
  121.                     Division(*branch.leaf[leaf_number], object, pktX + gen / 2, pktY - gen / 2, pktZ - gen / 2, gen / 2, t_counter);
  122.                     break;
  123.                 case 2:
  124.                     Division(*branch.leaf[leaf_number], object, pktX + gen / 2, pktY - gen / 2, pktZ + gen / 2, gen / 2, t_counter);
  125.                     break;
  126.                 case 3:
  127.                     Division(*branch.leaf[leaf_number], object, pktX - gen / 2, pktY - gen / 2, pktZ + gen / 2, gen / 2, t_counter);
  128.                     break;
  129.                 case 4:
  130.                     Division(*branch.leaf[leaf_number], object, pktX - gen / 2, pktY + gen / 2, pktZ - gen / 2, gen / 2, t_counter);
  131.                     break;
  132.                 case 5:
  133.                     Division(*branch.leaf[leaf_number], object, pktX + gen / 2, pktY + gen / 2, pktZ - gen / 2, gen / 2, t_counter);
  134.                     break;
  135.                 case 6:
  136.                     Division(*branch.leaf[leaf_number], object, pktX + gen / 2, pktY + gen / 2, pktZ + gen / 2, gen / 2, t_counter);
  137.                     break;
  138.                 case 7:
  139.                     Division(*branch.leaf[leaf_number], object, pktX - gen / 2, pktY + gen / 2, pktZ + gen / 2, gen / 2, t_counter);
  140.                     break;
  141.                 }
  142.             }
  143.             else t_counter = 1;
  144.         }
  145.         else
  146.         {
  147.             t_counter = 1;
  148.             counter++;
  149.         }
  150.     }
  151. }
  152.  
  153. int main()
  154. {
  155.     Node trunk, object;
  156.  
  157.     // Dziala dla wielokrotnosci 2 i szescianow
  158.     trunk.start.x = trunk.start.y = trunk.start.z = 0;
  159.     trunk.end.x = trunk.end.y = trunk.end.z = 8;
  160.     object.start.x = object.start.y = object.start.z = 0;
  161.     object.end.x = object.end.y = object.end.z = 1;
  162.  
  163.     //Space_input(trunk);
  164.     //Object_input(object);
  165.  
  166.     int start_point = (trunk.end.x - trunk.start.x) / 2;
  167.     int gen = start_point;
  168.     int t_counter = 1;
  169.  
  170.     First_screen(trunk, object);
  171.     Division(trunk, object, start_point, start_point, start_point, gen, t_counter);
  172.  
  173.     cout << endl << "Liczba podzialow: " << divisions_number << endl;
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement