function getColorArray() { var array = new Array( [new RColor(255, 0, 0), new RColor(255, 0, 0), new RColor(160, 32, 240), new RColor(0, 255, 0),], [new RColor(128, 0, 128), new RColor(77, 255, 77), new RColor(200, 96, 255), new RColor(160, 32, 240),], [new RColor(255, 153, 77), new RColor(255, 153, 77), new RColor(128, 255, 255), new RColor(0, 255, 255),], [new RColor(77, 255, 255), new RColor(77, 255, 255), new RColor(255, 255, 128), new RColor(255, 255, 0),], [new RColor(148, 121, 253), new RColor(148, 121, 253), new RColor(255, 192, 128), new RColor(255, 165, 0),] ); return array; } /** 随机获取预设颜色中的一种 */ function randomColorSingle() { var array = randomColor(); return array[Math.floor(Math.random() * array.length)]; } /** 随机获取预设颜色的一组颜色 */ function randomColorArray() { var array = getColorArray(); return array[Math.floor(Math.random() * array.length)]; } /** 已知圆上两点的坐标及半径,求圆心的坐标 */ function getRoundCenter(x1, y1, x2, y2, r, reversed) { // 两点的中点 var midX = (x1 + x2) / 2; var midY = (y1 + y2) / 2; // 两点间的距离 d var d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); // 圆心坐标 (h, k) var cx = midX + (reversed > 0 ? 1 : -1) * Math.sqrt(Math.pow(r, 2) - Math.pow(d / 2, 2)) * (y1 - y2) / d; var cy = midY + (reversed > 0 ? 1 : -1) * Math.sqrt(Math.pow(r, 2) - Math.pow(d / 2, 2)) * (x2 - x1) / d; return [cx, cy]; } /** 已知圆心和圆上一点的坐标,求圆上一点和圆心之间的角度 */ function calculateAngle(cx, cy, px, py) { var dx = px - cx; var dy = py - cy; var theta = Math.atan2(dy, dx); var degrees = (theta * 180) / Math.PI; return (degrees + 360) % 360; } /** 已知圆的半径和角度,就弧长 */ function calculateArcLength(radius, angle) { // 将角度转换为弧度 // var angleInRadians = (angle * Math.PI) / 180; // 计算弧长 return radius * deg2rad(angle); } /** 已知A,B,C,D 四个坐标,就AB和CD相交的交点坐标 */ function lineCrossoverPoint(A, B, C, D) { var Ax = A[0]; var Ay = A[1]; var Bx = B[0]; var By = B[1]; var Cx = C[0]; var Cy = C[1]; var Dx = D[0]; var Dy = D[1]; var m1 = (By - Ay) / (Bx - Ax); var m2 = (Dy - Cy) / (Dx - Cx); var b1 = Ay - m1 * Ax; var b2 = Cy - m2 * Cx; var intersectionX = (b2 - b1) / (m1 - m2); var intersectionY = m1 * intersectionX + b1; return [intersectionX, intersectionY]; } /** 已知A、B两点,求AB连接与x轴的夹角度数 */ function getLineAngle(origin, target) { var x1 = origin[0]; var y1 = origin[1]; var x2 = target[0]; var y2 = target[1]; var theta = Math.atan((y2 - y1) / (x2 - x1)); var angle = rad2deg(theta); // 将角度调整到 0 到 180 度范围内 angle += 180; return angle % 180; } /** 已知AB两点,得到{ "drift": A->B的偏移量, "angle": A->B的偏移角度, "vertical": A->B的垂直方向偏移量, "vertical_angle": A->B的垂直方向偏角度 } */ function computeOffset(origin, target) { var x1 = origin[0]; var y1 = origin[1]; var x2 = target[0]; var y2 = target[1]; // 0°至180° var angle = getLineAngle(origin, target); var drift_x = (x1 - x2 > 0 ? -1 : 1) * Math.abs(Math.cos(deg2rad(angle))); var drift_y = (y1 - y2 > 0 ? -1 : 1) * Math.abs(Math.sin(deg2rad(angle))); // -90° 至 90° var vAngle = angle - 90; var vertical_x = Math.abs(Math.cos(deg2rad(vAngle))); var vertical_y = (vAngle > 0 ? 1 : -1) * Math.abs(Math.sin(deg2rad(vAngle))); return { "drift": [drift_x, drift_y], "angle": angle, "vertical": [vertical_x, vertical_y], "vertical_angle": vAngle } } /** 通过文件路径file,获取文件名称 */ function getFileName(file) { if (!file) { return ""; } var match = file.toString().match(/\/([^\/]+)$/); return match ? match[1] : null; } /** 生成图层的名称 统一格式 */ function getLayername(prefix, filePath) { return (prefix || "Other") + "-" + Math.floor(Math.random() * 100) + "-" + getFileName(filePath); } /** 格式化输出当前时间 */ function formatDateTime() { var now = new Date(); var year = now.getFullYear(); var month = String(now.getMonth() + 1).padStart(2, '0'); var day = String(now.getDate()).padStart(2, '0'); var hours = String(now.getHours()).padStart(2, '0'); var minutes = String(now.getMinutes()).padStart(2, '0'); var seconds = String(now.getSeconds()).padStart(2, '0'); return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; } /** 格式化桩号 格式:K000+000.000 */ function formatStake(middleX) { var m = (round(middleX * 1000) / 1000); var mk = Math.floor(m / 1000); return "K" + mk.toString() + "+" + (round((middleX - mk * 1000) * 1000) / 1000).toString(); }