v3dmath_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:15k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file v3dmath_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-03
  5.  * @brief v3dmath test cases.
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34.  
  35. #include "linden_common.h"
  36. #include "llsd.h"
  37. #include "../test/lltut.h"
  38. #include "../llquaternion.h"
  39. #include "../m3math.h"
  40. #include "../v4math.h"
  41. #include "../v3dmath.h"
  42. #include "../v3dmath.h"
  43. namespace tut
  44. {
  45. struct v3dmath_data
  46. {
  47. };
  48. typedef test_group<v3dmath_data> v3dmath_test;
  49. typedef v3dmath_test::object v3dmath_object;
  50. tut::v3dmath_test v3dmath_testcase("v3dmath");
  51. template<> template<>
  52. void v3dmath_object::test<1>()
  53. {
  54. LLVector3d vec3D;
  55. ensure("1:LLVector3d:Fail to initialize ", ((0 == vec3D.mdV[VX]) && (0 == vec3D.mdV[VY]) && (0 == vec3D.mdV[VZ])));
  56. F64 x = 2.32f, y = 1.212f, z = -.12f;
  57. LLVector3d vec3Da(x,y,z);
  58. ensure("2:LLVector3d:Fail to initialize ", ((2.32f == vec3Da.mdV[VX]) && (1.212f == vec3Da.mdV[VY]) && (-.12f == vec3Da.mdV[VZ])));
  59. const F64 vec[3] = {1.2f ,3.2f, -4.2f};
  60. LLVector3d vec3Db(vec);
  61. ensure("3:LLVector3d:Fail to initialize ", ((1.2f == vec3Db.mdV[VX]) && (3.2f == vec3Db.mdV[VY]) && (-4.2f == vec3Db.mdV[VZ])));
  62. LLVector3 vec3((F32)x,(F32)y,(F32)z);
  63. LLVector3d vec3Dc(vec3);
  64. ensure_equals("4:LLVector3d Fail to initialize",vec3Da,vec3Dc);
  65. }
  66. template<> template<>
  67. void v3dmath_object::test<2>()
  68. {
  69. S32 a = -235;
  70. LLSD llsd(a);
  71. LLVector3d vec3d(llsd);
  72. LLSD sd = vec3d.getValue();
  73. LLVector3d vec3da(sd);
  74. ensure("1:getValue:Fail ", (vec3d == vec3da));
  75. }
  76. template<> template<>
  77. void v3dmath_object::test<3>()
  78. {
  79. F64 a = 232345521.411132;
  80. LLSD llsd(a);
  81. LLVector3d vec3d;
  82. vec3d.setValue(llsd);
  83. LLSD sd = vec3d.getValue();
  84. LLVector3d vec3da(sd);
  85. ensure("1:setValue:Fail to initialize ", (vec3d == vec3da));
  86. }
  87. template<> template<>
  88. void v3dmath_object::test<4>()
  89. {
  90. F64 a[3] = {222231.43222, 12345.2343, -434343.33222};
  91. LLSD llsd;
  92. llsd[0] = a[0];
  93. llsd[1] = a[1];
  94. llsd[2] = a[2];
  95. LLVector3d vec3D;
  96. vec3D = (LLVector3d)llsd;
  97. ensure("1:operator=:Fail to initialize ", ((llsd[0].asReal()== vec3D.mdV[VX]) && (llsd[1].asReal() == vec3D.mdV[VY]) && (llsd[2].asReal() == vec3D.mdV[VZ])));
  98. }
  99. template<> template<>
  100. void v3dmath_object::test<5>()
  101. {
  102. F64 x = 2.32f, y = 1.212f, z = -.12f;
  103. LLVector3d vec3D(x,y,z);
  104. vec3D.clearVec();
  105. ensure("1:clearVec:Fail to initialize ", ((0 == vec3D.mdV[VX]) && (0 == vec3D.mdV[VY]) && (0 == vec3D.mdV[VZ])));
  106. vec3D.setVec(x,y,z);
  107. ensure("2:setVec:Fail to initialize ", ((x == vec3D.mdV[VX]) && (y == vec3D.mdV[VY]) && (z == vec3D.mdV[VZ])));
  108. vec3D.zeroVec();
  109. ensure("3:zeroVec:Fail to initialize ", ((0 == vec3D.mdV[VX]) && (0 == vec3D.mdV[VY]) && (0 == vec3D.mdV[VZ])));
  110. vec3D.clearVec();
  111. LLVector3 vec3((F32)x,(F32)y,(F32)z);
  112. vec3D.setVec(vec3);
  113. ensure("4:setVec:Fail to initialize ", ((x == vec3D.mdV[VX]) && (y == vec3D.mdV[VY]) && (z == vec3D.mdV[VZ])));
  114. vec3D.clearVec();
  115. const F64 vec[3] = {x,y,z};
  116. vec3D.setVec(vec);
  117. ensure("5:setVec:Fail to initialize ", ((x == vec3D.mdV[VX]) && (y == vec3D.mdV[VY]) && (z == vec3D.mdV[VZ])));
  118. LLVector3d vec3Da;
  119. vec3Da.setVec(vec3D);
  120. ensure_equals("6:setVec: Fail to initialize", vec3D, vec3Da);
  121. }
  122. template<> template<>
  123. void v3dmath_object::test<6>()
  124. {
  125. F64 x = -2.32, y = 1.212, z = -.12;
  126. LLVector3d vec3D(x,y,z);
  127. vec3D.abs();
  128. ensure("1:abs:Fail  ", ((-x == vec3D.mdV[VX]) && (y == vec3D.mdV[VY]) && (-z == vec3D.mdV[VZ])));
  129. ensure("2:isNull():Fail ", (FALSE == vec3D.isNull()));
  130. vec3D.clearVec();
  131. x =.00000001, y = .000001001, z = .000001001;
  132. vec3D.setVec(x,y,z);
  133. ensure("3:isNull():Fail ", (TRUE == vec3D.isNull()));
  134. ensure("4:isExactlyZero():Fail ", (FALSE == vec3D.isExactlyZero()));
  135. x =.0000000, y = .00000000, z = .00000000;
  136. vec3D.setVec(x,y,z);
  137. ensure("5:isExactlyZero():Fail ", (TRUE == vec3D.isExactlyZero()));
  138. }
  139. template<> template<>
  140. void v3dmath_object::test<7>()
  141. {
  142. F64 x = -2.32, y = 1.212, z = -.12;
  143. LLVector3d vec3D(x,y,z);
  144. ensure("1:operator [] failed",( x ==  vec3D[0]));
  145. ensure("2:operator [] failed",( y ==  vec3D[1]));
  146. ensure("3:operator [] failed",( z ==  vec3D[2]));
  147. vec3D.clearVec();
  148. x = 23.23, y = -.2361, z = 3.25;
  149. vec3D.setVec(x,y,z);
  150. F64 &ref1 = vec3D[0];
  151. ensure("4:operator [] failed",( ref1 ==  vec3D[0]));
  152. F64 &ref2 = vec3D[1];
  153. ensure("5:operator [] failed",( ref2 ==  vec3D[1]));
  154. F64 &ref3 = vec3D[2];
  155. ensure("6:operator [] failed",( ref3 ==  vec3D[2]));
  156. }
  157. template<> template<>
  158. void v3dmath_object::test<8>()
  159. {
  160. F32 x = 1.f, y = 2.f, z = -1.f;
  161. LLVector4 vec4(x,y,z);
  162. LLVector3d vec3D;
  163. vec3D = vec4;
  164. ensure("1:operator=:Fail to initialize ", ((vec4.mV[VX] == vec3D.mdV[VX]) && (vec4.mV[VY] == vec3D.mdV[VY]) && (vec4.mV[VZ] == vec3D.mdV[VZ])));
  165. }
  166. template<> template<>
  167. void v3dmath_object::test<9>()
  168. {
  169. F64 x1 = 1.78787878, y1 = 232322.2121, z1 = -12121.121212;
  170. F64 x2 = 1.2, y2 = 2.5, z2 = 1.;
  171. LLVector3d vec3D(x1,y1,z1),vec3Da(x2,y2,z2),vec3Db;
  172. vec3Db = vec3Da+ vec3D;
  173. ensure("1:operator+:Fail to initialize ", ((x1+x2 == vec3Db.mdV[VX]) && (y1+y2 == vec3Db.mdV[VY]) && (z1+z2 == vec3Db.mdV[VZ])));
  174. x1 = -2.45, y1 = 2.1, z1 = 3.0;
  175. vec3D.clearVec();
  176. vec3Da.clearVec();
  177. vec3D.setVec(x1,y1,z1);
  178. vec3Da += vec3D;
  179. ensure_equals("2:operator+=: Fail to initialize", vec3Da,vec3D);
  180. vec3Da += vec3D;
  181. ensure("3:operator+=:Fail to initialize ", ((2*x1 == vec3Da.mdV[VX]) && (2*y1 == vec3Da.mdV[VY]) && (2*z1 == vec3Da.mdV[VZ])));
  182. }
  183. template<> template<>
  184. void v3dmath_object::test<10>()
  185. {
  186. F64 x1 = 1., y1 = 2., z1 = -1.1;
  187. F64 x2 = 1.2, y2 = 2.5, z2 = 1.;
  188. LLVector3d vec3D(x1,y1,z1),vec3Da(x2,y2,z2),vec3Db;
  189. vec3Db = vec3Da - vec3D;
  190. ensure("1:operator-:Fail to initialize ", ((x2-x1 == vec3Db.mdV[VX]) && (y2-y1 == vec3Db.mdV[VY]) && (z2-z1 == vec3Db.mdV[VZ])));
  191. x1 = -2.45, y1 = 2.1, z1 = 3.0;
  192. vec3D.clearVec();
  193. vec3Da.clearVec();
  194. vec3D.setVec(x1,y1,z1);
  195. vec3Da -=vec3D;
  196. ensure("2:operator-=:Fail to initialize ", ((2.45 == vec3Da.mdV[VX]) && (-2.1 == vec3Da.mdV[VY]) && (-3.0 == vec3Da.mdV[VZ])));
  197. vec3Da -= vec3D;
  198. ensure("3:operator-=:Fail to initialize ", ((-2*x1 == vec3Da.mdV[VX]) && (-2*y1 == vec3Da.mdV[VY]) && (-2*z1 == vec3Da.mdV[VZ])));
  199. }
  200. template<> template<>
  201. void v3dmath_object::test<11>()
  202. {
  203. F64 x1 = 1., y1 = 2., z1 = -1.1;
  204. F64 x2 = 1.2, y2 = 2.5, z2 = 1.;
  205. LLVector3d vec3D(x1,y1,z1),vec3Da(x2,y2,z2);
  206. F64 res = vec3D * vec3Da;
  207. ensure_approximately_equals(
  208. "1:operator* failed",
  209. res,
  210. (x1*x2 + y1*y2 + z1*z2),
  211. 8);
  212. vec3Da.clearVec();
  213. F64 mulVal = 4.2;
  214. vec3Da = vec3D * mulVal;
  215. ensure_approximately_equals(
  216. "2a:operator* failed",
  217. vec3Da.mdV[VX],
  218. x1*mulVal,
  219. 8);
  220. ensure_approximately_equals(
  221. "2b:operator* failed",
  222. vec3Da.mdV[VY],
  223. y1*mulVal,
  224. 8);
  225. ensure_approximately_equals(
  226. "2c:operator* failed",
  227. vec3Da.mdV[VZ],
  228. z1*mulVal,
  229. 8);
  230. vec3Da.clearVec();
  231. vec3Da = mulVal * vec3D;
  232. ensure_approximately_equals(
  233. "3a:operator* failed",
  234. vec3Da.mdV[VX],
  235. x1*mulVal,
  236. 8);
  237. ensure_approximately_equals(
  238. "3b:operator* failed",
  239. vec3Da.mdV[VY],
  240. y1*mulVal,
  241. 8);
  242. ensure_approximately_equals(
  243. "3c:operator* failed",
  244. vec3Da.mdV[VZ],
  245. z1*mulVal,
  246. 8);
  247. vec3D *= mulVal;
  248. ensure_approximately_equals(
  249. "4a:operator*= failed",
  250. vec3D.mdV[VX],
  251. x1*mulVal,
  252. 8);
  253. ensure_approximately_equals(
  254. "4b:operator*= failed",
  255. vec3D.mdV[VY],
  256. y1*mulVal,
  257. 8);
  258. ensure_approximately_equals(
  259. "4c:operator*= failed",
  260. vec3D.mdV[VZ],
  261. z1*mulVal,
  262. 8);
  263. }
  264. template<> template<>
  265. void v3dmath_object::test<12>()
  266. {
  267. F64 x1 = 1., y1 = 2., z1 = -1.1;
  268. F64 x2 = 1.2, y2 = 2.5, z2 = 1.;
  269. F64 val1, val2, val3;
  270. LLVector3d vec3D(x1,y1,z1),vec3Da(x2,y2,z2), vec3Db;
  271. vec3Db = vec3D % vec3Da;
  272. val1 = y1*z2 - y2*z1;
  273. val2 = z1*x2 -z2*x1;
  274. val3 = x1*y2-x2*y1;
  275. ensure("1:operator% failed",(val1 == vec3Db.mdV[VX]) && (val2 == vec3Db.mdV[VY]) && (val3 == vec3Db.mdV[VZ])); 
  276. vec3D %= vec3Da;
  277. ensure("2:operator%= failed",
  278.        is_approx_equal(vec3D.mdV[VX],vec3Db.mdV[VX]) &&
  279.        is_approx_equal(vec3D.mdV[VY],vec3Db.mdV[VY]) &&
  280.        is_approx_equal(vec3D.mdV[VZ],vec3Db.mdV[VZ]) ); 
  281. }
  282. template<> template<>
  283. void v3dmath_object::test<13>()
  284. {
  285. F64 x1 = 1., y1 = 2., z1 = -1.1,div = 4.2;
  286. F64 t = 1.f / div;
  287. LLVector3d vec3D(x1,y1,z1), vec3Da;
  288. vec3Da = vec3D/div;
  289. ensure_approximately_equals(
  290. "1a:operator/ failed",
  291. vec3Da.mdV[VX],
  292. x1*t,
  293. 8);
  294. ensure_approximately_equals(
  295. "1b:operator/ failed",
  296. vec3Da.mdV[VY],
  297. y1*t,
  298. 8);
  299. ensure_approximately_equals(
  300. "1c:operator/ failed",
  301. vec3Da.mdV[VZ],
  302. z1*t,
  303. 8);
  304. x1 = 1.23, y1 = 4., z1 = -2.32;
  305. vec3D.clearVec();
  306. vec3Da.clearVec();
  307. vec3D.setVec(x1,y1,z1);
  308. vec3Da = vec3D/div;
  309. ensure_approximately_equals(
  310. "2a:operator/ failed",
  311. vec3Da.mdV[VX],
  312. x1*t,
  313. 8);
  314. ensure_approximately_equals(
  315. "2b:operator/ failed",
  316. vec3Da.mdV[VY],
  317. y1*t,
  318. 8);
  319. ensure_approximately_equals(
  320. "2c:operator/ failed",
  321. vec3Da.mdV[VZ],
  322. z1*t,
  323. 8);
  324. vec3D /= div;
  325. ensure_approximately_equals(
  326. "3a:operator/= failed",
  327. vec3D.mdV[VX],
  328. x1*t,
  329. 8);
  330. ensure_approximately_equals(
  331. "3b:operator/= failed",
  332. vec3D.mdV[VY],
  333. y1*t,
  334. 8);
  335. ensure_approximately_equals(
  336. "3c:operator/= failed",
  337. vec3D.mdV[VZ],
  338. z1*t,
  339. 8);
  340. }
  341. template<> template<>
  342. void v3dmath_object::test<14>()
  343. {
  344. F64 x1 = 1., y1 = 2., z1 = -1.1;
  345. LLVector3d vec3D(x1,y1,z1), vec3Da;
  346. ensure("1:operator!= failed",(TRUE == (vec3D !=vec3Da)));
  347. vec3Da = vec3D;
  348. ensure("2:operator== failed",(vec3D ==vec3Da)); 
  349. vec3D.clearVec();
  350. vec3Da.clearVec();
  351. x1 = .211, y1 = 21.111, z1 = 23.22;
  352. vec3D.setVec(x1,y1,z1);
  353. vec3Da.setVec(x1,y1,z1);
  354. ensure("3:operator== failed",(vec3D ==vec3Da)); 
  355. ensure("4:operator!= failed",(FALSE == (vec3D !=vec3Da)));
  356. }
  357. template<> template<>
  358. void v3dmath_object::test<15>()
  359. {
  360. F64 x1 = 1., y1 = 2., z1 = -1.1;
  361. LLVector3d vec3D(x1,y1,z1), vec3Da;
  362. std::ostringstream stream1, stream2;
  363. stream1 << vec3D;
  364. vec3Da.setVec(x1,y1,z1);
  365. stream2 << vec3Da;
  366. ensure("1:operator << failed",(stream1.str() == stream2.str()));
  367. }
  368. template<> template<>
  369. void v3dmath_object::test<16>()
  370. {
  371. F64 x1 = 1.23, y1 = 2.0, z1 = 4.;
  372. std::string buf("1.23 2. 4");
  373. LLVector3d vec3D, vec3Da(x1,y1,z1);
  374. LLVector3d::parseVector3d(buf, &vec3D);
  375. ensure_equals("1:parseVector3d: failed " , vec3D, vec3Da);
  376. }
  377. template<> template<>
  378. void v3dmath_object::test<17>()
  379. {
  380. F64 x1 = 1., y1 = 2., z1 = -1.1;
  381. LLVector3d vec3D(x1,y1,z1), vec3Da;
  382. vec3Da = -vec3D;
  383. ensure("1:operator- failed", (vec3D == - vec3Da));
  384. }
  385. template<> template<>
  386. void v3dmath_object::test<18>()
  387. {
  388. F64 x = 1., y = 2., z = -1.1;
  389. LLVector3d vec3D(x,y,z);
  390. F64 res = (x*x + y*y + z*z) - vec3D.magVecSquared();
  391. ensure("1:magVecSquared:Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
  392. res = fsqrtf(x*x + y*y + z*z) - vec3D.magVec();
  393. ensure("2:magVec: Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
  394. }
  395. template<> template<>
  396. void v3dmath_object::test<19>()
  397. {
  398. F64 x = 1., y = 2., z = -1.1;
  399. LLVector3d vec3D(x,y,z);
  400. F64 mag = vec3D.normVec();
  401. mag = 1.f/ mag;
  402. ensure_approximately_equals(
  403. "1a:normVec: Fail ",
  404. vec3D.mdV[VX],
  405. x * mag,
  406. 8);
  407. ensure_approximately_equals(
  408. "1b:normVec: Fail ",
  409. vec3D.mdV[VY],
  410. y * mag,
  411. 8);
  412. ensure_approximately_equals(
  413. "1c:normVec: Fail ",
  414. vec3D.mdV[VZ],
  415. z * mag,
  416. 8);
  417. x = 0.000000001, y = 0.000000001, z = 0.000000001;
  418. vec3D.clearVec();
  419. vec3D.setVec(x,y,z);
  420. mag = vec3D.normVec();
  421. ensure_approximately_equals(
  422. "2a:normVec: Fail ",
  423. vec3D.mdV[VX],
  424. x * mag,
  425. 8);
  426. ensure_approximately_equals(
  427. "2b:normVec: Fail ",
  428. vec3D.mdV[VY],
  429. y * mag,
  430. 8);
  431. ensure_approximately_equals(
  432. "2c:normVec: Fail ",
  433. vec3D.mdV[VZ],
  434. z * mag,
  435. 8);
  436. }
  437. template<> template<>
  438. void v3dmath_object::test<20>()
  439. {
  440. F64 x1 = 1111.232222;
  441. F64 y1 = 2222222222.22;
  442. F64 z1 = 422222222222.0;
  443. std::string buf("1111.232222 2222222222.22 422222222222");
  444. LLVector3d vec3Da, vec3Db(x1,y1,z1);
  445. LLVector3d::parseVector3d(buf, &vec3Da);
  446. ensure_equals("1:parseVector3 failed", vec3Da, vec3Db);
  447. }
  448. template<> template<>
  449. void v3dmath_object::test<21>()
  450. {
  451. F64 x1 = 1., y1 = 2., z1 = -1.1;
  452. F64 x2 = 1.2, y2 = 2.5, z2 = 1.;
  453. F64 val = 2.3f,val1,val2,val3;
  454. val1 = x1 + (x2 - x1)* val;
  455. val2 = y1 + (y2 - y1)* val;
  456. val3 = z1 + (z2 - z1)* val;
  457. LLVector3d vec3Da(x1,y1,z1),vec3Db(x2,y2,z2);
  458. LLVector3d vec3d = lerp(vec3Da,vec3Db,val);
  459. ensure("1:lerp failed", ((val1 ==vec3d.mdV[VX])&& (val2 ==vec3d.mdV[VY]) && (val3 ==vec3d.mdV[VZ])));
  460. }
  461. template<> template<>
  462. void v3dmath_object::test<22>()
  463. {
  464. F64 x = 2.32, y = 1.212, z = -.12;
  465. F64 min = 0.0001, max = 3.0;
  466. LLVector3d vec3d(x,y,z);
  467. ensure("1:clamp:Fail ", (TRUE == (vec3d.clamp(min, max))));
  468. x = 0.000001f, z = 5.3f;
  469. vec3d.setVec(x,y,z);
  470. ensure("2:clamp:Fail ", (TRUE == (vec3d.clamp(min, max))));
  471. }
  472. template<> template<>
  473. void v3dmath_object::test<23>()
  474. {
  475. F64 x = 10., y = 20., z = -15.;
  476. F64 epsilon = .23425;
  477. LLVector3d vec3Da(x,y,z), vec3Db(x,y,z);
  478. ensure("1:are_parallel: Fail ", (TRUE == are_parallel(vec3Da,vec3Db,epsilon)));
  479. F64 x1 = -12., y1 = -20., z1 = -100.;
  480. vec3Db.clearVec();
  481. vec3Db.setVec(x1,y1,z1);
  482. ensure("2:are_parallel: Fail ", (FALSE == are_parallel(vec3Da,vec3Db,epsilon)));
  483. }
  484. template<> template<>
  485. void v3dmath_object::test<24>()
  486. {
  487. #if LL_WINDOWS && _MSC_VER < 1400
  488. skip("This fails on VS2003!");
  489. #else
  490. F64 x = 10., y = 20., z = -15.;
  491. F64 angle1, angle2;
  492. LLVector3d vec3Da(x,y,z), vec3Db(x,y,z);
  493. angle1 = angle_between(vec3Da, vec3Db);
  494. ensure("1:angle_between: Fail ", (0 == angle1));
  495. F64 x1 = -1., y1 = -20., z1 = -1.;
  496. vec3Da.clearVec();
  497. vec3Da.setVec(x1,y1,z1);
  498. angle2 = angle_between(vec3Da, vec3Db);
  499. vec3Db.normVec();
  500. vec3Da.normVec();
  501. F64 angle = vec3Db*vec3Da;
  502. angle = acos(angle);
  503. ensure("2:angle_between: Fail ", (angle == angle2));
  504. #endif
  505. }
  506. }