DrawingUtils.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. function getColorArray() {
  2. var array = new Array(
  3. [new RColor(255, 0, 0), new RColor(255, 0, 0), new RColor(160, 32, 240), new RColor(0, 255, 0),],
  4. [new RColor(128, 0, 128), new RColor(77, 255, 77), new RColor(200, 96, 255), new RColor(160, 32, 240),],
  5. [new RColor(255, 153, 77), new RColor(255, 153, 77), new RColor(128, 255, 255), new RColor(0, 255, 255),],
  6. [new RColor(77, 255, 255), new RColor(77, 255, 255), new RColor(255, 255, 128), new RColor(255, 255, 0),],
  7. [new RColor(148, 121, 253), new RColor(148, 121, 253), new RColor(255, 192, 128), new RColor(255, 165, 0),]
  8. );
  9. return array;
  10. }
  11. /** 随机获取预设颜色中的一种 */
  12. function randomColorSingle() {
  13. var array = randomColor();
  14. return array[Math.floor(Math.random() * array.length)];
  15. }
  16. /** 随机获取预设颜色的一组颜色 */
  17. function randomColorArray() {
  18. var array = getColorArray();
  19. return array[Math.floor(Math.random() * array.length)];
  20. }
  21. /** 已知圆上两点的坐标及半径,求圆心的坐标 */
  22. function getRoundCenter(x1, y1, x2, y2, r, reversed) {
  23. // 两点的中点
  24. var midX = (x1 + x2) / 2;
  25. var midY = (y1 + y2) / 2;
  26. // 两点间的距离 d
  27. var d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
  28. // 圆心坐标 (h, k)
  29. var cx = midX + (reversed > 0 ? 1 : -1) * Math.sqrt(Math.pow(r, 2) - Math.pow(d / 2, 2)) * (y1 - y2) / d;
  30. var cy = midY + (reversed > 0 ? 1 : -1) * Math.sqrt(Math.pow(r, 2) - Math.pow(d / 2, 2)) * (x2 - x1) / d;
  31. return [cx, cy];
  32. }
  33. /** 已知圆心和圆上一点的坐标,求圆上一点和圆心之间的角度 */
  34. function calculateAngle(cx, cy, px, py) {
  35. var dx = px - cx;
  36. var dy = py - cy;
  37. var theta = Math.atan2(dy, dx);
  38. var degrees = (theta * 180) / Math.PI;
  39. return (degrees + 360) % 360;
  40. }
  41. /** 已知圆的半径和角度,就弧长 */
  42. function calculateArcLength(radius, angle) {
  43. // 将角度转换为弧度
  44. // var angleInRadians = (angle * Math.PI) / 180;
  45. // 计算弧长
  46. return radius * deg2rad(angle);
  47. }
  48. /** 已知A,B,C,D 四个坐标,就AB和CD相交的交点坐标 */
  49. function lineCrossoverPoint(A, B, C, D) {
  50. var Ax = A[0];
  51. var Ay = A[1];
  52. var Bx = B[0];
  53. var By = B[1];
  54. var Cx = C[0];
  55. var Cy = C[1];
  56. var Dx = D[0];
  57. var Dy = D[1];
  58. var m1 = (By - Ay) / (Bx - Ax);
  59. var m2 = (Dy - Cy) / (Dx - Cx);
  60. var b1 = Ay - m1 * Ax;
  61. var b2 = Cy - m2 * Cx;
  62. var intersectionX = (b2 - b1) / (m1 - m2);
  63. var intersectionY = m1 * intersectionX + b1;
  64. return [intersectionX, intersectionY];
  65. }
  66. /** 已知A、B两点,求AB连接与x轴的夹角度数 */
  67. function getLineAngle(origin, target) {
  68. var x1 = origin[0];
  69. var y1 = origin[1];
  70. var x2 = target[0];
  71. var y2 = target[1];
  72. var theta = Math.atan((y2 - y1) / (x2 - x1));
  73. var angle = rad2deg(theta);
  74. // 将角度调整到 0 到 180 度范围内
  75. angle += 180;
  76. return angle % 180;
  77. }
  78. /** 已知AB两点,得到{ "drift": A->B的偏移量, "angle": A->B的偏移角度, "vertical": A->B的垂直方向偏移量, "vertical_angle": A->B的垂直方向偏角度 } */
  79. function computeOffset(origin, target) {
  80. var x1 = origin[0];
  81. var y1 = origin[1];
  82. var x2 = target[0];
  83. var y2 = target[1];
  84. // 0°至180°
  85. var angle = getLineAngle(origin, target);
  86. var drift_x = (x1 - x2 > 0 ? -1 : 1) * Math.abs(Math.cos(deg2rad(angle)));
  87. var drift_y = (y1 - y2 > 0 ? -1 : 1) * Math.abs(Math.sin(deg2rad(angle)));
  88. // -90° 至 90°
  89. var vAngle = angle - 90;
  90. var vertical_x = Math.abs(Math.cos(deg2rad(vAngle)));
  91. var vertical_y = (vAngle > 0 ? 1 : -1) * Math.abs(Math.sin(deg2rad(vAngle)));
  92. return { "drift": [drift_x, drift_y], "angle": angle, "vertical": [vertical_x, vertical_y], "vertical_angle": vAngle }
  93. }
  94. /** 通过文件路径file,获取文件名称 */
  95. function getFileName(file) {
  96. if (!file) {
  97. return "";
  98. }
  99. var match = file.toString().match(/\/([^\/]+)$/);
  100. return match ? match[1] : null;
  101. }
  102. /** 生成图层的名称 统一格式 */
  103. function getLayername(prefix, filePath) {
  104. return (prefix || "Other") + "-" + Math.floor(Math.random() * 100) + "-" + getFileName(filePath);
  105. }
  106. /** 格式化输出当前时间 */
  107. function formatDateTime() {
  108. var now = new Date();
  109. var year = now.getFullYear();
  110. var month = String(now.getMonth() + 1).padStart(2, '0');
  111. var day = String(now.getDate()).padStart(2, '0');
  112. var hours = String(now.getHours()).padStart(2, '0');
  113. var minutes = String(now.getMinutes()).padStart(2, '0');
  114. var seconds = String(now.getSeconds()).padStart(2, '0');
  115. return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
  116. }
  117. /** 格式化桩号 格式:K000+000.000 */
  118. function formatStake(middleX) {
  119. var m = (round(middleX * 1000) / 1000);
  120. var mk = Math.floor(m / 1000);
  121. return "K" + mk.toString() + "+" + (round((middleX - mk * 1000) * 1000) / 1000).toString();
  122. }