cCollider.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include <iostream>
  2. #include <assert.h>
  3. #include <cmath>
  4. #include "MyVector3.h"
  5. #include "cCollider.h"
  6. #include "const_def_cPartic.h"
  7. #include <cerrno>
  8. using std::cout;
  9. using std::endl;
  10. using std::abs;
  11. //==============================
  12. /*
  13. cCollider::cCollider (cParticle particle_) {
  14. //m_part [0] = new cParticle;
  15. //m_counter = 0;
  16. //m_time = 0;
  17. }
  18. */
  19. //==============================
  20. cCollider::cCollider (int N_, part_param param_, int pointer_) {
  21. m_counter = 0;
  22. m_part.resize (10);
  23. for (int i = pointer_; i < N_; i++) {
  24. //111111111111111111111111111111111
  25. //m_part [i] = new cParticle (param_.x, param_.y, param_.z, param_.mass, param_.radii, param_.px, param_.py, param_.pz);
  26. //2222222222222222222222222222222
  27. // m_part.push_back (new cParticle (param_.x, param_.y, param_.z, param_.mass, param_.radii, param_.px, param_.py, param_.pz));
  28. //3333333333333333333333333333333
  29. m_part [i] = new cParticle (param_.x, param_.y, param_.z, param_.mass, param_.radii, param_.px, param_.py, param_.pz);
  30. //==============================
  31. m_counter++;
  32. }
  33. m_time = 0;
  34. }
  35. //==============================
  36. cCollider::~cCollider () {
  37. for (int i = 0; i < m_counter; i++) {
  38. if (m_part [i] != NULL) {
  39. delete m_part[i];
  40. }
  41. }
  42. }
  43. //==============================
  44. bool cCollider::show () {
  45. cout << "m_counter" << m_counter; IF_ERROR_SHOW_( m_counter, "m_counter")
  46. cout << "m_time" << m_time; IF_ERROR_SHOW_( m_time, "m_time")
  47. for (int i = 0; i <= m_counter; i++ ) {
  48. m_part [0]->show ();
  49. }
  50. }
  51. //==============================
  52. bool cCollider::Ok () {
  53. IF_ERROR_SHOW_( m_counter, "m_counter")
  54. IF_ERROR_SHOW_( m_time, "m_time")
  55. for (int i = 0; i <= m_counter; i++ ) {
  56. m_part [0]->Ok ();
  57. }
  58. }
  59. //==============================
  60. rezalt_collider cCollider::collision (rezalt_collider rezalt_) {
  61. if (m_counter = 0) {
  62. processing_error (one_part_in_collid);
  63. errno = 125; // ECANCELED
  64. return rezalt_;
  65. }
  66. cMyVector3 dist1;
  67. cMyVector3 dist2;
  68. for (int i = 0; i < m_counter; i++) {
  69. for (int j = (i + 1); j <= m_counter; j++ ) {
  70. dist1 = m_part [i]->return_coordin ();
  71. dist2 = m_part [j]->return_coordin ();
  72. if ((m_part [i]->return_radii () + m_part [j]->return_radii ()) < (abs (dist1.X() - dist2.X()))) {
  73. errno = 0;
  74. return creat_rezalt_of_collid (rezalt_,i, j);
  75. }
  76. if ((m_part [i]->return_radii () + m_part [j]->return_radii ()) < (abs (dist1.Y() - dist2.Y()))) {
  77. errno = 0;
  78. return creat_rezalt_of_collid (rezalt_,i, j);
  79. }
  80. if ((m_part [i]->return_radii () + m_part [j]->return_radii ()) < (abs (dist1.Z() - dist2.Z()))) {
  81. errno = 0;
  82. return creat_rezalt_of_collid (rezalt_,i, j);
  83. }
  84. }
  85. }
  86. errno = 10; //ECHILD
  87. return rezalt_;
  88. }
  89. //==============================
  90. rezalt_collider cCollider::creat_rezalt_of_collid (rezalt_collider rezalt_, int i_, int j_) {
  91. /*
  92. * mast to do
  93. * maybe it will do by Stepan ???
  94. */
  95. return rezalt_;
  96. }
  97. //==============================
  98. bool cCollider::processing_error (const int namb_Of_error) {
  99. #define IF_ERROR_NUMBER_COLLIDER_(err, text) \
  100. if (namb_Of_error == err) { \
  101. cout << text << endl; \
  102. return true; \
  103. }
  104. IF_ERROR_NUMBER_COLLIDER_(one_part_in_collid,
  105. "One particle in collider not enough to impinge \n")
  106. IF_ERROR_NUMBER_COLLIDER_(time_to_collide_passid,
  107. "Time to collisions has passed \n")
  108. #undef IF_ERROR_NUMBER_COLLIDER_
  109. }
  110. //==============================
  111. rezalt_collider cCollider::step (int count_, rezalt_collider rezalt_, double size_of_step_ , bool start_) {
  112. collision (rezalt_);
  113. if (errno == 125) {
  114. cout << "I cannot collide one particl \n";
  115. return rezalt_;
  116. }
  117. cMyVector3 speed;
  118. cMyVector3 coordin_old;
  119. cMyVector3 coordin_new;
  120. double px, py, pz;
  121. double x, y, z;
  122. while (start_ && (errno == 10)) {
  123. for (int i = 0; i <= m_counter; i++) {
  124. speed = m_part [i]->return_speed ();
  125. px = size_of_step_ * speed.X ();
  126. py = size_of_step_ * speed.Y ();
  127. pz = size_of_step_ * speed.Z ();
  128. coordin_old = m_part [i]->return_coordin ();
  129. x = coordin_old.X ();
  130. y = coordin_old.Y ();
  131. z = coordin_old.Z ();
  132. coordin_new.SetXYZ (x, y, z);
  133. m_part [i]->change_coordin (coordin_new);
  134. } //end of for
  135. m_time++;
  136. collision (rezalt_);
  137. if (m_time == time_to_collide_passid) {
  138. start_ = false;
  139. processing_error (time_to_collide_passid);
  140. }
  141. } // end of while
  142. return rezalt_;
  143. }