Advertisement
Kaelygon

obscure n-dimensional program

Feb 4th, 2022 (edited)
1,265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.73 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <vector>
  6. #include <cmath>
  7. #include <typeinfo>
  8.  
  9. using namespace std;
  10.  
  11.  
  12. class polytope{ //base
  13.     public:
  14.         vector<polytope> e; //elements
  15.         int dim; //dimension, not required for elements
  16.  
  17.         //each polytope has [dim+1]-dimensional normal and position. I.e. edge is 1-dimensional but it has 2-dimensional vector and position  
  18.         vector<double> nor; //normal, n-vector
  19.         vector<double> pos; //position
  20.  
  21.         vector<int> set; //sub-set of n-1 polytopes inside this polytope
  22.  
  23.         double length(){
  24.             double m=0;
  25.             for(int i=0;i<nor.size();i++ ){
  26.                 m+=nor[i]*nor[i];
  27.             }
  28.             return sqrt(m);
  29.         }
  30.        
  31.         void normalize(){
  32.             double m=length();
  33.             if(m!=0){
  34.                 for(int i=0;i<nor.size();i++ ){
  35.                     nor[i]/=m;
  36.                 }
  37.             }else if(m==0){//length 0
  38.                 nor[0]=1;
  39.                 for(int i=1;i<nor.size();i++ ){
  40.                     nor[i]=0;
  41.                 }
  42.             }
  43.         }
  44.  
  45.         void echoInfo( int vdecimals = 2 ){
  46.             cout << setprecision(vdecimals) << fixed;
  47.             //base
  48.                 if(dim || dim==0 ){
  49.                     cout << "\nDim: " << dim << "\n";
  50.                 }else if( e.size()!=0 ){
  51.                     cout << "\nDim not set!\n";
  52.                 }else{
  53.                     cout << "\nElement info";
  54.                 }
  55.                 if( e.size()!=0 ){
  56.                     cout << "Element count: " << e.size() << "\n";
  57.                 }
  58.  
  59.             //sub-sets
  60.             cout << "BOF Sub-Sets Info\n";
  61.             int h=0;
  62.             for(polytope i : e ){
  63.                 cout << " e[" << h << "]: \n"; h++;
  64.  
  65.                 //set info
  66.                 if( i.set.size() > 0 ){
  67.                     cout << "   sub-set["<<i.set.size()<<"]: [ ";
  68.                     for( int j : i.set ){
  69.                         cout << j << " ";
  70.                     }
  71.                     cout << "]\n";
  72.                 }
  73.  
  74.                 //nor info
  75.                 if( i.nor.size() > 0 ){
  76.                     cout << "   nor["<<i.nor.size()<<"]: [ ";
  77.                     for( double j : i.nor ){
  78.                         cout << j << " ";
  79.                     }
  80.                     cout << "]\n";
  81.                 }
  82.  
  83.                 //pos info
  84.                 if( i.pos.size() > 0 ){
  85.                     cout << "   pos["<<i.pos.size()<<"]: [ ";
  86.                     for( double j : i.pos ){
  87.                         cout << j << " ";
  88.                     }
  89.                     cout << "]\n";
  90.                 }
  91.  
  92.             }
  93.             cout << "EOF Sub-Sets Info\n";
  94.         }
  95.  
  96. };
  97.  
  98.  
  99. //N   pool = current working pool : (polytope sp)
  100. //N-1 pool = Elements in sub-set  : (polytope tp)
  101. //
  102. //reduce N pool to N-1 dimension
  103. //This is done by applying N pool transforms to all elements in N pool.set
  104. polytope redpo( const polytope sp, const polytope tp ){
  105.  
  106.     polytope redu; //reduced pool
  107.     redu.dim=sp.dim-1;
  108.  
  109.     //element count in redu
  110.     int re=-1;
  111.  
  112.     //loop through each sub-set of elements
  113.     for( polytope i : sp.e ) {//elements
  114.         for( int j : i.set ){ //sub-sets
  115.  
  116.             //get sub-set element that N-pool is pointing
  117.             redu.e.push_back( tp.e[j] );
  118.             re++;
  119.  
  120.             if( sp.dim>1 ){//faces and higher
  121.                 //apply nor and pos for each dimension
  122.                 for( int k=0; k<i.nor.size(); k++ ){//apply normal
  123.                     while( redu.e[re].nor.size()-1 < k ){ redu.e[re].nor.push_back(0); } //If value doesn't exist, create it
  124.  
  125.                     //TODO: proper normal combination. Current method merely averages them.
  126.                     redu.e[re].nor[k]+=i.nor[k];
  127.                     redu.e[re].normalize();
  128.  
  129.                 }
  130.                 for( int k=0; k<i.pos.size(); k++ ){//apply position
  131.                     while( redu.e[re].pos.size()-1 < k ){ redu.e[re].pos.push_back(0); } //-||-
  132.                     redu.e[re].pos[k]+=i.pos[k];
  133.                 }
  134.             }else if( sp.dim==1 ){//edges to vertices
  135.                 for( int k=0; k<i.nor.size(); k++ ){//apply normal
  136.                     if(tp.e[j].pos[0]){//if not null
  137.                         while( redu.e[re].pos.size()-1 < k ){ redu.e[re].pos.push_back( tp.e[j].pos[0] ); } //copy vertex position to higher dimensions so it can be applied to n-normals
  138.                     }else{//if pos[0] null
  139.                         while( redu.e[re].pos.size()-1 < k ){ redu.e[re].pos.push_back(0); }
  140.                     }
  141.                     redu.e[re].pos[k]*=i.nor[k];
  142.                 }
  143.                 for( int k=0; k<i.pos.size(); k++ ){//apply pos
  144.                     if(tp.e[j].pos[0]){//if not null
  145.                         while( redu.e[re].pos.size()-1 < k ){ redu.e[re].pos.push_back( tp.e[j].pos[0] ); } //-||-
  146.                     }else{//if pos[0] null
  147.                         while( redu.e[re].pos.size()-1 < k ){ redu.e[re].pos.push_back(0); }
  148.                     }
  149.                     redu.e[re].pos[k]+=i.pos[k];
  150.                 }
  151.             }
  152.  
  153.         }
  154.     }
  155.  
  156.     return redu;
  157.    
  158. }
  159.  
  160. class object{
  161.     public:
  162.     vector<double> pos; //position
  163.     vector<double> nor; //normal
  164.  
  165.     vector<polytope> u; //polytope pools
  166.  
  167. };
  168.  
  169.  
  170. int main(int ac, char** av){
  171.  
  172.     object obj;
  173.  
  174.     //vertex pool
  175.     obj.u.push_back({});
  176.     obj.u[0].dim=0;
  177.  
  178.     //create 2 vertices
  179.     for(int i=0;i<2;i++){
  180.         obj.u[0].e.push_back({});
  181.     }
  182.     obj.u[0].e[0].pos.push_back( 0.0 );
  183.     obj.u[0].e[1].pos.push_back( 1.0 );
  184.    
  185.  
  186.     //edge pool
  187.     obj.u.push_back({});
  188.     obj.u[1].dim=1;
  189.  
  190.     //create 2 edges
  191.     for(int i=0;i<2;i++){
  192.         obj.u[1].e.push_back({});
  193.         obj.u[1].e[i].set.push_back( 0 );
  194.         obj.u[1].e[i].set.push_back( 1 );
  195.     }
  196.  
  197.     //right angle
  198.         //transform edges
  199.        
  200.         //position edge0
  201.         obj.u[1].e[0].pos.push_back( 0.0 );
  202.         obj.u[1].e[0].pos.push_back( 0.0 );
  203.         //vector edge0
  204.         obj.u[1].e[0].nor.push_back( 1.0 );
  205.         obj.u[1].e[0].nor.push_back( 0.0 );
  206.         obj.u[1].e[0].normalize();
  207.  
  208.         //position edge1
  209.         obj.u[1].e[1].pos.push_back( 1.0 );
  210.         obj.u[1].e[1].pos.push_back( 0.0 );
  211.         //vector edge1
  212.         obj.u[1].e[1].nor.push_back( 0.0 );
  213.         obj.u[1].e[1].nor.push_back( 1.0 );
  214.         obj.u[1].e[1].normalize();
  215.  
  216.  
  217.  
  218.  
  219.     //face pool
  220.     obj.u.push_back({});
  221.     obj.u[2].dim=2;
  222.  
  223.     //create face0
  224.     obj.u[2].e.push_back({});
  225.     obj.u[2].e[0].set.push_back( 0 );
  226.     obj.u[2].e[0].set.push_back( 1 );
  227.  
  228.  
  229.  
  230.     //vector face0
  231.     obj.u[2].e[0].nor.push_back( 0.0 );
  232.     obj.u[2].e[0].nor.push_back( 0.0 );
  233.     obj.u[2].e[0].nor.push_back( 1.0 ); //face z+
  234.     obj.u[2].e[0].normalize();
  235.     //position face0
  236.     obj.u[2].e[0].pos.push_back( 0.0 );
  237.     obj.u[2].e[0].pos.push_back( 0.0 );
  238.     obj.u[2].e[0].pos.push_back( 0.0 );
  239.    
  240.  
  241.  
  242.     obj.u[2].echoInfo();
  243.  
  244.     polytope    out = redpo( obj.u[2], obj.u[1] );
  245.     out.dim=1;
  246.     out.echoInfo();
  247.  
  248.                 out = redpo( out, obj.u[0] );
  249.     out.dim=0;
  250.     out.echoInfo();
  251.  
  252. }
  253.  
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement