btReducedVector.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //
  2. // btReducedVector.cpp
  3. // LinearMath
  4. //
  5. // Created by Xuchen Han on 4/4/20.
  6. //
  7. #include <stdio.h>
  8. #include "btReducedVector.h"
  9. #include <cmath>
  10. // returns the projection of this onto other
  11. btReducedVector btReducedVector::proj(const btReducedVector& other) const
  12. {
  13. btReducedVector ret(m_sz);
  14. btScalar other_length2 = other.length2();
  15. if (other_length2 < SIMD_EPSILON)
  16. {
  17. return ret;
  18. }
  19. return other*(this->dot(other))/other_length2;
  20. }
  21. void btReducedVector::normalize()
  22. {
  23. if (this->length2() < SIMD_EPSILON)
  24. {
  25. m_indices.clear();
  26. m_vecs.clear();
  27. return;
  28. }
  29. *this /= std::sqrt(this->length2());
  30. }
  31. bool btReducedVector::testAdd() const
  32. {
  33. int sz = 5;
  34. btAlignedObjectArray<int> id1;
  35. id1.push_back(1);
  36. id1.push_back(3);
  37. btAlignedObjectArray<btVector3> v1;
  38. v1.push_back(btVector3(1,0,1));
  39. v1.push_back(btVector3(3,1,5));
  40. btAlignedObjectArray<int> id2;
  41. id2.push_back(2);
  42. id2.push_back(3);
  43. id2.push_back(5);
  44. btAlignedObjectArray<btVector3> v2;
  45. v2.push_back(btVector3(2,3,1));
  46. v2.push_back(btVector3(3,4,9));
  47. v2.push_back(btVector3(0,4,0));
  48. btAlignedObjectArray<int> id3;
  49. id3.push_back(1);
  50. id3.push_back(2);
  51. id3.push_back(3);
  52. id3.push_back(5);
  53. btAlignedObjectArray<btVector3> v3;
  54. v3.push_back(btVector3(1,0,1));
  55. v3.push_back(btVector3(2,3,1));
  56. v3.push_back(btVector3(6,5,14));
  57. v3.push_back(btVector3(0,4,0));
  58. btReducedVector rv1(sz, id1, v1);
  59. btReducedVector rv2(sz, id2, v2);
  60. btReducedVector ans(sz, id3, v3);
  61. bool ret = ((ans == rv1+rv2) && (ans == rv2+rv1));
  62. if (!ret)
  63. printf("btReducedVector testAdd failed\n");
  64. return ret;
  65. }
  66. bool btReducedVector::testMinus() const
  67. {
  68. int sz = 5;
  69. btAlignedObjectArray<int> id1;
  70. id1.push_back(1);
  71. id1.push_back(3);
  72. btAlignedObjectArray<btVector3> v1;
  73. v1.push_back(btVector3(1,0,1));
  74. v1.push_back(btVector3(3,1,5));
  75. btAlignedObjectArray<int> id2;
  76. id2.push_back(2);
  77. id2.push_back(3);
  78. id2.push_back(5);
  79. btAlignedObjectArray<btVector3> v2;
  80. v2.push_back(btVector3(2,3,1));
  81. v2.push_back(btVector3(3,4,9));
  82. v2.push_back(btVector3(0,4,0));
  83. btAlignedObjectArray<int> id3;
  84. id3.push_back(1);
  85. id3.push_back(2);
  86. id3.push_back(3);
  87. id3.push_back(5);
  88. btAlignedObjectArray<btVector3> v3;
  89. v3.push_back(btVector3(-1,-0,-1));
  90. v3.push_back(btVector3(2,3,1));
  91. v3.push_back(btVector3(0,3,4));
  92. v3.push_back(btVector3(0,4,0));
  93. btReducedVector rv1(sz, id1, v1);
  94. btReducedVector rv2(sz, id2, v2);
  95. btReducedVector ans(sz, id3, v3);
  96. bool ret = (ans == rv2-rv1);
  97. if (!ret)
  98. printf("btReducedVector testMinus failed\n");
  99. return ret;
  100. }
  101. bool btReducedVector::testDot() const
  102. {
  103. int sz = 5;
  104. btAlignedObjectArray<int> id1;
  105. id1.push_back(1);
  106. id1.push_back(3);
  107. btAlignedObjectArray<btVector3> v1;
  108. v1.push_back(btVector3(1,0,1));
  109. v1.push_back(btVector3(3,1,5));
  110. btAlignedObjectArray<int> id2;
  111. id2.push_back(2);
  112. id2.push_back(3);
  113. id2.push_back(5);
  114. btAlignedObjectArray<btVector3> v2;
  115. v2.push_back(btVector3(2,3,1));
  116. v2.push_back(btVector3(3,4,9));
  117. v2.push_back(btVector3(0,4,0));
  118. btReducedVector rv1(sz, id1, v1);
  119. btReducedVector rv2(sz, id2, v2);
  120. btScalar ans = 58;
  121. bool ret = (ans == rv2.dot(rv1) && ans == rv1.dot(rv2));
  122. ans = 14+16+9+16+81;
  123. ret &= (ans==rv2.dot(rv2));
  124. if (!ret)
  125. printf("btReducedVector testDot failed\n");
  126. return ret;
  127. }
  128. bool btReducedVector::testMultiply() const
  129. {
  130. int sz = 5;
  131. btAlignedObjectArray<int> id1;
  132. id1.push_back(1);
  133. id1.push_back(3);
  134. btAlignedObjectArray<btVector3> v1;
  135. v1.push_back(btVector3(1,0,1));
  136. v1.push_back(btVector3(3,1,5));
  137. btScalar s = 2;
  138. btReducedVector rv1(sz, id1, v1);
  139. btAlignedObjectArray<int> id2;
  140. id2.push_back(1);
  141. id2.push_back(3);
  142. btAlignedObjectArray<btVector3> v2;
  143. v2.push_back(btVector3(2,0,2));
  144. v2.push_back(btVector3(6,2,10));
  145. btReducedVector ans(sz, id2, v2);
  146. bool ret = (ans == rv1*s);
  147. if (!ret)
  148. printf("btReducedVector testMultiply failed\n");
  149. return ret;
  150. }
  151. void btReducedVector::test() const
  152. {
  153. bool ans = testAdd() && testMinus() && testDot() && testMultiply();
  154. if (ans)
  155. {
  156. printf("All tests passed\n");
  157. }
  158. else
  159. {
  160. printf("Tests failed\n");
  161. }
  162. }