You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1530 lines
25 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #include "GMath.h"
  2. GVector3::GVector3(float x, float y, float z)
  3. {
  4. v[0] = x;
  5. v[1] = y;
  6. v[2] = z;
  7. }
  8. GVector3::GVector3(const GVector3 & copy)
  9. {
  10. v[0] = copy.v[0];
  11. v[1] = copy.v[1];
  12. v[2] = copy.v[2];
  13. }
  14. GVector3 & GVector3::operator=(const GVector3 & rhs)
  15. {
  16. v[0] = rhs.v[0];
  17. v[1] = rhs.v[1];
  18. v[2] = rhs.v[2];
  19. return *this;
  20. }
  21. GVector3 GVector3::operator+(const GVector3 & rhs) const
  22. {
  23. GVector3 ret;
  24. ret.v[0] = v[0] + rhs.v[0];
  25. ret.v[1] = v[1] + rhs.v[1];
  26. ret.v[2] = v[2] + rhs.v[2];
  27. return ret;
  28. }
  29. GVector3 GVector3::operator-(const GVector3 & rhs) const
  30. {
  31. GVector3 ret;
  32. ret.v[0] = v[0] - rhs.v[0];
  33. ret.v[1] = v[1] - rhs.v[1];
  34. ret.v[2] = v[2] - rhs.v[2];
  35. return ret;
  36. }
  37. GVector3 operator*(const GVector3 & lhs, const float & k)
  38. {
  39. GVector3 ret;
  40. ret.v[0] = lhs.v[0] * k;
  41. ret.v[1] = lhs.v[1] * k;
  42. ret.v[2] = lhs.v[2] * k;
  43. return ret;
  44. }
  45. GVector3 operator*(const float & k, const GVector3& rhs)
  46. {
  47. GVector3 ret;
  48. ret.v[0] = rhs.v[0] * k;
  49. ret.v[1] = rhs.v[1] * k;
  50. ret.v[2] = rhs.v[2] * k;
  51. return ret;
  52. }
  53. GVector3 operator/(const GVector3 & lhs, const float & k)
  54. {
  55. GVector3 ret;
  56. assert(k != 0);
  57. ret.v[0] = lhs.v[0] / k;
  58. ret.v[1] = lhs.v[1] / k;
  59. ret.v[2] = lhs.v[2] / k;
  60. return ret;
  61. }
  62. float norm(const GVector3 & v)
  63. {
  64. return SQRT(v.v[0] * v.v[0] + v.v[1] * v.v[1] + v.v[2] * v.v[2]);
  65. }
  66. GVector3 & GVector3::normalize()
  67. {
  68. float len = norm(*this);
  69. if (len > PRECISION) {
  70. v[0] /= len;
  71. v[1] /= len;
  72. v[2] /= len;
  73. }
  74. return *this;
  75. }
  76. float GVector3::operator*(const GVector3 & rhs) const
  77. {
  78. float ret;
  79. ret = v[0] * rhs.v[0] + v[1] * rhs.v[1] +v[2] * rhs.v[2];
  80. return ret;
  81. }
  82. GVector3 proj(const GVector3 & p, const GVector3 & q)
  83. {
  84. return (p*q) / SQR(norm(q)) * q;
  85. }
  86. GVector3 perp(const GVector3 & p, const GVector3 & q)
  87. {
  88. return p - proj(p,q);
  89. }
  90. GVector3 GVector3::operator^(const GVector3 & rhs) const
  91. {
  92. GVector3 ret;
  93. ret.v[0] = v[1] * rhs.v[2] - v[2] * rhs.v[1];
  94. ret.v[1] = v[2] * rhs.v[0] - v[0] * rhs.v[2];
  95. ret.v[2] = v[0] * rhs.v[1] - v[1] * rhs.v[0];
  96. return ret;
  97. }
  98. GVector3 & GVector3::Set(const float & x, const float & y, const float & z)
  99. {
  100. v[0] = x;
  101. v[1] = y;
  102. v[2] = z;
  103. return *this;
  104. }
  105. float distance(const GVector3 & v, const GVector3 u)
  106. {
  107. float ret = 0.0;
  108. float a = v.v[0] - u.v[0];
  109. float b = v.v[1] - u.v[1];
  110. float c = v.v[2] - u.v[2];
  111. ret = SQRT(SQR(a) + SQR(b) + SQR(c));
  112. return ret;
  113. }
  114. GVector3 & GVector3::operator+=(const GVector3 & rhs)
  115. {
  116. v[0] += rhs.v[0];
  117. v[1] += rhs.v[1];
  118. v[2] += rhs.v[2];
  119. return *this;
  120. }
  121. GVector3 & GVector3::operator-=(const GVector3 & rhs)
  122. {
  123. v[0] -= rhs.v[0];
  124. v[1] -= rhs.v[1];
  125. v[2] -= rhs.v[2];
  126. return *this;
  127. }
  128. ostream & operator<<(ostream & os, const GVector3 & v)
  129. {
  130. os << "[" << setw(2) << v.v[0] << ", " << setw(2) << v.v[1] << ", " << setw(2) << v.v[2] << "]";
  131. return os;
  132. }
  133. GVector3 & GVector3::operator*=(const float & k)
  134. {
  135. v[0] *= k;
  136. v[1] *= k;
  137. v[2] *= k;
  138. return *this;
  139. }
  140. GVector3 & GVector3::operator/=(const float & k)
  141. {
  142. v[0] /= k;
  143. v[1] /= k;
  144. v[2] /= k;
  145. return *this;
  146. }
  147. GVector3 & GVector3::operator^=(const GVector3 & rhs)
  148. {
  149. v[0] = v[1] * rhs.v[2] - v[2] * rhs.v[1];
  150. v[1] = v[2] * rhs.v[0] - v[0] * rhs.v[2];
  151. v[2] = v[0] * rhs.v[1] - v[1] * rhs.v[0];
  152. return *this;
  153. }
  154. bool GVector3::operator==(const GVector3 rhs) const
  155. {
  156. return !((*this) != rhs);
  157. }
  158. bool GVector3::operator!=(const GVector3 rhs) const
  159. {
  160. return (!EQ(v[0], rhs.v[0], PRECISION) || !EQ(v[1], rhs.v[1], PRECISION) || !EQ(v[2], rhs.v[2], PRECISION));
  161. }
  162. GVector3 GVector3::operator+() const
  163. {
  164. return *this;
  165. }
  166. GVector3 GVector3::operator-() const
  167. {
  168. return *this * -1;
  169. }
  170. float & GVector3::operator[](const int & idx)
  171. {
  172. return v[idx];
  173. }
  174. const float GVector3::operator[](const int & idx) const
  175. {
  176. return v[idx];
  177. }
  178. //----GVector----//
  179. GVector::GVector(int dim)
  180. {
  181. n = dim;
  182. v = new float[n];
  183. ARR_ZERO(v, n);
  184. }
  185. GVector::GVector(int dim, double x, ...)
  186. {
  187. n = dim;
  188. v = new float[n];
  189. va_list ap;
  190. va_start(ap, dim);
  191. for (int i = 0; i < n; i++) {
  192. v[i] = (float)va_arg(ap, double);
  193. }
  194. va_end(ap);
  195. }
  196. GVector::GVector(const GVector3 & copy)
  197. {
  198. n = 3;
  199. v = new float[3];
  200. v[0] = copy[0];
  201. v[1] = copy[1];
  202. v[2] = copy[2];
  203. }
  204. GVector::GVector(const GVector & copy)
  205. {
  206. n = copy.n;
  207. v = new float[n];
  208. memcpy(v, copy.v, n * sizeof(float));
  209. }
  210. GVector::~GVector()
  211. {
  212. if (v) {
  213. delete[] v;
  214. }
  215. v = NULL;
  216. }
  217. GVector & GVector::Set(double x, ...)
  218. {
  219. v[0] = (float)x;
  220. va_list ap;
  221. va_start(ap, x);
  222. for (int i = 1; i < n; i++) {
  223. v[i] = (float)va_arg(ap, double);
  224. }
  225. va_end(ap);
  226. return *this;
  227. }
  228. GVector & GVector::Set(float * p)
  229. {
  230. memcpy(v, p, sizeof(float) * n);
  231. return *this;
  232. }
  233. GVector & GVector::operator=(const GVector & rhs)
  234. {
  235. if (v) {
  236. delete[] v;
  237. }
  238. n = rhs.n;
  239. v = new float[n];
  240. memcpy(v, rhs.v, n * sizeof(float));
  241. return *this;
  242. }
  243. GVector & GVector::operator+=(const GVector & rhs)
  244. {
  245. assert(n = rhs.n);
  246. for (int i = 0; i < n; i++) {
  247. v[i] += rhs.v[i];
  248. }
  249. return *this;
  250. }
  251. GVector & GVector::operator-=(const GVector & rhs)
  252. {
  253. assert(n = rhs.n);
  254. for (int i = 0; i < n; i++) {
  255. v[i] -= rhs.v[i];
  256. }
  257. return *this;
  258. }
  259. GVector & GVector::operator+=(const float & k)
  260. {
  261. for (int i = 0; i < n; i++) {
  262. v[i] += k;
  263. }
  264. return *this;
  265. }
  266. GVector & GVector::operator-=(const float & k)
  267. {
  268. for (int i = 0; i < n; i++) {
  269. v[i] -= k;
  270. }
  271. return *this;
  272. }
  273. GVector & GVector::operator*=(const float & k)
  274. {
  275. for (int i = 0; i < n; i++) {
  276. v[i] *= k;
  277. }
  278. return *this;
  279. }
  280. GVector & GVector::operator/=(const float & k)
  281. {
  282. for (int i = 0; i < n; i++) {
  283. v[i] /= k;
  284. }
  285. return *this;
  286. }
  287. bool GVector::operator==(const GVector & rhs) const
  288. {
  289. return ((*this) == rhs);
  290. }
  291. bool GVector::operator!=(const GVector & rhs) const
  292. {
  293. assert(n == rhs.n);
  294. for (int i = 0; i < n; i++) {
  295. if (!EQ(v[i], rhs.v[i], PRECISION)) {
  296. return true;
  297. }
  298. }
  299. return false;
  300. }
  301. GVector GVector::operator+() const
  302. {
  303. return *this;
  304. }
  305. GVector GVector::operator-() const
  306. {
  307. return *this * -1;
  308. }
  309. GVector GVector::operator+(const GVector & rhs) const
  310. {
  311. assert(n == rhs.n);
  312. GVector ret = GVector(n);
  313. for (int i = 0; i < n; i++) {
  314. ret.v[i] = v[i] + rhs.v[i];
  315. }
  316. return ret;
  317. }
  318. GVector GVector::operator-(const GVector & rhs) const
  319. {
  320. assert(n == rhs.n);
  321. GVector ret = GVector(n);
  322. for (int i = 0; i < n; i++) {
  323. ret.v[i] = v[i] - rhs.v[i];
  324. }
  325. return ret;
  326. }
  327. float GVector::operator*(const GVector & rhs) const
  328. {
  329. assert(n == rhs.n);
  330. float ret = 0;
  331. for (int i = 0; i < n; i++) {
  332. ret += v[i] * rhs.v[i];
  333. }
  334. return ret;
  335. }
  336. GVector GVector::operator/(const float & k) const
  337. {
  338. GVector ret = GVector(n);
  339. for (int i = 0; i < n; i++) {
  340. ret.v[i] = v[i]/k;
  341. }
  342. return ret;
  343. }
  344. float & GVector::operator[](const int & idx)
  345. {
  346. assert(idx >= 0 && idx <= n);
  347. return v[idx];
  348. }
  349. const float & GVector::operator[](const int & idx) const
  350. {
  351. assert(idx >= 0 && idx <= n);
  352. return v[idx];
  353. }
  354. GVector & GVector::Nornalize()
  355. {
  356. float m = norm(*this);
  357. for (int i = 0; i < n; i++) {
  358. v[i] /= m;
  359. }
  360. return *this;
  361. }
  362. int GVector::GetDim() const
  363. {
  364. return n;
  365. }
  366. GVector operator*(const float & k, const GVector & rhs)
  367. {
  368. GVector ret(rhs.n);
  369. for (int i = 0; i < ret.n; i++) {
  370. ret.v[i] *= k;
  371. }
  372. return ret;
  373. }
  374. GVector operator*(const GVector & lhs, const float & k)
  375. {
  376. GVector ret(lhs.n);
  377. for (int i = 0; i < ret.n; i++) {
  378. ret.v[i] *= k;
  379. }
  380. return ret;
  381. }
  382. float norm(const GVector & v)
  383. {
  384. float ret = 0;
  385. for (int i = 0; i < v.n; i++) {
  386. ret += SQR(v.v[i]);
  387. }
  388. ret = SQRT(ret);
  389. return ret;
  390. }
  391. float distance(const GVector & v, const GVector & u)
  392. {
  393. return norm(v - u);
  394. }
  395. ostream & operator<<(ostream & os, const GVector & v)
  396. {
  397. os << "[ ";
  398. for (int i = 0; i < v.n; i++) {
  399. os << setw(5) << v.v[i];
  400. if (i != v.n - 1) {
  401. os << ", ";
  402. }
  403. }
  404. os << " ]" << endl;
  405. return os;
  406. }
  407. GMatrix::GMatrix(int row, int col, float * elem)
  408. {
  409. r = row;
  410. c = col;
  411. m = new float[r*c];
  412. if (elem) {
  413. memcpy(m, elem, sizeof(float)*r*c);
  414. }
  415. else {
  416. ARR_ZERO(m, r*c);
  417. }
  418. }
  419. GMatrix::GMatrix(const GMatrix & copy)
  420. {
  421. r = copy.r;
  422. c = copy.c;
  423. m = new float[r*c];
  424. memcpy(m, copy.m, sizeof(float)*r*c);
  425. }
  426. GMatrix::~GMatrix()
  427. {
  428. if (m) {
  429. delete[] m;
  430. }
  431. m = NULL;
  432. }
  433. GMatrix & GMatrix::operator=(const GMatrix & rhs)
  434. {
  435. if (m) {
  436. delete[] m;
  437. }
  438. r = rhs.r;
  439. c = rhs.c;
  440. m = new float[r*c];
  441. memcpy(m, rhs.m, sizeof(float)*r*c);
  442. return *this;
  443. }
  444. GMatrix & GMatrix::operator+=(const GMatrix & rhs)
  445. {
  446. assert(r == rhs.r && c == rhs.c);
  447. for (int i = 0; i < r*c; i++) {
  448. m[i] += rhs.m[i];
  449. }
  450. return *this;
  451. }
  452. GMatrix & GMatrix::operator-=(const GMatrix & rhs)
  453. {
  454. assert(r == rhs.r && c == rhs.c);
  455. for (int i = 0; i < r*c; i++) {
  456. m[i] -= rhs.m[i];
  457. }
  458. return *this;
  459. }
  460. GMatrix & GMatrix::operator*=(const float & k)
  461. {
  462. for (int i = 0; i < r*c; i++) {
  463. m[i] *= k;
  464. }
  465. return *this;
  466. }
  467. GMatrix & GMatrix::operator*=(const GMatrix & rhs)
  468. {
  469. assert(c == rhs.r);
  470. c = rhs.c;
  471. float* p = new float[r*c];
  472. ARR_ZERO(p, r*c)
  473. ;
  474. for (int i = 0; i < r; i++) {
  475. for (int j = 0; j < c; j++) {
  476. for (int k = 0; k < rhs.r; k++) {
  477. p[i*c + j] += m[i*rhs.r + k] * rhs.m[k*c + j];
  478. }
  479. }
  480. }
  481. delete[] m;
  482. m = p;
  483. return *this;
  484. }
  485. GMatrix & GMatrix::operator/=(const float & k)
  486. {
  487. assert(k != 0);
  488. for (int i = 0; i < r*c; i++) {
  489. m[i] /= k;
  490. }
  491. return *this;
  492. }
  493. GMatrix GMatrix::operator+() const
  494. {
  495. return *this;
  496. }
  497. GMatrix GMatrix::operator-() const
  498. {
  499. return *this*-1;
  500. }
  501. GMatrix GMatrix::operator+(const GMatrix & rhs) const
  502. {
  503. assert(r == rhs.r && c == rhs.c);
  504. GMatrix ret(*this);
  505. ret += rhs;
  506. return ret;
  507. }
  508. GMatrix GMatrix::operator-(const GMatrix & rhs) const
  509. {
  510. assert(r == rhs.r && c == rhs.c);
  511. GMatrix ret(*this);
  512. ret -= rhs;
  513. return ret;
  514. }
  515. GMatrix GMatrix::operator*(const GMatrix & rhs) const
  516. {
  517. assert(c == rhs.r);
  518. GMatrix ret(*this);
  519. ret *= rhs;
  520. return ret;
  521. }
  522. GMatrix GMatrix::operator/(const float & k) const
  523. {
  524. GMatrix ret(*this);
  525. ret /= k;
  526. return ret;
  527. }
  528. GMatrix operator*(const GMatrix & lhs, const float & k)
  529. {
  530. GMatrix ret(lhs);
  531. ret *= k;
  532. return ret;
  533. }
  534. GMatrix operator*(const float& k, const GMatrix & rhs)
  535. {
  536. GMatrix ret(rhs);
  537. ret *= k;
  538. return ret;
  539. }
  540. GVector operator*(const GMatrix & m, const GVector & v)
  541. {
  542. assert(m.c == v.n);
  543. GVector ret(m.r);
  544. for (int i = 0; i < m.r; i++) {
  545. for (int j = 0; j < m.c; j++) {
  546. ret.v[i] += m.m[i*m.c + j] * v.v[j];
  547. }
  548. }
  549. return ret;
  550. }
  551. GMatrix operator*(const GVector & v, const GMatrix & m)
  552. {
  553. assert(m.r == 1);
  554. GMatrix ret(v.n, m.c);
  555. for (int i = 0; i < v.n; i++) {
  556. for (int j = 0; j < m.c; j++) {
  557. ret.m[i*m.c + j] = v.v[i] * m.m[j];
  558. }
  559. }
  560. return ret;
  561. }
  562. bool GMatrix::operator==(const GMatrix & rhs) const
  563. {
  564. if (r != rhs.r || c != rhs.c) {
  565. return false;
  566. }
  567. for (int i = 0; i < r*c; i++) {
  568. if (abs(m[i] - rhs.m[i]) > PRECISION) {
  569. return false;
  570. }
  571. }
  572. return true;
  573. }
  574. bool GMatrix::operator!=(const GMatrix & rhs) const
  575. {
  576. if (r != rhs.r || c != rhs.c) {
  577. return true;
  578. }
  579. for (int i = 0; i < r*c; i++) {
  580. if (abs(m[i] - rhs.m[i]) > PRECISION) {
  581. return true;
  582. }
  583. }
  584. return false;
  585. }
  586. float * GMatrix::operator[](const int idx)
  587. {
  588. assert(idx >= 0 && idx < r);
  589. return &m[idx*c];
  590. }
  591. const float * GMatrix::operator[](const int idx) const
  592. {
  593. assert(idx >= 0 && idx < r);
  594. return &m[idx*c];
  595. }
  596. GMatrix & GMatrix::SetInverse()
  597. {
  598. //ֻ�з�����������
  599. assert(r == c);
  600. //���������о������������󣬷���������������������Ҳ��������ʽ����Ϊ0
  601. float det = Det(*this);
  602. assert(det != 0);
  603. //������������
  604. int exc = c * 2;
  605. GMatrix exM(r, exc);
  606. int i, j = 0;
  607. for (i = 0; i < exM.GetRowNum(); i++) {
  608. for (j = 0; j < exM.GetColNum(); j++) {
  609. if (j < c) {
  610. exM[i][j] = m[i*c + j];
  611. }
  612. else {
  613. if (j - c == i) {
  614. exM[i][j] = 1.0f;
  615. }
  616. }
  617. }
  618. }
  619. exM = ReduceRowEchelonForm(exM);
  620. for (i = 0; i < exM.GetRowNum(); i++) {
  621. for (j = 0; j < exM.GetColNum(); j++) {
  622. if (j >= c) {
  623. m[i*c + (j - c)] = exM[i][j];
  624. }
  625. }
  626. }
  627. return *this;
  628. }
  629. GMatrix & GMatrix::SetTranspose()
  630. {
  631. int i, j;
  632. if (r == c) { //Spuare matrix
  633. for (i = 0; i < r; i++) {
  634. for (j = i+1; j < c; j++) {
  635. SWAP(float, m[i*c + j], m[j* r + i])
  636. }
  637. }
  638. }
  639. else {
  640. float *p = new float[r*c];
  641. memcpy(p, m, sizeof(float)*r*c);
  642. SWAP(int, r, c);
  643. for (i = 0; i < r; i++) {
  644. for (j = 0; j < c; j++) {
  645. m[i*c + j] = p[j*r + i];
  646. }
  647. }
  648. delete[] p;
  649. p = NULL;
  650. }
  651. return *this;
  652. }
  653. GMatrix & GMatrix::SetIdentity()
  654. {
  655. int min = MIN(r, c);
  656. SetZeros();
  657. for (int i = 0; i < min; i++) {
  658. m[i*c + i] = 1.0f;
  659. }
  660. return *this;
  661. }
  662. GMatrix & GMatrix::SetZeros()
  663. {
  664. memset(m, 0, sizeof(float)*r*c);
  665. return *this;
  666. }
  667. ostream & operator<<(ostream & os, const GMatrix & m)
  668. {
  669. float r = 0.0f;
  670. for (int i = 0; i < m.r; i++) {
  671. os << "|";
  672. for (int j = 0; j < m.c; j++) {
  673. r = EQ_ZERO(m.m[i*m.c + j], PRECISION) ? 0 : m.m[i*m.c + j];
  674. os << setw(6) << r << " ";
  675. }
  676. os << " |" << endl;
  677. }
  678. return os;
  679. }
  680. GMatrix & GMatrix::SetRowVec(const int idx, const GVector & v)
  681. {
  682. assert(idx < r && v.n == c);
  683. for (int i = 0; i < c; i++) {
  684. m[idx*c + i] = v.v[i];
  685. }
  686. return *this;
  687. }
  688. GMatrix & GMatrix::SetColVec(const int idx, const GVector & v)
  689. {
  690. assert(idx < c && v.n == r);
  691. for (int i = 0; i < r; i++) {
  692. m[i*c + idx] = v.v[i];
  693. }
  694. return *this;
  695. }
  696. GVector GMatrix::GetRowVec(const int idx) const
  697. {
  698. assert(idx < r);
  699. GVector ret(c);
  700. for (int i = 0; i < c; i++) {
  701. ret.v[i] = m[idx*c + i];
  702. }
  703. return ret;
  704. }
  705. GVector GMatrix::GetColVec(const int idx) const
  706. {
  707. assert(idx < c);
  708. GVector ret(r);
  709. for (int i = 0; i < r; i++) {
  710. ret.v[i] = m[i*c + idx];
  711. }
  712. return ret;
  713. }
  714. GMatrix & GMatrix::ExchangeRows(const int idx0, const int idx1)
  715. {
  716. GVector tmp(c);
  717. tmp = GetRowVec(idx0);
  718. SetRowVec(idx0, GetRowVec(idx1));
  719. SetRowVec(idx1, tmp);
  720. return *this;
  721. }
  722. GMatrix & GMatrix::ExchangeCols(const int idx0, const int idx1)
  723. {
  724. GVector tmp(r);
  725. tmp = GetColVec(idx0);
  726. SetColVec(idx0, GetColVec(idx1));
  727. SetColVec(idx1, tmp);
  728. return *this;
  729. }
  730. int GMatrix::GetRowNum() const
  731. {
  732. return r;
  733. }
  734. int GMatrix::GetColNum() const
  735. {
  736. return c;
  737. }
  738. bool GMatrix::IsSquare() const
  739. {
  740. return (r == c) ? true : false;
  741. }
  742. GMatrix RowEchelonForm(const GMatrix & m)
  743. {
  744. int i, j, k;
  745. int r = m.GetRowNum();
  746. int c = m.GetColNum();
  747. int n = MIN(r, c);
  748. GMatrix t(m);
  749. int shift = 0;
  750. for (i = 0; i < n; i++) {
  751. float max = ABS(t[i][i + shift]);
  752. int privot_idx = i;//�к�
  753. //�ҳ� ����ֵ�����ĵ��� �� ��������
  754. for (j = i+1; j < n; j++) {
  755. if (max < ABS(t[j][i + shift])) {
  756. max = ABS(t[j][i + shift]);
  757. privot_idx = j;
  758. }
  759. }
  760. //��������ֵ��0�Ļ�����ôֱ��������һ��
  761. if (EQ_ZERO(max, PRECISION)) {
  762. shift++;
  763. i--; //�ǵ�Ҫ������һ��
  764. continue;
  765. }
  766. //��������ֵ�����в��������У��Ǿ�Ҫ����
  767. if (i != privot_idx) {
  768. t.ExchangeRows(i, privot_idx);
  769. }
  770. //ȡ������ֵ
  771. float s = t[i][i + shift];//������Ϊ��һ���Ѿ�������ֵ�н�������������
  772. //������1
  773. for (j = i + shift; j < c; j++) {
  774. t[i][j] = t[i][j] / s;
  775. }
  776. //�ѵ�ǰ�У�����1���µ�ֵ������0
  777. for (j = i + 1; j < r; j++) {
  778. s = t[j][i + shift];
  779. for (k = i + shift; k < c; k++) {
  780. t[j][k] = t[j][k] - s * t[i][k];
  781. }
  782. }
  783. }
  784. return t;
  785. }
  786. GMatrix ReduceRowEchelonForm(const GMatrix & m)
  787. {
  788. int i, j, k;
  789. int r = m.GetRowNum();
  790. int c = m.GetColNum();
  791. int n = MIN(r, c);
  792. GMatrix t(m);
  793. int shift = 0;
  794. for (i = 0; i < n; i++) {
  795. float max = ABS(t[i][i + shift]);
  796. int privot_idx = i;//�к�
  797. //�ҳ� ����ֵ�����ĵ��� �� ��������
  798. for (j = i + 1; j < n; j++) {
  799. if (max < ABS(t[j][i + shift])) {
  800. max = ABS(t[j][i + shift]);
  801. privot_idx = j;
  802. }
  803. }
  804. //��������ֵ��0�Ļ�����ôֱ��������һ��
  805. if (EQ_ZERO(max, PRECISION)) {
  806. shift++;
  807. i--; //�ǵ�Ҫ������һ��
  808. continue;
  809. }
  810. //��������ֵ�����в��������У��Ǿ�Ҫ����
  811. if (i != privot_idx) {
  812. t.ExchangeRows(i, privot_idx);
  813. }
  814. //ȡ������ֵ
  815. float s = t[i][i + shift];//������Ϊ��һ���Ѿ�������ֵ�н�������������
  816. //������1
  817. for (j = i + shift; j < c; j++) {
  818. t[i][j] = t[i][j] / s;
  819. }
  820. //�ѵ�ǰ�У�����1����ֵ������0
  821. for (j = 0; j < r; j++) {
  822. if (i == j)
  823. continue;
  824. s = t[j][i + shift];
  825. for (k = i + shift; k < c; k++) {
  826. t[j][k] = t[j][k] - s * t[i][k];
  827. }
  828. }
  829. }
  830. return t;
  831. }
  832. float * from_arr(const GMatrix & m)
  833. {
  834. return m.m;
  835. }
  836. int Rank(const GMatrix & m)
  837. {
  838. int i, r, rank = 0;
  839. r = m.GetRowNum();
  840. GMatrix t = RowEchelonForm(m);
  841. for (i = 0; i < r; i++) {
  842. GVector rVec = t.GetRowVec(i);
  843. if (!EQ_ZERO(norm(rVec), PRECISION)) {
  844. rank++;
  845. }
  846. }
  847. return rank;
  848. }
  849. int Nullity(const GMatrix & m)
  850. {
  851. int rank = Rank(m);
  852. return m.GetColNum() - rank;
  853. }
  854. GMatrix MijMatrix(const GMatrix & m, int rom, int col)
  855. {
  856. int i,j = 0;
  857. int r = m.GetRowNum();
  858. int c = m.GetColNum();
  859. assert(r == c);//����
  860. assert(rom < r && col < c);
  861. //����ʽ������������
  862. int nR = r - 1;
  863. int nC = c - 1;
  864. GMatrix ret(nR, nC);
  865. nR = 0;
  866. for (i = 0; i < r; i++) {
  867. nC = 0;
  868. if (i == rom) {
  869. continue;
  870. }
  871. for (j = 0; j < c; j++) {
  872. if (j == col) {
  873. continue;
  874. }
  875. ret[nR][nC] = m[i][j];
  876. nC++;
  877. }
  878. nR++;
  879. }
  880. return ret;
  881. }
  882. float Mij(const GMatrix & m, int r, int c)
  883. {
  884. GMatrix M = MijMatrix(m, r, c);
  885. return Det(M);
  886. }
  887. float Cij(const GMatrix & m, int r, int c)
  888. {
  889. GMatrix M = MijMatrix(m, r, c);
  890. int t = pow(-1, r + c);
  891. return t*Det(M);
  892. }
  893. float Det(const GMatrix & m)
  894. {
  895. int i = 0;
  896. int r = m.GetRowNum();
  897. int c = m.GetColNum();
  898. assert(r == c);//������������ʽ
  899. float ret = 0.0f;
  900. if (r == 1) {
  901. ret = m[0][0];
  902. }
  903. else {
  904. for (i = 0; i < c; i++) {
  905. GMatrix t = MijMatrix(m, 0, i);
  906. ret += pow(-1, 0+ i) * m[0][i] * Det(t);
  907. }
  908. }
  909. return ret;
  910. }
  911. GMatrix Inverse(const GMatrix & m)
  912. {
  913. GMatrix ret(m);
  914. ret.SetInverse();
  915. return ret;
  916. }
  917. GMatrix Transpose(const GMatrix & m)
  918. {
  919. GMatrix ret(m);
  920. ret.SetTranspose();
  921. return ret;
  922. }
  923. GMatrix Adjoint(const GMatrix & m)
  924. {
  925. GMatrix tM = Transpose(m);
  926. GMatrix ret(tM.r, tM.c);
  927. int i, j = 0;
  928. for (i = 0; i < tM.r; i++) {
  929. for (j = 0; j < tM.c; j++) {
  930. ret[i][j] = Cij(tM, i, j);
  931. }
  932. }
  933. return ret;
  934. }
  935. GLine::GLine(const GPoint3 & _p, const GVector3 & _v)
  936. {
  937. p = _p;
  938. v = _v;
  939. }
  940. GLine::GLine(const GLine & copy)
  941. {
  942. p = copy.p;
  943. v = copy.v;
  944. }
  945. GLine & GLine::operator=(const GLine & rhs)
  946. {
  947. p = rhs.p;
  948. v = rhs.v;
  949. return *this;
  950. }
  951. GPoint3 GLine::operator()(const float t) const
  952. {
  953. return p + v*t;
  954. }
  955. GLine & GLine::SetPt(const GPoint3 & _p)
  956. {
  957. p = _p;
  958. return *this;
  959. }
  960. GLine & GLine::SetDir(const GVector3 & _v)
  961. {
  962. v = _v;
  963. return *this;
  964. }
  965. GVector3 GLine::GetPt() const
  966. {
  967. return p;
  968. }
  969. GVector3 GLine::GetDir() const
  970. {
  971. return v;
  972. }
  973. bool GLine::IsOnLine(const GPoint3 & q)
  974. {
  975. return EQ_ZERO(dist(q, *this), PRECISION);
  976. }
  977. float dist(const GPoint3 & q, const GLine & l)
  978. {
  979. GVector3 u = q - l.p;
  980. GVector3 p = proj(u, l.v);
  981. return norm(u - p);
  982. }
  983. GPlane::GPlane(const GVector3 & _n, const GPoint3 & _p)
  984. {
  985. n = _n;
  986. d = -n * _p;
  987. }
  988. GPlane::GPlane(const GPoint3 & p1, const GPoint3 & p2, const GPoint3 & p3)
  989. {
  990. n = (p2 - p1) ^ (p3 - p1);
  991. d = -n * p1; //��ƽ���ϵ�һ�����˷�����ȡ����
  992. }
  993. GPlane::GPlane(const float & a, const float & b, const float & c, const float & d)
  994. {
  995. n = GVector3(a, b, c);
  996. this->d = d;
  997. }
  998. GPlane::GPlane(const GPlane & copy)
  999. {
  1000. n = copy.n;
  1001. d = copy.d;
  1002. }
  1003. GPlane& GPlane::operator=(const GPlane & rhs)
  1004. {
  1005. n = rhs.n;
  1006. d = rhs.d;
  1007. return *this;
  1008. }
  1009. GVector3 GPlane::GetNormal() const
  1010. {
  1011. return n;
  1012. }
  1013. float dist(const GPlane & pi, const GPoint3 & p)
  1014. {
  1015. float D;
  1016. D = (p*pi.n + pi.d) / norm(pi.n);
  1017. return D;
  1018. }
  1019. bool intersect_line_plane(GPoint3 & p, const GLine & l, const GPlane & pi)
  1020. {
  1021. //����ֱ�ߵķ�����ƽ���ķ��ߴ�ֱ����ֱ�ߺ�ƽ��ƽ�У�û�н���
  1022. if (EQ_ZERO((l.v*pi.n), PRECISION)) {
  1023. return false;
  1024. }
  1025. float t = -(l.p*pi.n + pi.d) / (l.v * pi.n);
  1026. p = l(t);
  1027. return true;
  1028. }
  1029. bool intersect_line_triangle(GPoint3 & p, const GLine & l, const GPoint3 & p1, const GPoint3 & p2, const GPoint3 & p3)
  1030. {
  1031. GVector3 e1, e2, u, v, w;
  1032. float a, b, t, det;
  1033. e1 = p2 - p1;
  1034. e2 = p3 - p1;
  1035. u = l.v ^ e2;
  1036. det = e1 * u;
  1037. if (EQ_ZERO(det, PRECISION)) {
  1038. return false;
  1039. }
  1040. w = l.p - p1;
  1041. a = w * u / det;
  1042. if (a < 0.0f || a > 1.0f) {
  1043. return false;
  1044. }
  1045. v = w ^ e1;
  1046. b = l.v * v / det;
  1047. if (b < 0.0f || b > 1.0f) {
  1048. return false;
  1049. }
  1050. t = e2 * v / det;
  1051. p = l(t);
  1052. return true;
  1053. }
  1054. GQuater::GQuater(float w, float x, float y, float z)
  1055. {
  1056. this->w = w;
  1057. this->x = x;
  1058. this->y = y;
  1059. this->z = z;
  1060. }
  1061. GQuater::GQuater(const GQuater & copy)
  1062. {
  1063. w = copy.w;
  1064. x = copy.x;
  1065. y = copy.y;
  1066. z = copy.z;
  1067. }
  1068. GQuater::GQuater(GVector3 axis, float theta, bool radian)
  1069. {
  1070. //q=(cosX, sinX(a,b,c))
  1071. float rad, sn, cs;
  1072. axis.normalize();
  1073. if (!radian) {
  1074. rad = theta * M_PI / 360; //��Ϊ��ת����2��X��������������360
  1075. }
  1076. sn = sin(rad);
  1077. cs = cos(rad);
  1078. sn = (abs(sn) < PRECISION) ? 0.0f : sn;
  1079. cs = (abs(cs) < PRECISION) ? 0.0f : cs;
  1080. w = cs;
  1081. x = sn * axis[0];
  1082. y = sn * axis[1];
  1083. z = sn * axis[2];
  1084. }
  1085. GQuater & GQuater::operator=(const GQuater & rhs)
  1086. {
  1087. w = rhs.w;
  1088. x = rhs.x;
  1089. y = rhs.y;
  1090. z = rhs.z;
  1091. return *this;
  1092. }
  1093. GQuater & GQuater::operator+=(const GQuater & rhs)
  1094. {
  1095. w += rhs.w;
  1096. x += rhs.x;
  1097. y += rhs.y;
  1098. z += rhs.z;
  1099. return *this;
  1100. }
  1101. GQuater & GQuater::operator-=(const GQuater & rhs)
  1102. {
  1103. w -= rhs.w;
  1104. x -= rhs.x;
  1105. y -= rhs.y;
  1106. z -= rhs.z;
  1107. return *this;
  1108. }
  1109. GQuater & GQuater::operator*=(const GQuater & rhs)
  1110. {
  1111. float nw, nx, ny, nz = 0;
  1112. nw = w * rhs.w - x*rhs.x - y * rhs.y - z * rhs.z;
  1113. nx = w * rhs.x + rhs.w*x + y * rhs.z - z * rhs.y;
  1114. ny = w * rhs.y + rhs.w*y + z * rhs.x - x * rhs.z;
  1115. nz = w * rhs.z + rhs.w*z + x * rhs.y - y * rhs.x;
  1116. w = nw;
  1117. x = nx;
  1118. y = ny;
  1119. z = nz;
  1120. return *this;
  1121. }
  1122. GQuater & GQuater::operator*=(const float & s)
  1123. {
  1124. w *= s;
  1125. x *= s;
  1126. y *= s;
  1127. z *= s;
  1128. return *this;
  1129. }
  1130. GQuater & GQuater::operator/=(const float & s)
  1131. {
  1132. w /= s;
  1133. x /= s;
  1134. y /= s;
  1135. z /= s;
  1136. return *this;
  1137. }
  1138. GQuater GQuater::operator+() const
  1139. {
  1140. return *this;
  1141. }
  1142. GQuater GQuater::operator-() const
  1143. {
  1144. //return *this*-1.0f;
  1145. return GQuater();
  1146. }
  1147. GQuater GQuater::operator+(const GQuater & rhs) const
  1148. {
  1149. GQuater ret(*this);
  1150. ret += rhs;
  1151. return ret;
  1152. }
  1153. GQuater GQuater::operator-(const GQuater & rhs) const
  1154. {
  1155. GQuater ret(*this);
  1156. ret -= rhs;
  1157. return ret;
  1158. }
  1159. GQuater GQuater::operator*(const GQuater & rhs) const
  1160. {
  1161. GQuater ret(*this);
  1162. ret *= rhs;
  1163. return ret;
  1164. }
  1165. GQuater GQuater::operator*(const float & s) const
  1166. {
  1167. GQuater ret(*this);
  1168. ret *= s;
  1169. return ret;
  1170. }
  1171. GQuater GQuater::operator/(const float & s) const
  1172. {
  1173. GQuater ret(*this);
  1174. ret /= s;
  1175. return ret;
  1176. }
  1177. GQuater & GQuater::Set(const float w, const float x, const float y, const float z)
  1178. {
  1179. this->w = w;
  1180. this->x = x;
  1181. this->y = y;
  1182. this->z = z;
  1183. return *this;
  1184. }
  1185. GQuater & GQuater::Set(float * q, bool invOrder)
  1186. {
  1187. if (invOrder) {
  1188. w = q[1];
  1189. x = q[2];
  1190. y = q[3];
  1191. z = q[0];
  1192. } else {
  1193. w = q[0];
  1194. x = q[1];
  1195. y = q[2];
  1196. z = q[3];
  1197. }
  1198. return *this;
  1199. }
  1200. bool GQuater::IsUnitQuater() const
  1201. {
  1202. float len = SQR(w) + SQR(x) + SQR(y) + SQR(z);
  1203. return EQ(len, 1.0f, PRECISION) ? true : false;
  1204. }
  1205. bool GQuater::IsIdentity() const
  1206. {
  1207. return EQ(w,1.0f,PRECISION) && EQ(x, 0.0f, PRECISION) && EQ(y, 0.0f, PRECISION) && EQ(z, 0.0f, PRECISION);
  1208. }
  1209. GQuater & GQuater::Normalize()
  1210. {
  1211. float len = SQR(w) + SQR(x) + SQR(y) + SQR(z);
  1212. w /= len;
  1213. x /= len;
  1214. y /= len;
  1215. z /= len;
  1216. return *this;
  1217. }
  1218. GQuater & GQuater::SetIdentitf()
  1219. {
  1220. w /= 1.0f;
  1221. x /= 0.0f;
  1222. y /= 0.0f;
  1223. z /= 0.0f;
  1224. return *this;
  1225. }
  1226. GQuater & GQuater::SetConjugate()
  1227. {
  1228. x *= -1.0f;
  1229. y *= -1.0f;
  1230. z *= -1.0f;
  1231. return *this;
  1232. }
  1233. GQuater & GQuater::SetInverse()
  1234. {
  1235. if (!IsUnitQuater()) {//�������ǵ�λ��Ԫ��Ҫ�ȵ�λ��
  1236. float len = SQR(w) + SQR(x) + SQR(y) + SQR(z);
  1237. *this /= len;
  1238. }
  1239. SetConjugate();
  1240. return *this;
  1241. }
  1242. GQuater operator*(const float & s, const GQuater & rhs)
  1243. {
  1244. GQuater ret(rhs);
  1245. ret *= s;
  1246. return ret;
  1247. }
  1248. ostream & operator<<(ostream & os, const GQuater & q)
  1249. {
  1250. os << "(" << setw(2) << q.w << ", " << setw(2) << q.x << ", " << setw(2) << q.y << ", " << setw(2) << q.z << ")";
  1251. return os;
  1252. }
  1253. float norm(const GQuater & q)
  1254. {
  1255. float norm = SQRT(SQR(q.w) + SQR(q.x) + SQR(q.y) + SQR(q.z));
  1256. return norm;
  1257. }
  1258. GQuater inv(const GQuater & q)
  1259. {
  1260. GQuater ret(q);
  1261. if (!ret.IsUnitQuater()) {//�������ǵ�λ��Ԫ��Ҫ�ȵ�λ��
  1262. float t = SQR(ret.w) + SQR(ret.x) + SQR(ret.y) + SQR(ret.z);
  1263. ret /= t;
  1264. }
  1265. ret.Set(ret.w, -ret.x, -ret.y, -ret.z);
  1266. return ret;
  1267. }