Advertisement
Aslai

Untitled

Sep 19th, 2011
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. struct __verlet_node__{
  2.     double __x, __y, __z, __xp, __yp, __zp, __mass, __damp, __grav;
  3.     __verlet_node__()
  4.     {
  5.         __x = 0; __y = 0; __z = 0; __xp = __x; __yp = __y; __zp = __z;
  6.         __mass = 1; __damp = 1; __grav = .1;
  7.     }
  8.     __verlet_node__( double x, double y, double z, double mass = 1, double damp = 1 )
  9.     {
  10.         __x = x; __y = y; __z = z; __xp = __x; __yp = __y; __zp = __z;
  11.         __mass = mass; __damp = damp; __grav = .1;
  12.     }
  13.     __verlet_node__( double mass, double damp = 1 )
  14.     {
  15.         __x = 0; __y = 0; __z = 0; __xp = __x; __yp = __y; __zp = __z;
  16.         __mass = mass; __damp = damp; __grav = .1;
  17.     }
  18.     void move()
  19.     {
  20.         double xp2 = __x, yp2 = __y, zp2 = __z;
  21.         __x += ( __x - __xp ) * __damp * (1 - 1 / (__mass+50));
  22.         __y += ( __y - __yp ) * __damp * (1 - 1 / (__mass+50));
  23.         __z += ( __z - __zp ) * __damp * (1 - 1 / (__mass+50)) + __grav;
  24.         __xp = xp2; __yp = yp2; __zp = zp2;
  25.     }
  26.     void moveTo( double x, double y, double z )
  27.     {
  28.         __x = x;
  29.         __y = y;
  30.         __z = z;
  31.     }
  32.     void moveRel( double x, double y, double z )
  33.     {
  34.         __x += x;
  35.         __y += y;
  36.         __z += z;
  37.     }
  38.     void moveDir( double latDir, double vertDir, double distance )
  39.     {
  40.         __x += cos( latDir ) * cos( vertDir );
  41.         __y += sin( latDir ) * cos( vertDir );
  42.         __z += sin( vertDir );
  43.     }
  44. };
  45. struct __verlet_constraint__{
  46.     struct __verlet_node__ *n1;
  47.     struct __verlet_node__ *n2;
  48.     double __len;
  49.     int __ret_time;
  50.     __verlet_constraint__( struct __verlet_node__ *_n1, struct __verlet_node__ *_n2 )
  51.     {
  52.         n1 = _n1;
  53.         n2 = _n2;
  54.         __ret_time = 1;
  55.         double dx = n2->__x - n1->__x;
  56.         double dy = n2->__y - n1->__y;
  57.         double dz = n2->__z - n1->__z;
  58.         __len = sqrt( dx*dx+dy*dy+dz*dz );
  59.     }
  60.     __verlet_constraint__( struct __verlet_node__ *_n1, struct __verlet_node__ *_n2, double len )
  61.     {
  62.         n1 = _n1;
  63.         n2 = _n2;
  64.         __ret_time = 1;
  65.         __len = len;
  66.     }
  67.  
  68.     void satisfy()
  69.     {
  70.         double dx = n2->__x - n1->__x;
  71.         double dy = n2->__y - n1->__y;
  72.         double dz = n2->__z - n1->__z;
  73.         double h = sqrt( dx*dx+dy*dy+dz*dz);
  74.         double scale = (__len - h) / h;
  75.         double massRatio1 = n2->__mass / (n1->__mass+n2->__mass);
  76.         double massRatio2 = n1->__mass / (n1->__mass+n2->__mass);
  77.  
  78.         n1->moveRel( -( dx * scale ) / __ret_time * massRatio1, -( dy * scale ) / __ret_time * massRatio1, -( dz * scale ) / __ret_time * massRatio1 );
  79.         n2->moveRel(  ( dx * scale ) / __ret_time * massRatio2,  ( dy * scale ) / __ret_time * massRatio2,  ( dz * scale ) / __ret_time * massRatio2 );
  80.     }
  81. };
  82.  
  83.  
  84. typedef struct __verlet_constraint__ CONSTRAINT;
  85. typedef struct __verlet_node__ NODE;
  86.  
  87.  
  88. std::vector<NODE*> Nodes;
  89. std::vector<CONSTRAINT*> Cons;
  90.  
  91. NODE* new_node( double x, double y, double z, double mass = 1, double damp = 1 )
  92. {
  93.     NODE* a = new NODE( x, y, z, mass, damp );
  94.     Nodes.push_back( a );
  95.     return a;
  96. }
  97. CONSTRAINT* constrain( NODE* n1, NODE* n2 )
  98. {
  99.     CONSTRAINT* a = new CONSTRAINT( n1, n2 );
  100.     Cons.push_back( a );
  101.     return a;
  102. }
  103. CONSTRAINT* constrain( NODE* n1, NODE* n2, double len )
  104. {
  105.     CONSTRAINT* a = new CONSTRAINT( n1, n2, len );
  106.     Cons.push_back( a );
  107.     return a;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement