util.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. function isTwoLine(arr) {
  2. var max = 0,
  3. min = 1;
  4. for (var i = 0; i < arr.length; i++) {
  5. if (arr[i][0] > max) {
  6. max = arr[i][0];
  7. }
  8. if (arr[i][0] < min) {
  9. min = arr[i][0];
  10. }
  11. }
  12. return [min === 0, max];
  13. }
  14. /*
  15. @function: 加载3D线段,需要根据平台自行实现
  16. @info: 这里生成一个3D单位CUBE的所有线段
  17. */
  18. function _3dLine(r2x, r3x, ret) {
  19. // 坐标点长度
  20. var r1x = 0.5;
  21. // 矩形的各个定点
  22. var r2x_t = [
  23. [-r1x, -r1x, +r1x],
  24. [-r1x, +r1x, +r1x],
  25. [+r1x, +r1x, +r1x],
  26. [+r1x, -r1x, +r1x],
  27. [-r1x, -r1x, -r1x],
  28. [-r1x, +r1x, -r1x],
  29. [+r1x, +r1x, -r1x],
  30. [+r1x, -r1x, -r1x]
  31. ];
  32. // 线段的坐标
  33. // z轴
  34. var r3x_t = [
  35. [0, 1],
  36. [1, 2],
  37. [2, 3],
  38. [3, 0],
  39. [4, 5],
  40. [5, 6],
  41. [6, 7],
  42. [7, 4],
  43. [0, 4],
  44. [1, 5],
  45. [2, 6],
  46. [3, 7]
  47. ];
  48. // 各个线段的坐标
  49. var ret_t = [
  50. ["", ""],
  51. ["", ""],
  52. ["", ""],
  53. ["", ""],
  54. ["", ""],
  55. ["", ""],
  56. ["", ""],
  57. ["", ""],
  58. ["", ""],
  59. ["", ""],
  60. ["", ""],
  61. ["", ""]
  62. ];
  63. ret[0][0] = r2x[r3x[0][0]];
  64. for (var i = 0; i < r3x.length; i++) {
  65. ret[i] = {
  66. "3d_id":i,
  67. "3d_point1":r2x[r3x[i][0]],
  68. "3d_point2":r2x[r3x[i][1]]
  69. }
  70. // ret[i][0] = r2x[r3x[i][0]];
  71. // ret[i][1] = r2x[r3x[i][1]];
  72. }
  73. ret_t[0][0] = r2x_t[r3x_t[0][0]];
  74. for (var i = 0; i < r3x_t.length; i++) {
  75. ret_t[i][0] = r2x_t[r3x_t[i][0]];
  76. ret_t[i][1] = r2x_t[r3x_t[i][1]];
  77. }
  78. console.log(ret)
  79. return ret;
  80. }
  81. // 归一化
  82. function normalize(xyz, isFixed) {
  83. var _mo_ = Math.sqrt(xyz[0] * xyz[0] + xyz[1] * xyz[1] + xyz[2] * xyz[2]);
  84. var x = xyz[0] / _mo_;
  85. var y = xyz[1] / _mo_;
  86. var z = xyz[2] / _mo_;
  87. var r1x;
  88. if (isFixed) {
  89. r1x = [-y, -x, z];
  90. } else {
  91. r1x = [x, y, z];
  92. }
  93. return r1x;
  94. }
  95. /*
  96. @function: 相机在坐标原点上,返回空间点在球目图片上的投影点,和'_calculate3dPoint'互逆
  97. @param {xyz}: 空间中的3D点,不需要先进行归一化
  98. @return {ret}: 纹理空间的2D点,范围为[0 ,1]
  99. */
  100. function _calculate2dPoint(xyz) {
  101. var ret = ["", ""];
  102. //@info: 这一步是为了兼容我们所用的球目相机的正方向,并且进行归一化
  103. // const auto r1x = Vector<VAL64> {-xyz[1] ,-xyz[0] ,xyz[2] ,0}.normalize () ;
  104. var r1x = normalize(xyz, true);
  105. // var r1x = xyz
  106. ret[0] = Math.atan2(r1x[1], r1x[0]) / (Math.PI * 2) + 0.5;
  107. ret[1] = (Math.acos(r1x[2]) / (Math.PI * 2)) * 2;
  108. return ret;
  109. // ARRAY2<VAL64> ret ;
  110. // //@info: 这一步是为了兼容我们所用的球目相机的正方向,并且进行归一化
  111. // const auto r1x = Vector<VAL64> {-xyz[1] ,-xyz[0] ,xyz[2] ,0}.normalize () ;
  112. // //@info: 分别计算投影点坐标
  113. // //@info: 反三角函数,缩放,平移
  114. // ret[0] = _ATAN_ (r1x[1] , r1x[0]) / VAL64 (VALX_PI * 2) + VAL64 (0.5) ;
  115. // ret[1] = _ACOS_ (r1x[2]) / VAL64 (VALX_PI * 2) * 2 ;
  116. // return std::move (ret) ;
  117. }
  118. /*
  119. @function: 相机在坐标原点上,返回球目图片上的投影点所在单位球上的原点,和'_calculate2dPoint'互逆
  120. @param {txy}: 纹理空间的2D点,范围为[0 ,1]
  121. @return {ret}: 空间中的3D点,在单位球上
  122. */
  123. function _calculate3dPoint(txy) {
  124. var ret = ["", "", ""];
  125. var r1x = (txy[1] / 2) * (Math.PI * 2);
  126. var r2x = (txy[0] - 0.5) * (Math.PI * 2);
  127. ret[0] = -Math.sin(r1x) * Math.sin(r2x);
  128. ret[1] = -Math.sin(r1x) * Math.cos(r2x);
  129. ret[2] = Math.cos(r1x);
  130. return ret;
  131. }
  132. /*
  133. @function: 计算栅格化所有线段后最大生成点的数量
  134. @param {line}: 线段的数组,line[i][0]为第一个点,line[i][1]为第二个点
  135. @param {gap}: 栅格化所需的步长,既每多长生成一个点
  136. @return {ret}: 最大生成点的数量
  137. */
  138. function _calculateMaxPoint(line, gap) {
  139. var ret = 0;
  140. for (var i = 0; i < line.length; i++) {
  141. var r1x = line[i][0];
  142. var r2x = line[i][1];
  143. // Math.hypot(x1 - x0, y1 - y0);
  144. ret += Math.ceil(
  145. Math.hypot(r1x[0] - r2x[0], r1x[1] - r2x[1], r1x[2] - r2x[2]) / gap + 0.5
  146. );
  147. }
  148. return ret;
  149. }
  150. /*
  151. @function: 计算3D线段在球目图片上的栅格化投影
  152. @param {camera_pose_matrix}: 相机位置,外参矩阵
  153. @param {line}: 线段的数组,line[i][0]为第一个点,line[i][1]为第二个点
  154. @param {gap}: 栅格化所需的步长,既每多长生成一个点
  155. @return {ret}: 栅格化投影投影后的2D线段,点坐标属于纹理空间,范围为[0 ,1]
  156. */
  157. function _3dTo2d(camera_pose_matrix, line, gap) {
  158. var ret = [];
  159. var ret_t = [];
  160. var item;
  161. var r10x = numbers.matrix.inverse(camera_pose_matrix);
  162. for (var i = 0; i < line.length; i++) {
  163. ret_t.push({ line: [] });
  164. item = []
  165. var r1x_temp = [[line[i]["3d_point1"][0]], [line[i]['3d_point1'][1]], [line[i]['3d_point1'][2]], [1]];
  166. var r2x_temp = [[line[i]['3d_point2'][0]], [line[i]['3d_point2'][1]], [line[i]['3d_point2'][2]], [1]];
  167. var r1x = numbers.matrix.multiply(r10x, r1x_temp);
  168. var r2x = numbers.matrix.multiply(r10x, r2x_temp);
  169. var r3x =
  170. Math.hypot(r2x[0] - r1x[0], r2x[1] - r1x[1], r2x[2] - r1x[2]) / gap
  171. ;
  172. var r2r1 = [r2x[0] - r1x[0], r2x[1] - r1x[1], r2x[2] - r1x[2]];
  173. var hasNormalize = normalize(r2r1, false);
  174. var r5x = [
  175. hasNormalize[0] * gap,
  176. hasNormalize[1] * gap,
  177. hasNormalize[2] * gap
  178. ];
  179. for (var j = 0; j < r3x; j++) {
  180. var r6x = [
  181. parseFloat(r1x[0]) + parseFloat(r5x[0]) * j,
  182. parseFloat(r1x[1]) + parseFloat(r5x[1]) * j,
  183. parseFloat(r1x[2]) + parseFloat(r5x[2]) * j
  184. ];
  185. var r7x = _calculate2dPoint(r6x);
  186. if (r7x[0] > maxX) {
  187. maxX = r7x[0];
  188. }
  189. ret_t[i].line.push(toDecimal(r7x));
  190. item.push(toDecimal(r7x))
  191. }
  192. var r6x_t = [
  193. parseFloat(r1x[0]) + parseFloat(r5x[0]) * r3x,
  194. parseFloat(r1x[1]) + parseFloat(r5x[1]) * r3x,
  195. parseFloat(r1x[2]) + parseFloat(r5x[2]) * r3x
  196. ];
  197. var r7x_t = _calculate2dPoint(r6x_t);
  198. ret_t[i].line.push(toDecimal(r7x_t));
  199. item.push(toDecimal(r7x_t))
  200. ret.push({
  201. "3d_id":[line[i]["3d_id"]][0],
  202. '2d_arr':fixLine(item)
  203. })
  204. }
  205. // ret2dObj(ret)
  206. return {
  207. drawArr:ret_t,
  208. to3d:ret2dObj(ret)
  209. };
  210. // return ret_t;
  211. }
  212. function ret2dObj(arr) {
  213. var ret =[];
  214. var item;
  215. var count = 0
  216. for (var i = 0; i < arr.length; i++) {
  217. for (var j = 0; j < arr[i]["2d_arr"].length; j++) {
  218. ret.push({
  219. "2d_id":count,
  220. "3d_id":i,
  221. "2d_point1":arr[i]["2d_arr"][j]["2d_point1"],
  222. "2d_point2":arr[i]["2d_arr"][j]["2d_point2"]
  223. })
  224. count++
  225. }
  226. }
  227. return {
  228. panorama_line_2d:ret
  229. }
  230. }
  231. function fixLine(arr) {
  232. var obj,
  233. t_arr = [];
  234. for (var i = 0; i < arr.length; i++) {
  235. obj = {
  236. "2d_point1": arr[i],
  237. "2d_point2": arr[i + 1]
  238. };
  239. if (obj["2d_point2"]) {
  240. t_arr.push(obj);
  241. }
  242. }
  243. return t_arr;
  244. }
  245. /**
  246. * 四舍五入保留6位小数
  247. * @param {数组} arr
  248. */
  249. function toDecimal(arr) {
  250. var xf = parseFloat(arr[0]);
  251. var yf = parseFloat(arr[1]);
  252. if (isNaN(xf) || isNaN(yf)) {
  253. return;
  254. }
  255. tx = Math.round(xf * 10e5) / 10e5;
  256. ty = Math.round(yf * 10e5) / 10e5;
  257. return [tx, ty];
  258. }
  259. function make_matrix_from_quat(quat) {
  260. var ret = numbers.matrix.identity(4);
  261. var r1x =
  262. quat[0] * quat[0] +
  263. quat[1] * quat[1] +
  264. quat[2] * quat[2] +
  265. quat[3] * quat[3];
  266. if (r1x != 0) {
  267. var x2 = (2 / r1x) * quat[0];
  268. var y2 = (2 / r1x) * quat[1];
  269. var z2 = (2 / r1x) * quat[2];
  270. var xx = quat[0] * x2;
  271. var xy = quat[0] * y2;
  272. var xz = quat[0] * z2;
  273. var yy = quat[1] * y2;
  274. var yz = quat[1] * z2;
  275. var zz = quat[2] * z2;
  276. var wx = quat[3] * x2;
  277. var wy = quat[3] * y2;
  278. var wz = quat[3] * z2;
  279. ret[0][0] = 1 - (yy + zz);
  280. ret[1][0] = xy - wz;
  281. ret[2][0] = xz + wy;
  282. ret[0][1] = xy + wz;
  283. ret[1][1] = 1 - (xx + zz);
  284. ret[2][1] = yz - wx;
  285. ret[0][2] = xz - wy;
  286. ret[1][2] = yz + wx;
  287. ret[2][2] = 1 - (xx + yy);
  288. }
  289. // ret = numbers.matrix.multiply([[1, 0, 0], [0, 1, 0], [0, 0, 1]], transpose(ret))
  290. var tran = [
  291. [1, 0, 0, quat[4]],
  292. [0, 1, 0, quat[5]],
  293. [0, 0, 1, quat[6]],
  294. [0, 0, 0, 1]
  295. ];
  296. ret = numbers.matrix.multiply(tran, transpose(ret));
  297. return ret;
  298. // [
  299. // [1, 0, 0, quat[4]],
  300. // [0, 1, 0, quat[5]],
  301. // [0, 0, 1, quat[6]],
  302. // [0 ,0 ,0 ,1]
  303. // ]
  304. }
  305. /**
  306. * 矩阵转置
  307. * @param {矩阵} arr
  308. */
  309. function transpose(arr) {
  310. var arr2 = [];
  311. for (var i = 0; i < arr[0].length; i++) {
  312. arr2[i] = [];
  313. }
  314. for (var i = 0; i < arr.length; i++) {
  315. for (var j = 0; j < arr[i].length; j++) {
  316. arr2[j][i] = arr[i][j];
  317. }
  318. }
  319. return arr2;
  320. }
  321. /**
  322. * 画线
  323. * @param {*画布} context
  324. * @param {*画布宽度 } w
  325. * @param {*画布高度} h
  326. * @param {*水平缩放倍数} scaleTime
  327. * @param {*垂直缩放倍数} scaleTimeH
  328. * @param {*线条数组} lineArr
  329. * @param {*是否重画} isclear
  330. */
  331. function drawSingleLine(
  332. context,
  333. w,
  334. h,
  335. scaleTime,
  336. scaleTimeH,
  337. lineArr,
  338. isclear
  339. ) {
  340. context.beginPath();
  341. if (isclear) {
  342. context.clearRect(0, 0, w, h);
  343. context.drawImage(img, 0, 0, w, h);
  344. }
  345. context.moveTo(
  346. lineArr[0].line[0][0] * scaleTime,
  347. lineArr[0].line[0][1] * scaleTimeH
  348. );
  349. for (var i = 0; i < lineArr.length; i++) {
  350. if (isTwoLine(lineArr[i].line)[0]) {
  351. for (var k = 0; k < lineArr[i].line.length; k++) {
  352. if (lineArr[i].line[k][0] < 0.5) {
  353. var temp = lineArr[i].line[k][0] + isTwoLine(lineArr[i].line)[1];
  354. if (temp <= 1) {
  355. lineArr[i].line.push([temp, lineArr[i].line[k][1]]);
  356. }
  357. }
  358. }
  359. }
  360. context.moveTo(
  361. lineArr[i].line[0][0] * scaleTime,
  362. lineArr[i].line[0][1] * scaleTimeH
  363. );
  364. for (var j = 0; j < lineArr[i].line.length; j++) {
  365. if (j + 1 < lineArr[i].line.length) {
  366. // Math.hypot(
  367. // lineArr[i].line[j+1][0] - lineArr[i].line[j][0],
  368. // lineArr[i].line[j+1][1] - lineArr[i].line[j][1]
  369. // ) < 0.05
  370. if (Math.abs(lineArr[i].line[j + 1][0] - lineArr[i].line[j][0]) > 0.5) {
  371. context.moveTo(
  372. lineArr[i].line[j + 1][0] * scaleTime,
  373. lineArr[i].line[j + 1][1] * scaleTimeH
  374. );
  375. } else {
  376. context.lineTo(
  377. lineArr[i].line[j][0] * scaleTime,
  378. lineArr[i].line[j][1] * scaleTimeH
  379. );
  380. }
  381. }
  382. if (j + 1 === lineArr[i].line.length) {
  383. context.lineTo(
  384. lineArr[i].line[j][0] * scaleTime,
  385. lineArr[i].line[j][1] * scaleTimeH
  386. );
  387. }
  388. }
  389. }
  390. context.stroke();
  391. }
  392. /**
  393. * 选中伸缩的墙进行画线
  394. * @param {画布} context
  395. * @param {画布宽度} w
  396. * @param {画布高度} h
  397. * @param {水平缩放倍数} scaleTime
  398. * @param {垂直缩放倍数} scaleTimeH
  399. * @param {线条数组} lineArr
  400. */
  401. function selectDragLine(context, w, h, scaleTime, scaleTimeH, lineArr, test) {
  402. context.strokeStyle = "#ff0000";
  403. drawSingleLine(context, w, h, scaleTime, scaleTimeH, lineArr, true);
  404. context.strokeStyle = "#00ff00";
  405. drawSingleLine(context, w, h, scaleTime, scaleTimeH, test, false);
  406. }
  407. /**
  408. * 找到面得中心坐标
  409. * @param {线段数组} lineArr
  410. * @param {水平缩放倍数} scaleTime
  411. * @param {垂直缩放倍数} scaleTimeH
  412. */
  413. function _calculateMiddlePoint(test, scaleTime, scaleTimeH) {
  414. var minX = 1,
  415. minY = 1,
  416. maxX = 0,
  417. maxY = 0;
  418. for (var i = 0; i < test.length; i++) {
  419. for (var j = 0; j < test[i].line.length; j++) {
  420. minX = Math.min(minX, test[i].line[j][0]);
  421. minY = Math.min(minY, test[i].line[j][1]);
  422. maxX = Math.max(maxX, test[i].line[j][0]);
  423. maxY = Math.max(maxY, test[i].line[j][1]);
  424. }
  425. }
  426. return [
  427. ((maxX - minX) / 2 + minX) * scaleTime,
  428. ((maxY - minY) / 2 + minY) * scaleTimeH
  429. ];
  430. }
  431. /**
  432. * 计算墙体中心和鼠标坐标点的距离
  433. * @param {当前鼠标点击的坐标点} current
  434. * @param {墙体的中心点坐标} middle
  435. */
  436. function _calculateMiddlePointDistance(current, middle) {
  437. return _calculateDistance(current, middle);
  438. }
  439. /**
  440. * 计算两点之间的距离
  441. * @param {坐标点} p1
  442. * @param {坐标点} p2
  443. */
  444. function _calculateDistance(p1, p2) {
  445. return Math.sqrt(Math.pow(p2[1] - p1[1], 2) + Math.pow(p2[0] - p1[0], 2));
  446. }
  447. /**
  448. * 判断点是否在墙体上
  449. * @param {鼠标当前坐标点} current
  450. * @param {墙体线段} lineArr
  451. * @param {水平缩放倍数} scaleTime
  452. * @param {垂直缩放倍数} scaleTimeH
  453. */
  454. function isInFace(current, test, scaleTime, scaleTimeH) {
  455. var fixArr = [];
  456. var selectYArr = [];
  457. var minX = 1,
  458. minY = 1,
  459. maxX = 0,
  460. maxY = 0;
  461. for (var i = 0; i < test.length; i++) {
  462. for (var j = 0; j < test[i].line.length; j++) {
  463. minX = Math.min(minX, test[i].line[j][0]);
  464. // minY = Math.min(minY, test[i].line[j][1]);
  465. maxX = Math.max(maxX, test[i].line[j][0]);
  466. // maxY = Math.max(maxY, test[i].line[j][1]);
  467. fixArr.push({
  468. id: parseFloat(test[i].line[j][0]).toFixed(1),
  469. y: test[i].line[j][1]
  470. });
  471. }
  472. }
  473. for (var i = 0; i < fixArr.length; i++) {
  474. if (fixArr[i].id == parseFloat(current[0] / scaleTime).toFixed(1)) {
  475. selectYArr.push(fixArr[i].y);
  476. }
  477. }
  478. for (var i = 0; i < selectYArr.length; i++) {
  479. minY = Math.min(minY, selectYArr[i]);
  480. maxY = Math.max(maxY, selectYArr[i]);
  481. }
  482. return (
  483. current[0] > minX * scaleTime &&
  484. current[0] < maxX * scaleTime &&
  485. current[1] > minY * scaleTimeH &&
  486. current[1] < maxY * scaleTimeH
  487. );
  488. }
  489. /**
  490. * 更新墙体线段的位置
  491. * @param {缩放的大小} distance
  492. * @param {墙体线段} lineArr
  493. */
  494. function updateLineArr(distance, lineArr,_3dPoint,tag) {
  495. // deltaX:值为负的(-1),则表示滚轮向左滚动。值为正的(1),则表示滚轮向右滚动。
  496. // deltaY:值为负的(-1),则表示滚轮向下滚动。值为正的(1),则表示滚轮向上滚动。
  497. // deltaFactor:增量因子。通过 deltaFactor * deltaX 或者 deltaFactor * deltaY 可以得到浏览器实际的滚动距离。
  498. // distance = -10
  499. if (tag) {
  500. _3dPoint[2][0]+=distance
  501. _3dPoint[3][0]+=distance
  502. _3dPoint[((_3dPoint.length)/2+2)][0]+=distance
  503. _3dPoint[((_3dPoint.length)/2+3)][0]+=distance
  504. } else{
  505. _3dPoint[1][1]+=distance
  506. _3dPoint[2][1]+=distance
  507. _3dPoint[((_3dPoint.length)/2+1)][1]+=distance
  508. _3dPoint[((_3dPoint.length)/2+2)][1]+=distance
  509. }
  510. rx1 = _3dLine(r2x, r3x, ret);
  511. lineArr = _3dTo2d(
  512. make_matrix_from_quat([
  513. 0.008515,
  514. -0.014279,
  515. 0.016179,
  516. 0.999731,
  517. -5.438891,
  518. 2.167653,
  519. 0.165233
  520. ]),
  521. rx1,
  522. 0.05
  523. )["drawArr"];
  524. return lineArr;
  525. }
  526. function updateSelectArr(lineArr,idxArr) {
  527. var ret = [];
  528. for (var i = 0; i < idxArr.length; i++) {
  529. ret.push(lineArr[idxArr[i]])
  530. }
  531. return ret
  532. }
  533. function _culaculateFaceArr(lineArr, faceArr) {
  534. var ret = [];
  535. for (var i = 0; i < faceArr.length; i++) {
  536. var item = [];
  537. for (var j = 0; j < faceArr[i].length; j++) {
  538. item.push(lineArr[faceArr[i][j]]);
  539. }
  540. ret.push({
  541. id:i,
  542. arr:item
  543. });
  544. }
  545. return ret;
  546. }
  547. function selectWhichFace(lineArr, faceArr, current, scaleTime, scaleTimeH) {
  548. var allFaceArr = _culaculateFaceArr(lineArr, faceArr);
  549. var ret = 0;
  550. var tempRet = 0;
  551. var minDist =
  552. faceArr &&
  553. _calculateMiddlePointDistance(
  554. current,
  555. _calculateMiddlePoint(allFaceArr[0].arr, scaleTime, scaleTimeH)
  556. );
  557. for (var i = 0; i < allFaceArr.length; i++) {
  558. if (isInFace(current, allFaceArr[i].arr, scaleTime, scaleTimeH)) {
  559. // tempRet = i
  560. ret = i
  561. if (
  562. _calculateMiddlePointDistance(
  563. current,
  564. _calculateMiddlePoint(allFaceArr[i].arr, scaleTime, scaleTimeH)
  565. ) < minDist
  566. ) {
  567. minDist = _calculateMiddlePointDistance(
  568. current,
  569. _calculateMiddlePoint(allFaceArr[i].arr, scaleTime, scaleTimeH)
  570. );
  571. }else{
  572. ret = i
  573. }
  574. }
  575. }
  576. return allFaceArr[ret];
  577. }
  578. /**
  579. * 根据sta查找点
  580. * @param {array} line1 第一条线段的点坐标
  581. * @param {array} line2 第二条线段的点坐标
  582. * @param {Boolean} sta 决定查找相同的点或不相同的点
  583. */
  584. function findPoint(line1, line2, sta) {
  585. if (!line1 || !line2) {
  586. console.log('线段未定义' + line1 + ' ' + line2);
  587. return null;
  588. }
  589. if (line1.length < 2 || line2.length < 2) {
  590. console.log('线段点坐标个数小于3, 请检查')
  591. return
  592. }
  593. if (sta === null || typeof sta === 'undefined') {
  594. sta = true;
  595. }
  596. // 根据sta值寻找当前线段与下一线段中符合要求的点
  597. for (let i = 0; i < line1.length; i++) {
  598. // sta为false, 寻找与下一线段都不相同的点
  599. if (!sta && sta === arrayEquals(line1[i], line2[0]) && sta === arrayEquals(line1[i], line2[1])) {
  600. return line1[i];
  601. }
  602. // sta为true, 寻找与下一线段相交的点
  603. if (sta && (sta === arrayEquals(line1[i], line2[0]) || sta === arrayEquals(line1[i], line2[1]))) {
  604. return line1[i];
  605. }
  606. }
  607. return null;
  608. }
  609. /**
  610. * 判断两个数组是否相等
  611. * @param {array} array1
  612. * @param {array} array2
  613. */
  614. function arrayEquals(array1, array2) {
  615. if (!array1 || !array2) {
  616. return false;
  617. }
  618. if (array1.length !== array2.length) {
  619. return false;
  620. }
  621. for (let i = 0, len = array1.length; i < len; i++) {
  622. if (array1[i] instanceof Array && array2[i] instanceof Array) {
  623. if (!equals(array1[i], array2[2])) {
  624. return false;
  625. }
  626. } else if (array1[i] !== array2[i]) {
  627. return false;
  628. }
  629. }
  630. return true;
  631. }
  632. /**
  633. * 判断一个数组中的元素是否都包含在另一个数组中
  634. * @param {array} arrays
  635. * @param {array} array2
  636. * @returns {boolean} true-表示数组元素唯一, false表示数组元素不唯一
  637. */
  638. function arrayOnly(array1, array2) {
  639. if(!array1 || !array2) {
  640. console.log('数组未定义, 请检查');
  641. return;
  642. }
  643. if(!array1.length || !array2.length || array1.length === 0) {
  644. return false;
  645. }
  646. for(let i = 0; i < array1.length; i++) {
  647. let num = 0;
  648. for(let j = 0; j < array1[i].length; j++) {
  649. if(array2.indexOf(array1[i][j]) >= 0) {
  650. // return false;
  651. num++;
  652. }
  653. }
  654. if(num === array1[i].length) {
  655. return true;
  656. }
  657. }
  658. return false;
  659. }
  660. function fix3dData(arr) {
  661. var ret = []
  662. var idxItem
  663. var idxArr = []
  664. for (var i = 0; i < arr.length; i++) {
  665. idxItem = []
  666. for (var j = 0; j < arr[i].length; j++) {
  667. ret.push(arr[i][j].points[0])
  668. idxItem.push(arr[i][j].id)
  669. }
  670. idxArr.push(idxItem)
  671. }
  672. // return idxArr;
  673. var r2x_t = [
  674. [-0.5, -0.5, +0.5],
  675. [-0.5, +0.5, +0.5],
  676. [+0.5, +0.5, +0.5],
  677. [+0.5, -0.5, +0.5],
  678. [-0.5, -0.5, -0.5],
  679. [-0.5, +0.5, -0.5],
  680. [+0.5, +0.5, -0.5],
  681. [+0.5, -0.5, -0.5]
  682. ];
  683. // 线段的坐标
  684. // z轴
  685. var r3x_t = [
  686. [0, 1],
  687. [1, 2],
  688. [2, 3],
  689. [3, 0],
  690. [4, 5],
  691. [5, 6],
  692. [6, 7],
  693. [7, 4],
  694. [0, 4],
  695. [1, 5],
  696. [2, 6],
  697. [3, 7]
  698. ];
  699. // 各个线段的坐标
  700. var ret_t = [
  701. ["", ""],
  702. ["", ""],
  703. ["", ""],
  704. ["", ""],
  705. ["", ""],
  706. ["", ""],
  707. ["", ""],
  708. ["", ""],
  709. ["", ""],
  710. ["", ""],
  711. ["", ""],
  712. ["", ""]
  713. ];
  714. }