globals.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:25k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: globals.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:48:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_MATH___GLOBALS__HPP
  10. #define GUI_MATH___GLOBALS__HPP
  11. /*  $Id: globals.hpp,v 1000.2 2004/06/01 19:48:46 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software / database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software / database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <vector>
  43. /** @addtogroup GUI_MATH
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. // predeclarations of the types we use
  49. template <class T> class CVect2;
  50. template <class T> class CVect3;
  51. template <class T> class CVect4;
  52. template <class T> class CMatrix3;
  53. template <class T> class CMatrix4;
  54. END_NCBI_SCOPE
  55. // Promotion rules
  56. // we keep these in a separate file because they're long
  57. #include <gui/math/promote.hpp>
  58. #include <gui/math/vect2.hpp>
  59. #include <gui/math/vect3.hpp>
  60. #include <gui/math/vect4.hpp>
  61. #include <gui/math/matrix3.hpp>
  62. #include <gui/math/matrix4.hpp>
  63. // general utilities
  64. #include <math.h>
  65. #include <gui/math/math.hpp>
  66. BEGIN_NCBI_SCOPE
  67. //
  68. //
  69. // Global operators
  70. //
  71. //
  72. //
  73. // 
  74. // CVect<> templates
  75. // 
  76. //
  77. //
  78. // global addition: CVect*<> + CVect*<>
  79. //
  80. template <class T, class U>
  81. inline CVect2< NCBI_PROMOTE(T,U) >
  82. operator+ (const CVect2<T>& v1, const CVect2<U>& v2)
  83. {
  84.     return
  85.         CVect2< NCBI_PROMOTE(T,U) >
  86.         (v1[0]+v2[0], v1[1]+v2[1]);
  87. }
  88. template <class T, class U>
  89. inline CVect3< NCBI_PROMOTE(T,U) >
  90. operator+ (const CVect3<T>& v1, const CVect3<U>& v2)
  91. {
  92.     return
  93.         CVect3< NCBI_PROMOTE(T,U) >
  94.         (v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2]);
  95. }
  96. template <class T, class U>
  97. inline CVect4< NCBI_PROMOTE(T,U) >
  98. operator+ (const CVect4<T>& v1, const CVect4<U>& v2)
  99. {
  100.     return
  101.         CVect4< NCBI_PROMOTE(T,U) >
  102.         (v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2], v1[3]+v2[3]);
  103. }
  104. //
  105. // global addition: const + CVect*<>
  106. // we do this with macros because not all compilers support partial template
  107. // specialization
  108. //
  109. #define NCBI_ADD_VECT2(type) 
  110. template <class U> 
  111. inline CVect2< NCBI_PROMOTE(type,U) > 
  112. operator+ (type v1, const CVect2<U>& v2) 
  113.     return 
  114.         CVect2< NCBI_PROMOTE(type,U) > 
  115.         (v1 + v2[0], v1 + v2[1]); 
  116. template <class T> 
  117. inline CVect2< NCBI_PROMOTE(T,type) > 
  118. operator+ (const CVect2<T>& v1, type v2) 
  119.     return 
  120.         CVect2< NCBI_PROMOTE(T,type) > 
  121.         (v1[0] + v2, v1[1] + v2); 
  122. }
  123. NCBI_ADD_VECT2(int)
  124. NCBI_ADD_VECT2(float)
  125. NCBI_ADD_VECT2(double)
  126. #undef NCBI_ADD_VECT2
  127. #define NCBI_ADD_VECT3(type) 
  128. template <class U> 
  129. inline CVect3< NCBI_PROMOTE(type,U) > 
  130. operator+ (type v1, const CVect3<U>& v2) 
  131.     return 
  132.         CVect3< NCBI_PROMOTE(type,U) > 
  133.         (v1 + v2[0], v1 + v2[1], v1 + v2[2]); 
  134. template <class T> 
  135. inline CVect3< NCBI_PROMOTE(T,type) > 
  136. operator+ (const CVect3<T>& v1, type v2) 
  137.     return 
  138.         CVect3< NCBI_PROMOTE(T,type) > 
  139.         (v1[0] + v2, v1[1] + v2, v1[2] + v2); 
  140. }
  141. NCBI_ADD_VECT3(int)
  142. NCBI_ADD_VECT3(float)
  143. NCBI_ADD_VECT3(double)
  144. #undef NCBI_ADD_VECT3
  145. #define NCBI_ADD_VECT4(type) 
  146. template <class U> 
  147. inline CVect4< NCBI_PROMOTE(type,U) > 
  148. operator+ (type v1, const CVect4<U>& v2) 
  149.     return 
  150.         CVect4< NCBI_PROMOTE(type,U) > 
  151.         (v1 + v2[0], v1 + v2[1], v1 + v2[2], v1 + v2[3]); 
  152. template <class T> 
  153. inline CVect4< NCBI_PROMOTE(T,type) > 
  154. operator+ (const CVect4<T>& v1, type v2) 
  155.     return 
  156.         CVect4< NCBI_PROMOTE(T,type) > 
  157.         (v1[0] + v2, v1[1] + v2, v1[2] + v2, v1[3] + v2); 
  158. }
  159. NCBI_ADD_VECT4(int)
  160. NCBI_ADD_VECT4(float)
  161. NCBI_ADD_VECT4(double)
  162. #undef NCBI_ADD_VECT4
  163. //
  164. // global unary negation
  165. //
  166. template <class T>
  167. inline CVect2<T>
  168. operator- (const CVect2<T>& v)
  169. {
  170.     return CVect2<T> (-v[0], -v[1]);
  171. }
  172. template <class T>
  173. inline CVect3<T>
  174. operator- (const CVect3<T>& v)
  175. {
  176.     return CVect3<T> (-v[0], -v[1], -v[2]);
  177. }
  178. template <class T>
  179. inline CVect4<T>
  180. operator- (const CVect4<T>& v)
  181. {
  182.     return CVect4<T> (-v[0], -v[1], -v[2], -v[3]);
  183. }
  184. //
  185. // global subtraction: CVect*<> - CVect*<>
  186. //
  187. template <class T, class U>
  188. inline CVect2< NCBI_PROMOTE(T,U) >
  189. operator- (const CVect2<T>& v1, const CVect2<U>& v2)
  190. {
  191.     return
  192.         CVect2< NCBI_PROMOTE(T,U) >
  193.         (v1[0]-v2[0], v1[1]-v2[1]);
  194. }
  195. template <class T, class U>
  196. inline CVect3< NCBI_PROMOTE(T,U) >
  197. operator- (const CVect3<T>& v1, const CVect3<U>& v2)
  198. {
  199.     return
  200.         CVect3< NCBI_PROMOTE(T,U) >
  201.         (v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]);
  202. }
  203. template <class T, class U>
  204. inline CVect4< NCBI_PROMOTE(T,U) >
  205. operator- (const CVect4<T>& v1, const CVect4<U>& v2)
  206. {
  207.     return
  208.         CVect4< NCBI_PROMOTE(T,U) >
  209.         (v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2], v1[3]-v2[3]);
  210. }
  211. //
  212. // global subtraction: const + CVect*<>
  213. // we do this with macros because not all compilers support partial template
  214. // specialization
  215. //
  216. #define NCBI_SUBTRACT_VECT2(type) 
  217. template <class U> 
  218. inline CVect2< NCBI_PROMOTE(type,U) > 
  219. operator- (type v1, const CVect2<U>& v2) 
  220.     return 
  221.         CVect2< NCBI_PROMOTE(type,U) > 
  222.         (v1 - v2[0], v1 - v2[1]); 
  223. template <class T> 
  224. inline CVect2< NCBI_PROMOTE(T,type) > 
  225. operator- (const CVect2<T>& v1, type v2) 
  226.     return 
  227.         CVect2< NCBI_PROMOTE(T,type) > 
  228.         (v1[0] - v2, v1[1] - v2); 
  229. }
  230. NCBI_SUBTRACT_VECT2(int)
  231. NCBI_SUBTRACT_VECT2(float)
  232. NCBI_SUBTRACT_VECT2(double)
  233. #undef NCBI_SUBTRACT_VECT2
  234. #define NCBI_SUBTRACT_VECT3(type) 
  235. template <class U> 
  236. inline CVect3< NCBI_PROMOTE(type,U) > 
  237. operator- (type v1, const CVect3<U>& v2) 
  238.     return 
  239.         CVect3< NCBI_PROMOTE(type,U) > 
  240.         (v1 - v2[0], v1 - v2[1], v1 - v2[2]); 
  241. template <class T> 
  242. inline CVect3< NCBI_PROMOTE(T,type) > 
  243. operator- (const CVect3<T>& v1, type v2) 
  244.     return 
  245.         CVect3< NCBI_PROMOTE(T,type) > 
  246.         (v1[0] - v2, v1[1] - v2, v1[2] - v2); 
  247. }
  248. NCBI_SUBTRACT_VECT3(int)
  249. NCBI_SUBTRACT_VECT3(float)
  250. NCBI_SUBTRACT_VECT3(double)
  251. #undef NCBI_SUBTRACT_VECT3
  252. #define NCBI_SUBTRACT_VECT4(type) 
  253. template <class U> 
  254. inline CVect4< NCBI_PROMOTE(type,U) > 
  255. operator- (type v1, const CVect4<U>& v2) 
  256.     return 
  257.         CVect4< NCBI_PROMOTE(type,U) > 
  258.         (v1 - v2[0], v1 - v2[1], v1 - v2[2], v1 - v2[3]); 
  259. template <class T> 
  260. inline CVect4< NCBI_PROMOTE(T,type) > 
  261. operator- (const CVect4<T>& v1, type v2) 
  262.     return 
  263.         CVect4< NCBI_PROMOTE(T,type) > 
  264.         (v1[0] - v2, v1[1] - v2, v1[2] - v2, v1[3] - v2); 
  265. }
  266. NCBI_SUBTRACT_VECT4(int)
  267. NCBI_SUBTRACT_VECT4(float)
  268. NCBI_SUBTRACT_VECT4(double)
  269. #undef NCBI_SUBTRACT_VECT4
  270. //
  271. // global subtraction: const + CVect*<>
  272. // we do this with macros because not all compilers support partial template
  273. // specialization
  274. //
  275. #define NCBI_MULTIPLY_VECT2(type) 
  276. template <class U> 
  277. inline CVect2< NCBI_PROMOTE(type,U) > 
  278. operator* (type v1, const CVect2<U>& v2) 
  279.     return 
  280.         CVect2< NCBI_PROMOTE(type,U) > 
  281.         (v1 * v2[0], v1 * v2[1]); 
  282. template <class T> 
  283. inline CVect2< NCBI_PROMOTE(T,type) > 
  284. operator* (const CVect2<T>& v1, type v2) 
  285.     return 
  286.         CVect2< NCBI_PROMOTE(T,type) > 
  287.         (v1[0] * v2, v1[1] * v2); 
  288. }
  289. NCBI_MULTIPLY_VECT2(int)
  290. NCBI_MULTIPLY_VECT2(float)
  291. NCBI_MULTIPLY_VECT2(double)
  292. #undef NCBI_MULTIPLY_VECT2
  293. #define NCBI_MULTIPLY_VECT3(type) 
  294. template <class U> 
  295. inline CVect3< NCBI_PROMOTE(type,U) > 
  296. operator* (type v1, const CVect3<U>& v2) 
  297.     return 
  298.         CVect3< NCBI_PROMOTE(type,U) > 
  299.         (v1 * v2[0], v1 * v2[1], v1 * v2[2]); 
  300. template <class T> 
  301. inline CVect3< NCBI_PROMOTE(T,type) > 
  302. operator* (const CVect3<T>& v1, type v2) 
  303.     return 
  304.         CVect3< NCBI_PROMOTE(T,type) > 
  305.         (v1[0] * v2, v1[1] * v2, v1[2] * v2); 
  306. }
  307. NCBI_MULTIPLY_VECT3(int)
  308. NCBI_MULTIPLY_VECT3(float)
  309. NCBI_MULTIPLY_VECT3(double)
  310. #undef NCBI_MULTIPLY_VECT3
  311. #define NCBI_MULTIPLY_VECT4(type) 
  312. template <class U> 
  313. inline CVect4< NCBI_PROMOTE(type,U) > 
  314. operator* (type v1, const CVect4<U>& v2) 
  315.     return 
  316.         CVect4< NCBI_PROMOTE(type,U) > 
  317.         (v1 * v2[0], v1 * v2[1], v1 * v2[2], v1 * v2[3]); 
  318. template <class T> 
  319. inline CVect4< NCBI_PROMOTE(T,type) > 
  320. operator* (const CVect4<T>& v1, type v2) 
  321.     return 
  322.         CVect4< NCBI_PROMOTE(T,type) > 
  323.         (v1[0] * v2, v1[1] * v2, v1[2] * v2, v1[3] * v2); 
  324. }
  325. NCBI_MULTIPLY_VECT4(int)
  326. NCBI_MULTIPLY_VECT4(float)
  327. NCBI_MULTIPLY_VECT4(double)
  328. #undef NCBI_MULTIPLY_VECT4
  329. //
  330. // global multiplication: CVect*<> * CVect*<>
  331. // we define this as dot!
  332. //
  333. template <class T, class U>
  334. inline NCBI_PROMOTE(T,U)
  335. operator* (const CVect2<T>& v1, const CVect2<U>& v2)
  336. {
  337.     return (v1[0] * v2[0] +
  338.             v1[1] * v2[1]);
  339. }
  340. template <class T, class U>
  341. inline NCBI_PROMOTE(T,U)
  342. operator* (const CVect3<T>& v1, const CVect3<U>& v2)
  343. {
  344.     return (v1[0] * v2[0] +
  345.             v1[1] * v2[1] +
  346.             v1[2] * v2[2]);
  347. }
  348. template <class T, class U>
  349. inline NCBI_PROMOTE(T,U)
  350. operator* (const CVect4<T>& v1, const CVect4<U>& v2)
  351. {
  352.     return (v1[0] * v2[0] +
  353.             v1[1] * v2[1] +
  354.             v1[2] * v2[2] +
  355.             v1[3] * v2[3]);
  356. }
  357. //
  358. // global division: CVect*<> / const
  359. //
  360. template <class T, class U>
  361. inline CVect2< NCBI_PROMOTE(T,U) >
  362. operator/ (const CVect2<T>& v1, U v2)
  363. {
  364.     v2 = T(1) / v2;
  365.     return
  366.         CVect2< NCBI_PROMOTE(T,U) >
  367.         (v1[0]*v2, v1[1]*v2);
  368. }
  369. template <class T, class U>
  370. inline CVect3< NCBI_PROMOTE(T,U) >
  371. operator/ (const CVect3<T>& v1, U v2)
  372. {
  373.     v2 = T(1) / v2;
  374.     return
  375.         CVect3< NCBI_PROMOTE(T,U) >
  376.         (v1[0]*v2, v1[1]*v2, v1[2]*v2);
  377. }
  378. template <class T, class U>
  379. inline CVect4< NCBI_PROMOTE(T,U) >
  380. operator/ (const CVect4<T>& v1, U v2)
  381. {
  382.     v2 = T(1) / v2;
  383.     return
  384.         CVect4< NCBI_PROMOTE(T,U) >
  385.         (v1[0]*v2, v1[1]*v2, v1[2]*v2, v1[3]*v2);
  386. }
  387. //
  388. // global comparison: equals
  389. // 
  390. template <class T, class U>
  391. inline bool
  392. operator== (const CVect2<T>& v1, const CVect2<U>& v2)
  393. {
  394.     return (v1[0] == v2[0]  &&  
  395.             v1[1] == v2[1]);
  396. }
  397. template <class T, class U>
  398. inline bool
  399. operator== (const CVect3<T>& v1, const CVect3<U>& v2)
  400. {
  401.     return (v1[0] == v2[0]  &&  
  402.             v1[1] == v2[1]  &&  
  403.             v1[2] == v2[2]);
  404. }
  405. template <class T, class U>
  406. inline bool
  407. operator== (const CVect4<T>& v1, const CVect4<U>& v2)
  408. {
  409.     return (v1[0] == v2[0]  &&  
  410.             v1[1] == v2[1]  &&  
  411.             v1[2] == v2[2]  &&  
  412.             v1[3] == v2[3]);
  413. }
  414. //
  415. // global comparison: less than
  416. // 
  417. template <class T, class U>
  418. inline bool
  419. operator< (const CVect2<T>& v1, const CVect2<U>& v2)
  420. {
  421.     if (v1[0] < v2[0]) {
  422.         return true;
  423.     } else if (v1[0] > v2[0]) {
  424.         return false;
  425.     }
  426.     if (v1[1] < v2[1]) {
  427.         return true;
  428.     }
  429.     return false;
  430. }
  431. template <class T, class U>
  432. inline bool
  433. operator< (const CVect3<T>& v1, const CVect3<U>& v2)
  434. {
  435.     if (v1[0] < v2[0]) {
  436.         return true;
  437.     } else if (v1[0] > v2[0]) {
  438.         return false;
  439.     }
  440.     if (v1[1] < v2[1]) {
  441.         return true;
  442.     } else if (v1[1] > v2[1]) {
  443.         return false;
  444.     }
  445.     if (v1[2] < v2[2]) {
  446.         return true;
  447.     }
  448.     return false;
  449. }
  450. template <class T, class U>
  451. inline bool
  452. operator< (const CVect4<T>& v1, const CVect4<U>& v2)
  453. {
  454.     if (v1[0] < v2[0]) {
  455.         return true;
  456.     } else if (v1[0] > v2[0]) {
  457.         return false;
  458.     }
  459.     if (v1[1] < v2[1]) {
  460.         return true;
  461.     } else if (v1[1] > v2[1]) {
  462.         return false;
  463.     }
  464.     if (v1[2] < v2[2]) {
  465.         return true;
  466.     } else if (v1[2] > v2[2]) {
  467.         return false;
  468.     }
  469.     if (v1[3] < v2[3]) {
  470.         return true;
  471.     }
  472.     return false;
  473. }
  474. //
  475. //
  476. //
  477. // Matrices
  478. //
  479. //
  480. //
  481. //
  482. // global addition: matrix + matrix
  483. //
  484. template <class T, class U>
  485. inline CMatrix3< NCBI_PROMOTE(T,U) >
  486. operator+ (const CMatrix3<T>& m1, const CMatrix3<U>& m2)
  487. {
  488.     return
  489.         CMatrix3< NCBI_PROMOTE(T,U) >
  490.         (m1[0]+m2[0], m1[1]+m2[1], m1[2]+m2[2],
  491.          m1[3]+m2[3], m1[4]+m2[4], m1[5]+m2[5],
  492.          m1[6]+m2[6], m1[7]+m2[7], m1[8]+m2[8]);
  493. }
  494. template <class T, class U>
  495. inline CMatrix4< NCBI_PROMOTE(T,U) >
  496. operator+ (const CMatrix4<T>& m1, const CMatrix4<U>& m2)
  497. {
  498.     return
  499.         CMatrix4< NCBI_PROMOTE(T,U) >
  500.         (m1[ 0]+m2[ 0], m1[ 1]+m2[ 1], m1[ 2]+m2[ 2], m1[ 3]+m2[ 3], 
  501.          m1[ 4]+m2[ 4], m1[ 5]+m2[ 5], m1[ 6]+m2[ 6], m1[ 7]+m2[ 7], 
  502.          m1[ 8]+m2[ 8], m1[ 9]+m2[ 9], m1[10]+m2[10], m1[11]+m2[11], 
  503.          m1[12]+m2[12], m1[13]+m2[13], m1[14]+m2[14], m1[15]+m2[15]);
  504. }
  505. //
  506. // global addition: scalar + matrix
  507. //
  508. #define NCBI_ADD_MATRIX3(type) 
  509. template <class U> 
  510. inline CMatrix3< NCBI_PROMOTE(type,U) > 
  511. operator+ (type s, const CMatrix3<U>& m) 
  512.     return 
  513.         CMatrix3< NCBI_PROMOTE(type,U) > 
  514.         (m[0]+s, m[1]+s, m[2]+s, 
  515.          m[3]+s, m[4]+s, m[5]+s, 
  516.          m[6]+s, m[7]+s, m[8]+s); 
  517. template <class T> 
  518. inline CMatrix3< NCBI_PROMOTE(T,type) > 
  519. operator+ (const CMatrix3<T>& m, type s) 
  520.     return 
  521.         CMatrix3< NCBI_PROMOTE(T,type) > 
  522.         (m[0]+s, m[1]+s, m[2]+s, 
  523.          m[3]+s, m[4]+s, m[5]+s, 
  524.          m[6]+s, m[7]+s, m[8]+s); 
  525. }
  526. NCBI_ADD_MATRIX3(int)
  527. NCBI_ADD_MATRIX3(float)
  528. NCBI_ADD_MATRIX3(double)
  529. #undef NCBI_ADD_MATRIX3
  530. #define NCBI_ADD_MATRIX4(type) 
  531. template <class U> 
  532. inline CMatrix4< NCBI_PROMOTE(type,U) > 
  533. operator+ (type s, const CMatrix4<U>& m) 
  534.     return 
  535.         CMatrix4< NCBI_PROMOTE(type,U) > 
  536.         (m[ 0]+s, m[ 1]+s, m[ 2]+s, m[ 3]+s,  
  537.          m[ 4]+s, m[ 5]+s, m[ 6]+s, m[ 7]+s,  
  538.          m[ 8]+s, m[ 9]+s, m[10]+s, m[11]+s,  
  539.          m[12]+s, m[13]+s, m[14]+s, m[15]+s); 
  540. template <class T> 
  541. inline CMatrix4< NCBI_PROMOTE(T,type) > 
  542. operator+ (const CMatrix4<T>& m, type s) 
  543.     return 
  544.         CMatrix4< NCBI_PROMOTE(T,type) > 
  545.         (m[ 0]+s, m[ 1]+s, m[ 2]+s, m[ 3]+s,  
  546.          m[ 4]+s, m[ 5]+s, m[ 6]+s, m[ 7]+s,  
  547.          m[ 8]+s, m[ 9]+s, m[10]+s, m[11]+s,  
  548.          m[12]+s, m[13]+s, m[14]+s, m[15]+s); 
  549. }
  550. NCBI_ADD_MATRIX4(int)
  551. NCBI_ADD_MATRIX4(float)
  552. NCBI_ADD_MATRIX4(double)
  553. #undef NCBI_ADD_MATRIX3
  554. //
  555. // global addition: scalar - matrix
  556. //
  557. #define NCBI_SUBTRACT_MATRIX3(type) 
  558. template <class U> 
  559. inline CMatrix3< NCBI_PROMOTE(type,U) > 
  560. operator- (type s, const CMatrix3<U>& m) 
  561.     return 
  562.         CMatrix3< NCBI_PROMOTE(type,U) > 
  563.         (m[0]-s, m[1]-s, m[2]-s, 
  564.          m[3]-s, m[4]-s, m[5]-s, 
  565.          m[6]-s, m[7]-s, m[8]-s); 
  566. template <class T> 
  567. inline CMatrix3< NCBI_PROMOTE(T,type) > 
  568. operator- (const CMatrix3<T>& m, type s) 
  569.     return 
  570.         CMatrix3< NCBI_PROMOTE(T,type) > 
  571.         (m[0]-s, m[1]-s, m[2]-s, 
  572.          m[3]-s, m[4]-s, m[5]-s, 
  573.          m[6]-s, m[7]-s, m[8]-s); 
  574. }
  575. NCBI_SUBTRACT_MATRIX3(int)
  576. NCBI_SUBTRACT_MATRIX3(float)
  577. NCBI_SUBTRACT_MATRIX3(double)
  578. #undef NCBI_SUBTRACT_MATRIX3
  579. #define NCBI_SUBTRACT_MATRIX4(type) 
  580. template <class U> 
  581. inline CMatrix4< NCBI_PROMOTE(type,U) > 
  582. operator- (type s, const CMatrix4<U>& m) 
  583.     return 
  584.         CMatrix4< NCBI_PROMOTE(type,U) > 
  585.         (m[ 0]-s, m[ 1]-s, m[ 2]-s, m[ 3]-s,  
  586.          m[ 4]-s, m[ 5]-s, m[ 6]-s, m[ 7]-s,  
  587.          m[ 8]-s, m[ 9]-s, m[10]-s, m[11]-s,  
  588.          m[12]-s, m[13]-s, m[14]-s, m[15]-s); 
  589. template <class T> 
  590. inline CMatrix4< NCBI_PROMOTE(T,type) > 
  591. operator- (const CMatrix4<T>& m, type s) 
  592.     return 
  593.         CMatrix4< NCBI_PROMOTE(T,type) > 
  594.         (m[ 0]-s, m[ 1]-s, m[ 2]-s, m[ 3]-s,  
  595.          m[ 4]-s, m[ 5]-s, m[ 6]-s, m[ 7]-s,  
  596.          m[ 8]-s, m[ 9]-s, m[10]-s, m[11]-s,  
  597.          m[12]-s, m[13]-s, m[14]-s, m[15]-s); 
  598. }
  599. NCBI_SUBTRACT_MATRIX4(int)
  600. NCBI_SUBTRACT_MATRIX4(float)
  601. NCBI_SUBTRACT_MATRIX4(double)
  602. #undef NCBI_SUBTRACT_MATRIX3
  603. //
  604. // global addition: scalar * matrix
  605. //
  606. #define NCBI_MULTIPLY_MATRIX3(type) 
  607. template <class U> 
  608. inline CMatrix3< NCBI_PROMOTE(type,U) > 
  609. operator* (type s, const CMatrix3<U>& m) 
  610.     return 
  611.         CMatrix3< NCBI_PROMOTE(type,U) > 
  612.         (m[0]*s, m[1]*s, m[2]*s, 
  613.          m[3]*s, m[4]*s, m[5]*s, 
  614.          m[6]*s, m[7]*s, m[8]*s); 
  615. template <class T> 
  616. inline CMatrix3< NCBI_PROMOTE(T,type) > 
  617. operator* (const CMatrix3<T>& m, type s) 
  618.     return 
  619.         CMatrix3< NCBI_PROMOTE(T,type) > 
  620.         (m[0]*s, m[1]*s, m[2]*s, 
  621.          m[3]*s, m[4]*s, m[5]*s, 
  622.          m[6]*s, m[7]*s, m[8]*s); 
  623. }
  624. NCBI_MULTIPLY_MATRIX3(int)
  625. NCBI_MULTIPLY_MATRIX3(float)
  626. NCBI_MULTIPLY_MATRIX3(double)
  627. #undef NCBI_MULTIPLY_MATRIX3
  628. #define NCBI_MULTIPLY_MATRIX4(type) 
  629. template <class U> 
  630. inline CMatrix4< NCBI_PROMOTE(type,U) > 
  631. operator* (type s, const CMatrix4<U>& m) 
  632.     return 
  633.         CMatrix4< NCBI_PROMOTE(type,U) > 
  634.         (m[ 0]*s, m[ 1]*s, m[ 2]*s, m[ 3]*s,  
  635.          m[ 4]*s, m[ 5]*s, m[ 6]*s, m[ 7]*s,  
  636.          m[ 8]*s, m[ 9]*s, m[10]*s, m[11]*s,  
  637.          m[12]*s, m[13]*s, m[14]*s, m[15]*s); 
  638. template <class T> 
  639. inline CMatrix4< NCBI_PROMOTE(T,type) > 
  640. operator* (const CMatrix4<T>& m, type s) 
  641.     return 
  642.         CMatrix4< NCBI_PROMOTE(T,type) > 
  643.         (m[ 0]*s, m[ 1]*s, m[ 2]*s, m[ 3]*s,  
  644.          m[ 4]*s, m[ 5]*s, m[ 6]*s, m[ 7]*s,  
  645.          m[ 8]*s, m[ 9]*s, m[10]*s, m[11]*s,  
  646.          m[12]*s, m[13]*s, m[14]*s, m[15]*s); 
  647. }
  648. NCBI_MULTIPLY_MATRIX4(int)
  649. NCBI_MULTIPLY_MATRIX4(float)
  650. NCBI_MULTIPLY_MATRIX4(double)
  651. #undef NCBI_MULTIPLY_MATRIX3
  652. //
  653. // global subtraction: matrix - matrix
  654. //
  655. template <class T, class U>
  656. inline CMatrix3< NCBI_PROMOTE(T,U) >
  657. operator- (const CMatrix3<T>& m1, const CMatrix3<U>& m2)
  658. {
  659.     return
  660.         CMatrix3< NCBI_PROMOTE(T,U) >
  661.         (m1[0]-m2[0], m1[1]-m2[1], m1[2]-m2[2],
  662.          m1[3]-m2[3], m1[4]-m2[4], m1[5]-m2[5],
  663.          m1[6]-m2[6], m1[7]-m2[7], m1[8]-m2[8]);
  664. }
  665. template <class T, class U>
  666. inline CMatrix4< NCBI_PROMOTE(T,U) >
  667. operator- (const CMatrix4<T>& m1, const CMatrix4<U>& m2)
  668. {
  669.     return
  670.         CMatrix4< NCBI_PROMOTE(T,U) >
  671.         (m1[ 0]-m2[ 0], m1[ 1]-m2[ 1], m1[ 2]-m2[ 2], m1[ 3]-m2[ 3], 
  672.          m1[ 4]-m2[ 4], m1[ 5]-m2[ 5], m1[ 6]-m2[ 6], m1[ 7]-m2[ 7], 
  673.          m1[ 8]-m2[ 8], m1[ 9]-m2[ 9], m1[10]-m2[10], m1[11]-m2[11], 
  674.          m1[12]-m2[12], m1[13]-m2[13], m1[14]-m2[14], m1[15]-m2[15]);
  675. }
  676. //
  677. // global multiplication: matrix * CVect*<>
  678. // vector assumed to be a column vector!
  679. //
  680. template <class T, class U>
  681. inline CVect3< NCBI_PROMOTE(T,U) >
  682. operator* (const CMatrix3<T>& m, const CVect3<U>& v)
  683. {
  684.     return
  685.         CVect3< NCBI_PROMOTE(T,U) >
  686.         (m[0]*v[0] + m[1]*v[1] + m[2]*v[2],
  687.          m[3]*v[0] + m[4]*v[1] + m[5]*v[2],
  688.          m[6]*v[0] + m[7]*v[1] + m[8]*v[2] );
  689. }
  690. template <class T, class U>
  691. inline CVect4< NCBI_PROMOTE(T,U) >
  692. operator* (const CMatrix4<T>& m, const CVect4<U>& v)
  693. {
  694.     return
  695.         CVect4< NCBI_PROMOTE(T,U) >
  696.         (m[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2] + m[ 3]*v[3],
  697.          m[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2] + m[ 7]*v[3],
  698.          m[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3],
  699.          m[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3] );
  700. }
  701. //
  702. // global multiplication: CVect*<> * matrix
  703. // vector assumed to be a row vector!
  704. //
  705. template <class T, class U>
  706. inline CVect3< NCBI_PROMOTE(T,U) >
  707. operator* (const CVect3<T>& v, const CMatrix3<U>& m)
  708. {
  709.     return
  710.         CVect3< NCBI_PROMOTE(T,U) >
  711.         (v[0]*m[0] + v[1]*m[3] + v[2]*m[6],
  712.          v[0]*m[1] + v[1]*m[4] + v[2]*m[7],
  713.          v[0]*m[2] + v[1]*m[5] + v[2]*m[8] );
  714. }
  715. template <class T, class U>
  716. inline CVect4< NCBI_PROMOTE(T,U) >
  717. operator* (const CVect4<T>& v, const CMatrix4<U>& m)
  718. {
  719.     return
  720.         CVect4< NCBI_PROMOTE(T,U) >
  721.         (v[0]*m[ 0] + v[1]*m[ 4] + v[2]*m[ 8] + m[12]*v[3],
  722.          v[0]*m[ 1] + v[1]*m[ 5] + v[2]*m[ 9] + m[13]*v[3],
  723.          v[0]*m[ 2] + v[1]*m[ 6] + v[2]*m[10] + m[14]*v[3],
  724.          v[0]*m[ 3] + v[1]*m[ 7] + v[2]*m[11] + m[15]*v[3] );
  725. }
  726. //
  727. // global multiplication: matrix + matrix
  728. //
  729. template <class T, class U>
  730. inline CMatrix3< NCBI_PROMOTE(T,U) >
  731. operator* (const CMatrix3<T>& m1, const CMatrix3<U>& m2)
  732. {
  733.     return
  734.         CMatrix3< NCBI_PROMOTE(T,U) >
  735.         (m1[0]*m2[0] + m1[1]*m2[3] + m1[2]*m2[6],
  736.          m1[0]*m2[1] + m1[1]*m2[4] + m1[2]*m2[7],
  737.          m1[0]*m2[2] + m1[1]*m2[5] + m1[2]*m2[8],
  738.          m1[3]*m2[0] + m1[4]*m2[3] + m1[5]*m2[6],
  739.          m1[3]*m2[1] + m1[4]*m2[4] + m1[5]*m2[7],
  740.          m1[3]*m2[2] + m1[4]*m2[5] + m1[5]*m2[8],
  741.          m1[6]*m2[0] + m1[7]*m2[3] + m1[8]*m2[6],
  742.          m1[6]*m2[1] + m1[7]*m2[4] + m1[8]*m2[7],
  743.          m1[6]*m2[2] + m1[7]*m2[5] + m1[8]*m2[8]);
  744. }
  745. template <class T, class U>
  746. inline CMatrix4< NCBI_PROMOTE(T,U) >
  747. operator* (const CMatrix4<T>& m1, const CMatrix4<U>& m2)
  748. {
  749.     return
  750.         CMatrix4< NCBI_PROMOTE(T,U) >
  751.         (m1[ 0]*m2[ 0] + m1[ 1]*m2[ 4] + m1[ 2]*m2[ 8] + m1[ 3]*m2[12],
  752.          m1[ 0]*m2[ 1] + m1[ 1]*m2[ 5] + m1[ 2]*m2[ 9] + m1[ 3]*m2[13],
  753.          m1[ 0]*m2[ 2] + m1[ 1]*m2[ 6] + m1[ 2]*m2[10] + m1[ 3]*m2[14],
  754.          m1[ 0]*m2[ 3] + m1[ 1]*m2[ 7] + m1[ 2]*m2[11] + m1[ 3]*m2[15],
  755.          m1[ 4]*m2[ 0] + m1[ 5]*m2[ 4] + m1[ 6]*m2[ 8] + m1[ 7]*m2[12],
  756.          m1[ 4]*m2[ 1] + m1[ 5]*m2[ 5] + m1[ 6]*m2[ 9] + m1[ 7]*m2[13],
  757.          m1[ 4]*m2[ 2] + m1[ 5]*m2[ 6] + m1[ 6]*m2[10] + m1[ 7]*m2[14],
  758.          m1[ 4]*m2[ 3] + m1[ 5]*m2[ 7] + m1[ 6]*m2[11] + m1[ 7]*m2[15],
  759.          m1[ 8]*m2[ 0] + m1[ 9]*m2[ 4] + m1[10]*m2[ 8] + m1[11]*m2[12],
  760.          m1[ 8]*m2[ 1] + m1[ 9]*m2[ 5] + m1[10]*m2[ 9] + m1[11]*m2[13],
  761.          m1[ 8]*m2[ 2] + m1[ 9]*m2[ 6] + m1[10]*m2[10] + m1[11]*m2[14],
  762.          m1[ 8]*m2[ 3] + m1[ 9]*m2[ 7] + m1[10]*m2[11] + m1[11]*m2[15],
  763.          m1[12]*m2[ 0] + m1[13]*m2[ 4] + m1[14]*m2[ 8] + m1[15]*m2[12],
  764.          m1[12]*m2[ 1] + m1[13]*m2[ 5] + m1[14]*m2[ 9] + m1[15]*m2[13],
  765.          m1[12]*m2[ 2] + m1[13]*m2[ 6] + m1[14]*m2[10] + m1[15]*m2[14],
  766.          m1[12]*m2[ 3] + m1[13]*m2[ 7] + m1[14]*m2[11] + m1[15]*m2[15]);
  767. }
  768. //
  769. // global division: matrix / scalar
  770. //
  771. template <class T, class U>
  772. inline CMatrix3< NCBI_PROMOTE(T,U) >
  773. operator/ (const CMatrix3<T>& m1, U s)
  774. {
  775.     s = T(1) / s;
  776.     return
  777.         CMatrix3< NCBI_PROMOTE(T,U) >
  778.         (m1[0]*s, m1[1]*s, m1[2]*s,
  779.          m1[3]*s, m1[4]*s, m1[5]*s,
  780.          m1[6]*s, m1[7]*s, m1[8]*s);
  781. }
  782. template <class T, class U>
  783. inline CMatrix4< NCBI_PROMOTE(T,U) >
  784. operator/ (const CMatrix4<T>& m1, U s)
  785. {
  786.     s = T(1) / s;
  787.     return
  788.         CMatrix4< NCBI_PROMOTE(T,U) >
  789.         (m1[ 0]*s, m1[ 1]*s, m1[ 2]*s, m1[ 3]*s, 
  790.          m1[ 4]*s, m1[ 5]*s, m1[ 6]*s, m1[ 7]*s, 
  791.          m1[ 8]*s, m1[ 9]*s, m1[10]*s, m1[11]*s, 
  792.          m1[12]*s, m1[13]*s, m1[14]*s, m1[15]*s);
  793. }
  794. END_NCBI_SCOPE
  795. /* @} */
  796. /*
  797.  * ===========================================================================
  798.  * $Log: globals.hpp,v $
  799.  * Revision 1000.2  2004/06/01 19:48:46  gouriano
  800.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  801.  *
  802.  * Revision 1.8  2004/05/11 18:53:50  dicuccio
  803.  * Added doxygen modules info
  804.  *
  805.  * Revision 1.7  2004/04/26 17:26:18  ucko
  806.  * Fix a typo in Vect4 comparison.
  807.  *
  808.  * Revision 1.6  2004/03/10 14:29:25  dicuccio
  809.  * Cleaned up include guards.  Rearranged include of promotion rules to guard
  810.  * agains undefined classes
  811.  *
  812.  * Revision 1.5  2004/02/09 17:37:44  dicuccio
  813.  * Moved matrix and prmote.hpp to utils/math
  814.  *
  815.  * Revision 1.4  2004/01/23 13:54:52  dicuccio
  816.  * Lots of fixes.  Wrapped promote type designation in a macro.  Dropped use of
  817.  * partial template specialization due to lack of support in MSVC
  818.  *
  819.  * Revision 1.3  2003/12/22 19:14:20  dicuccio
  820.  * Fixed lots of bugs in referencing non-existent functions
  821.  *
  822.  * Revision 1.2  2003/09/29 15:11:24  dicuccio
  823.  * Lots of clean-up.  Use _ASSERT instead of assert.  Use 'typename' where
  824.  * needed
  825.  *
  826.  * Revision 1.1  2003/06/09 19:30:50  dicuccio
  827.  * Initial revision
  828.  *
  829.  * ===========================================================================
  830.  */
  831. #endif  // GUI_MATH___GLOBALS__HPP