@vesium/geometry 1.0.1-beta.54 → 1.0.1-beta.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.min.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.cjs","names":["coords: CoordArray[]","coord1: CoordArray","coord2: CoordArray","coord3: CoordArray","bezierCoords: CoordArray[]","leftBodyCoords: CoordArray[]","rightBodyCoords: CoordArray[]","midCoord2: CoordArray","tempCoord4: CoordArray","connCoord: CoordArray","getTempCoord4","leftArrowCoords: CoordArray[]","rightArrowCoords: CoordArray[]","getArrowCoords","getArrowHeadCoords","getArrowBodyCoords","leftBodyCoords: CoordArray[]","rightBodyCoords: CoordArray[]","normals: CoordArray[]","pList: CoordArray[]","t","_coords: CoordArray[]","normals: CoordArray[]","pList: CoordArray[]","t","_coords: CoordArray[]","pList: CoordArray[]"],"sources":["../src/helper.ts","../src/arc.ts","../src/arrowAttackDirection.ts","../src/arrowAttackDirectionTailed.ts","../src/arrowClamped.ts","../src/arrowStraightSharp.ts","../src/arrowStraight.ts","../src/arrowStraightFine.ts","../src/arrowUnitCombatOperation.ts","../src/arrowUnitCombatOperationTailed.ts","../src/assemblingPlace.ts","../src/circle.ts","../src/closedCurve.ts","../src/curve.ts","../src/ellipse.ts","../src/lune.ts","../src/rectAngle.ts","../src/rectinclined1.ts"],"sourcesContent":["import type { CoordArray } from '@vesium/shared';\n\nexport const FITTING_COUNT = 100;\nexport const HALF_PI = Math.PI / 2;\nexport const ZERO_TOLERANCE = 0.0001;\nexport const TWO_PI = Math.PI * 2;\n\n/**\n * 计算两个坐标之间的距离\n * @param coord1\n * @param coord2\n */\nexport function mathDistance(coord1: CoordArray, coord2: CoordArray): number {\n return Math.hypot(coord1[0] - coord2[0], coord1[1] - coord2[1]);\n}\n\n/**\n * 计算点集合的总距离\n * @param points\n */\nexport function wholeDistance(points: CoordArray[]): number {\n let distance = 0;\n if (points && Array.isArray(points) && points.length > 0) {\n points.forEach((item, index) => {\n if (index < points.length - 1) {\n distance += mathDistance(item, points[index + 1]);\n }\n });\n }\n return distance;\n}\n/**\n * 获取基础长度\n * @param points\n */\nexport const getBaseLength = (points: CoordArray[]): number => wholeDistance(points) ** 0.99;\n\n/**\n * 求取两个坐标的中间坐标\n * @param coord1\n * @param coord2\n */\nexport function mid(coord1: CoordArray, coord2: CoordArray): CoordArray {\n return [\n (coord1[0] + coord2[0]) / 2,\n (coord1[1] + coord2[1]) / 2,\n ];\n}\n\n/**\n * 通过三个点确定一个圆的中心点\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getCircleCenterOfThreeCoords(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray {\n const coordA = [(coord1[0] + coord2[0]) / 2, (coord1[1] + coord2[1]) / 2] as CoordArray;\n const coordB = [coordA[0] - coord1[1] + coord2[1], coordA[1] + coord1[0] - coord2[0]] as CoordArray;\n const coordC = [(coord1[0] + coord3[0]) / 2, (coord1[1] + coord3[1]) / 2] as CoordArray;\n const coordD = [coordC[0] - coord1[1] + coord3[1], coordC[1] + coord1[0] - coord3[0]] as CoordArray;\n return getIntersectCoord(coordA, coordB, coordC, coordD);\n}\n\n/**\n * 获取交集的点\n * @param coordA\n * @param coordB\n * @param coordC\n * @param coordD\n */\nexport function getIntersectCoord(coordA: CoordArray, coordB: CoordArray, coordC: CoordArray, coordD: CoordArray): CoordArray {\n if (coordA[1] === coordB[1]) {\n const f = (coordD[0] - coordC[0]) / (coordD[1] - coordC[1]);\n const x = f * (coordA[1] - coordC[1]) + coordC[0];\n const y = coordA[1];\n return [x, y];\n }\n if (coordC[1] === coordD[1]) {\n const e = (coordB[0] - coordA[0]) / (coordB[1] - coordA[1]);\n const x = e * (coordC[1] - coordA[1]) + coordA[0];\n const y = coordC[1];\n return [x, y];\n }\n const e = (coordB[0] - coordA[0]) / (coordB[1] - coordA[1]);\n const f = (coordD[0] - coordC[0]) / (coordD[1] - coordC[1]);\n const y = (e * coordA[1] - coordA[0] - f * coordC[1] + coordC[0]) / (e - f);\n const x = e * y - e * coordA[1] + coordA[0];\n return [x, y];\n}\n\n/**\n * 获取方位角(地平经度)\n * @param startCoord\n * @param endCoord\n */\nexport function getAzimuth(startCoord: CoordArray, endCoord: CoordArray): number {\n let azimuth = 0;\n const angle = Math.asin(Math.abs(endCoord[1] - startCoord[1]) / mathDistance(startCoord, endCoord));\n if (endCoord[1] >= startCoord[1] && endCoord[0] >= startCoord[0]) {\n azimuth = angle + Math.PI;\n }\n else if (endCoord[1] >= startCoord[1] && endCoord[0] < startCoord[0]) {\n azimuth = Math.PI * 2 - angle;\n }\n else if (endCoord[1] < startCoord[1] && endCoord[0] < startCoord[0]) {\n azimuth = angle;\n }\n else if (endCoord[1] < startCoord[1] && endCoord[0] >= startCoord[0]) {\n azimuth = Math.PI - angle;\n }\n return azimuth;\n}\n\n/**\n * 通过三个点获取方位角\n * @param coordA\n * @param coordB\n * @param coordC\n */\nexport function getAngleOfThreeCoords(coordA: CoordArray, coordB: CoordArray, coordC: CoordArray): number {\n const angle = getAzimuth(coordB, coordA) - getAzimuth(coordB, coordC);\n return angle < 0 ? angle + Math.PI * 2 : angle;\n}\n\n/**\n * 判断是否是顺时针\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function isClockWise(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): boolean {\n return (coord3[1] - coord1[1]) * (coord2[0] - coord1[0]) > (coord2[1] - coord1[1]) * (coord3[0] - coord1[0]);\n}\n\n/**\n * 获取线上的点\n * @param t\n * @param startCoord\n * @param endCoord\n */\nexport function getCoordOnLine(t: number, startCoord: CoordArray, endCoord: CoordArray): CoordArray {\n const x = startCoord[0] + t * (endCoord[0] - startCoord[0]);\n const y = startCoord[1] + t * (endCoord[1] - startCoord[1]);\n return [x, y];\n}\n\n/**\n * 获取立方值\n */\nexport function getCubicValue(\n t: number,\n startCoord: CoordArray,\n coord1: CoordArray,\n coord2: CoordArray,\n endCoord: CoordArray,\n): CoordArray {\n t = Math.max(Math.min(t, 1), 0);\n const [tp, t2] = [1 - t, t * t];\n const t3 = t2 * t;\n const tp2 = tp * tp;\n const tp3 = tp2 * tp;\n const x = tp3 * startCoord[0] + 3 * tp2 * t * coord1[0] + 3 * tp * t2 * coord2[0] + t3 * endCoord[0];\n const y = tp3 * startCoord[1] + 3 * tp2 * t * coord1[1] + 3 * tp * t2 * coord2[1] + t3 * endCoord[1];\n return [x, y];\n}\n\n/**\n * 根据起止点和旋转方向求取第三个点\n * @param startCoord\n * @param endCoord\n * @param angle\n * @param distance\n * @param clockWise\n */\nexport function getThirdCoord(startCoord: CoordArray, endCoord: CoordArray, angle: number, distance: number, clockWise?: boolean): CoordArray {\n const azimuth = getAzimuth(startCoord, endCoord);\n const alpha = clockWise ? azimuth + angle : azimuth - angle;\n const dx = distance * Math.cos(alpha);\n const dy = distance * Math.sin(alpha);\n return [endCoord[0] + dx, endCoord[1] + dy];\n}\n\n/**\n * 插值弓形线段点\n * @param center\n * @param radius\n * @param startAngle\n * @param endAngle\n */\nexport function getArcCoords(center: CoordArray, radius: number, startAngle: number, endAngle: number): CoordArray[] {\n let [x, y, coords, angleDiff]: [number, number, CoordArray[], number] = [0, 0, [], endAngle - startAngle];\n angleDiff = angleDiff < 0 ? angleDiff + Math.PI * 2 : angleDiff;\n for (let i = 0; i <= 100; i++) {\n const angle = startAngle + (angleDiff * i) / 100;\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n coords.push([x, y]);\n }\n return coords;\n}\n\n/**\n * getBisectorNormals\n * @param t\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getBisectorNormals(t: number, coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray[] {\n const normal = getNormal(coord1, coord2, coord3);\n let [bisectorNormalRight, bisectorNormalLeft, dt, x, y]: [CoordArray, CoordArray, number, number, number] = [\n [0, 0],\n [0, 0],\n 0,\n 0,\n 0,\n ];\n const dist = Math.hypot(normal[0], normal[1]);\n const uX = normal[0] / dist;\n const uY = normal[1] / dist;\n const d1 = mathDistance(coord1, coord2);\n const d2 = mathDistance(coord2, coord3);\n if (dist > ZERO_TOLERANCE) {\n if (isClockWise(coord1, coord2, coord3)) {\n dt = t * d1;\n x = coord2[0] - dt * uY;\n y = coord2[1] + dt * uX;\n bisectorNormalRight = [x, y];\n dt = t * d2;\n x = coord2[0] + dt * uY;\n y = coord2[1] - dt * uX;\n bisectorNormalLeft = [x, y];\n }\n else {\n dt = t * d1;\n x = coord2[0] + dt * uY;\n y = coord2[1] - dt * uX;\n bisectorNormalRight = [x, y];\n dt = t * d2;\n x = coord2[0] - dt * uY;\n y = coord2[1] + dt * uX;\n bisectorNormalLeft = [x, y];\n }\n }\n else {\n x = coord2[0] + t * (coord1[0] - coord2[0]);\n y = coord2[1] + t * (coord1[1] - coord2[1]);\n bisectorNormalRight = [x, y];\n x = coord2[0] + t * (coord3[0] - coord2[0]);\n y = coord2[1] + t * (coord3[1] - coord2[1]);\n bisectorNormalLeft = [x, y];\n }\n return [bisectorNormalRight, bisectorNormalLeft];\n}\n\n/**\n * 获取默认三点的内切圆\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getNormal(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray {\n let dX1 = coord1[0] - coord2[0];\n let dY1 = coord1[1] - coord2[1];\n const d1 = Math.hypot(dX1, dY1);\n dX1 /= d1;\n dY1 /= d1;\n let dX2 = coord3[0] - coord2[0];\n let dY2 = coord3[1] - coord2[1];\n const d2 = Math.hypot(dX2, dY2);\n dX2 /= d2;\n dY2 /= d2;\n const uX = dX1 + dX2;\n const uY = dY1 + dY2;\n return [uX, uY];\n}\n\n/**\n * 获取左边控制点\n * @param controlCoords\n * @param t\n */\nexport function getLeftMostControlCoord(controlCoords: CoordArray[], t: number): CoordArray {\n let [coord1, coord2, coord3, controlX, controlY]: [CoordArray, CoordArray, CoordArray, number, number] = [\n controlCoords[0],\n controlCoords[1],\n controlCoords[2],\n 0,\n 0,\n ];\n const coords = getBisectorNormals(0, coord1, coord2, coord3);\n const normalRight = coords[0];\n const normal = getNormal(coord1, coord2, coord3);\n const dist = Math.hypot(normal[0], normal[1]);\n if (dist > ZERO_TOLERANCE) {\n const midCoord = mid(coord1, coord2);\n const pX = coord1[0] - midCoord[0];\n const pY = coord1[1] - midCoord[1];\n const d1 = mathDistance(coord1, coord2);\n const n = 2 / d1;\n const nX = -n * pY;\n const nY = n * pX;\n const a11 = nX * nX - nY * nY;\n const a12 = 2 * nX * nY;\n const a22 = nY * nY - nX * nX;\n const dX = normalRight[0] - midCoord[0];\n const dY = normalRight[1] - midCoord[1];\n controlX = midCoord[0] + a11 * dX + a12 * dY;\n controlY = midCoord[1] + a12 * dX + a22 * dY;\n }\n else {\n controlX = coord1[0] + t * (coord2[0] - coord1[0]);\n controlY = coord1[1] + t * (coord2[1] - coord1[1]);\n }\n return [controlX, controlY];\n}\n\n/**\n * 获取右边控制点\n * @param controlCoords\n * @param t\n */\nexport function getRightMostControlCoord(controlCoords: CoordArray[], t: number): CoordArray {\n const coordlength = controlCoords.length;\n const coord1 = controlCoords[coordlength - 3];\n const coord2 = controlCoords[coordlength - 2];\n const coord3 = controlCoords[coordlength - 1];\n const coords = getBisectorNormals(0, coord1, coord2, coord3);\n const normalLeft = coords[1];\n const normal = getNormal(coord1, coord2, coord3);\n const dist = Math.hypot(normal[0], normal[1]);\n let [controlX, controlY] = [0, 0];\n if (dist > ZERO_TOLERANCE) {\n const midCoord = mid(coord2, coord3);\n const pX = coord3[0] - midCoord[0];\n const pY = coord3[1] - midCoord[1];\n const d1 = mathDistance(coord2, coord3);\n const n = 2 / d1;\n const nX = -n * pY;\n const nY = n * pX;\n const a11 = nX * nX - nY * nY;\n const a12 = 2 * nX * nY;\n const a22 = nY * nY - nX * nX;\n const dX = normalLeft[0] - midCoord[0];\n const dY = normalLeft[1] - midCoord[1];\n controlX = midCoord[0] + a11 * dX + a12 * dY;\n controlY = midCoord[1] + a12 * dX + a22 * dY;\n }\n else {\n controlX = coord3[0] + t * (coord2[0] - coord3[0]);\n controlY = coord3[1] + t * (coord2[1] - coord3[1]);\n }\n return [controlX, controlY];\n}\n\n/**\n * 插值曲线点\n * @param t\n * @param controlCoords\n */\nexport function getCurveCoords(t: number, controlCoords: CoordArray[]): CoordArray[] {\n let normals = [getLeftMostControlCoord(controlCoords, t)];\n const coords: CoordArray[] = [];\n let coord1: CoordArray, coord2: CoordArray, coord3: CoordArray;\n\n for (let i = 0; i < controlCoords.length - 2; i++) {\n [coord1, coord2, coord3] = [controlCoords[i], controlCoords[i + 1], controlCoords[i + 2]];\n const normalCoords = getBisectorNormals(t, coord1, coord2, coord3);\n normals = normals.concat(normalCoords);\n }\n const rightControl = getRightMostControlCoord(controlCoords, t);\n if (rightControl) {\n normals.push(rightControl);\n }\n for (let i = 0; i < controlCoords.length - 1; i++) {\n coord1 = controlCoords[i];\n coord2 = controlCoords[i + 1];\n coords.push(coord1);\n for (let j = 0; j < FITTING_COUNT; j++) {\n const coord = getCubicValue(j / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n coords.push(coord);\n }\n coords.push(coord2);\n }\n return coords;\n}\n\n/**\n * 贝塞尔曲线\n * @param points\n */\nexport function getBezierCoords(points: CoordArray[]): CoordArray[] {\n if (points.length <= 2) {\n return points;\n }\n const bezierCoords: CoordArray[] = [];\n const n = points.length - 1;\n for (let t = 0; t <= 1; t += 0.01) {\n let [x, y] = [0, 0];\n for (let index = 0; index <= n; index++) {\n const factor = getBinomialFactor(n, index);\n const a = t ** index;\n const b = (1 - t) ** (n - index);\n x += factor * a * b * points[index][0];\n y += factor * a * b * points[index][1];\n }\n bezierCoords.push([x, y]);\n }\n bezierCoords.push(points[n]);\n return bezierCoords;\n}\n\n/**\n * 获取阶乘数据\n * @param n\n */\nexport function getFactorial(n: number): number {\n let result = 1;\n switch (true) {\n case n <= 1:\n result = 1;\n break;\n case n === 2:\n result = 2;\n break;\n case n === 3:\n result = 6;\n break;\n case n === 24:\n result = 24;\n break;\n case n === 5:\n result = 120;\n break;\n default:\n for (let i = 1; i <= n; i++) {\n result *= i;\n }\n break;\n }\n return result;\n}\n\n/**\n * 获取二项分布\n * @param n\n * @param index\n */\nexport function getBinomialFactor(n: number, index: number): number {\n return getFactorial(n) / (getFactorial(index) * getFactorial(n - index));\n}\n\n/**\n * 插值线性点\n * @param points\n */\nexport function getQBSplineCoords(points: CoordArray[]): CoordArray[] {\n if (points.length <= 2) {\n return points;\n }\n const [n, bSplineCoords]: [number, CoordArray[]] = [2, []];\n const m = points.length - n - 1;\n bSplineCoords.push(points[0]);\n for (let i = 0; i <= m; i++) {\n for (let t = 0; t <= 1; t += 0.05) {\n let [x, y] = [0, 0];\n for (let k = 0; k <= n; k++) {\n const factor = getQuadricBSplineFactor(k, t);\n x += factor * points[i + k][0];\n y += factor * points[i + k][1];\n }\n bSplineCoords.push([x, y]);\n }\n }\n bSplineCoords.push(points.at(-1)!);\n return bSplineCoords;\n}\n\n/**\n * 得到二次线性因子\n * @param k\n * @param t\n */\nexport function getQuadricBSplineFactor(k: number, t: number): number {\n let res = 0;\n if (k === 0) {\n res = (t - 1) ** 2 / 2;\n }\n else if (k === 1) {\n res = (-2 * t ** 2 + 2 * t + 1) / 2;\n }\n else if (k === 2) {\n res = t ** 2 / 2;\n }\n return res;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArcCoords, getAzimuth, getCircleCenterOfThreeCoords, isClockWise, mathDistance } from './helper';\n\n/**\n * 标绘画弓形算法,继承线要素相关方法和属性\n */\nexport function arc(coords: CoordArray[]): CoordArray[] {\n const coordlength = coords.length;\n\n if (coordlength <= 2) {\n throw new Error('coords.length must >= 3');\n }\n else {\n let [coord1, coord2, coord3, startAngle, endAngle] = [coords[0], coords[1], coords[2], 0, 0];\n const center = getCircleCenterOfThreeCoords(coord1, coord2, coord3);\n const radius = mathDistance(coord1, center);\n const angle1 = getAzimuth(coord1, center);\n const angle2 = getAzimuth(coord2, center);\n if (isClockWise(coord1, coord2, coord3)) {\n startAngle = angle2;\n endAngle = angle1;\n }\n else {\n startAngle = angle1;\n endAngle = angle2;\n }\n return getArcCoords(center, radius, startAngle, endAngle);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getAngleOfThreeCoords,\n getBaseLength,\n getQBSplineCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n wholeDistance,\n} from './helper';\n\nexport interface AttackArrowOptions {\n headWidthFactor?: number;\n headHeightFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n tailWidthFactor?: number;\n headTailFactor?: number;\n swallowTailFactor?: number;\n swallowTailCoord?: CoordArray;\n}\n/**\n * 尖曲箭头\n */\nexport function arrowAttackDirection(coords: CoordArray[], options: AttackArrowOptions = {}): CoordArray[] {\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n let [tailLeft, tailRight] = [coords[0], coords[1]];\n if (isClockWise(coords[0], coords[1], coords[2])) {\n tailLeft = coords[1];\n tailRight = coords[0];\n }\n const midTail = mid(tailLeft, tailRight);\n const boneCoords = [midTail].concat(coords.slice(2));\n const headCoords = getArrowHeadCoords(boneCoords, {\n tailLeft,\n tailRight,\n ...options,\n });\n if (headCoords && headCoords.length > 4) {\n const [neckLeft, neckRight] = [headCoords[0], headCoords[4]];\n const tailWidthFactor = mathDistance(tailLeft, tailRight) / getBaseLength(boneCoords);\n const bodyCoords = getArrowBodyCoords(boneCoords, neckLeft, neckRight, tailWidthFactor);\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse());\n }\n else {\n return [];\n }\n }\n}\n\nexport interface GetArrowCoordsOptions {\n tailLeft?: CoordArray;\n tailRight?: CoordArray;\n headHeightFactor?: number;\n headTailFactor?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n}\n\n/**\n * 插值箭形上的点\n * @param coord1\n * @param coord2\n * @param coord3\n * @param clockWise\n */\nexport function getArrowCoords(\n coord1: CoordArray,\n coord2: CoordArray,\n coord3: CoordArray,\n clockWise: boolean,\n options: GetArrowCoordsOptions = {},\n): CoordArray[] | undefined {\n const midCoord = mid(coord1, coord2);\n const len = mathDistance(midCoord, coord3);\n let midCoord1 = getThirdCoord(coord3, midCoord, 0, len * 0.3, true);\n let midCoord2 = getThirdCoord(coord3, midCoord, 0, len * 0.5, true);\n midCoord1 = getThirdCoord(midCoord, midCoord1, HALF_PI, len / 5, clockWise);\n midCoord2 = getThirdCoord(midCoord, midCoord2, HALF_PI, len / 4, clockWise);\n const points = [midCoord, midCoord1, midCoord2, coord3];\n const arrowCoords = getArrowHeadCoords(points, options);\n if (arrowCoords && Array.isArray(arrowCoords) && arrowCoords.length > 0) {\n const [neckLeftCoord, neckRightCoord] = [arrowCoords[0], arrowCoords[4]];\n const tailWidthFactor = mathDistance(coord1, coord2) / getBaseLength(points) / 2;\n const bodyCoords = getArrowBodyCoords(points, neckLeftCoord, neckRightCoord, tailWidthFactor);\n if (bodyCoords) {\n const n = bodyCoords.length;\n let lCoords = bodyCoords.slice(0, n / 2);\n let rCoords = bodyCoords.slice(n / 2, n);\n lCoords.push(neckLeftCoord);\n rCoords.push(neckRightCoord);\n lCoords = lCoords.reverse();\n lCoords.push(coord2);\n rCoords = rCoords.reverse();\n rCoords.push(coord1);\n return lCoords.reverse().concat(arrowCoords, rCoords);\n }\n }\n else {\n throw new Error('插值出错');\n }\n}\n\nexport interface GetArrowHeadCoordsOptions {\n tailLeft?: CoordArray;\n tailRight?: CoordArray;\n headHeightFactor?: number;\n headTailFactor?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n}\n\n/**\n * 插值头部点\n */\nexport function getArrowHeadCoords(points: CoordArray[], options: GetArrowHeadCoordsOptions): CoordArray[] {\n const {\n tailLeft,\n tailRight,\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n headTailFactor = 0.8,\n } = options;\n\n let len = getBaseLength(points);\n let headHeight = len * headHeightFactor;\n const headCoord = points.at(-1)!;\n len = mathDistance(headCoord, points.at(-2)!);\n let tailWidth = 0;\n if (tailLeft && tailRight) {\n tailWidth = mathDistance(tailLeft, tailRight);\n }\n if (headHeight > tailWidth * headTailFactor) {\n headHeight = tailWidth * headTailFactor;\n }\n const headWidth = headHeight * headWidthFactor;\n const neckWidth = headHeight * neckWidthFactor;\n headHeight = Math.min(headHeight, len);\n const neckHeight = headHeight * neckHeightFactor;\n const headEndCoord = getThirdCoord(points.at(-2)!, headCoord, 0, headHeight, true);\n const neckEndCoord = getThirdCoord(points.at(-2)!, headCoord, 0, neckHeight, true);\n const headLeft = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, false);\n const headRight = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, true);\n const neckLeft = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, false);\n const neckRight = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, true);\n return [neckLeft, headLeft, headCoord, headRight, neckRight];\n}\n\n/**\n * 插值面部分数据\n * @param points\n * @param neckLeft\n * @param neckRight\n * @param tailWidthFactor\n */\nexport function getArrowBodyCoords(points: CoordArray[], neckLeft: CoordArray, neckRight: CoordArray, tailWidthFactor: number): Array<CoordArray> {\n const allLen = wholeDistance(points);\n const len = getBaseLength(points);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = mathDistance(neckLeft, neckRight);\n const widthDif = (tailWidth - neckWidth) / 2;\n\n let tempLen = 0;\n const leftBodyCoords: CoordArray[] = [];\n const rightBodyCoords: CoordArray[] = [];\n for (let i = 1; i < points.length - 1; i++) {\n const angle = getAngleOfThreeCoords(points[i - 1], points[i], points[i + 1]) / 2;\n tempLen += mathDistance(points[i - 1], points[i]);\n const w = (tailWidth / 2 - (tempLen / allLen) * widthDif) / Math.sin(angle);\n const left = getThirdCoord(points[i - 1], points[i], Math.PI - angle, w, true);\n const right = getThirdCoord(points[i - 1], points[i], angle, w, false);\n leftBodyCoords.push(left);\n rightBodyCoords.push(right);\n }\n return leftBodyCoords.concat(rightBodyCoords);\n}\n\n/**\n * 获取对称点\n * @param lineCoord1\n * @param lineCoord2\n * @param coord\n */\nexport function getTempCoord4(lineCoord1: CoordArray, lineCoord2: CoordArray, coord: CoordArray): CoordArray {\n const midCoord = mid(lineCoord1, lineCoord2);\n const len = mathDistance(midCoord, coord);\n const angle = getAngleOfThreeCoords(lineCoord1, midCoord, coord);\n let symCoord;\n let distance1 = 0;\n let distance2 = 0;\n let midCoord2: CoordArray;\n if (angle < HALF_PI) {\n distance1 = len * Math.sin(angle);\n distance2 = len * Math.cos(angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, true);\n }\n else if (angle >= HALF_PI && angle < Math.PI) {\n distance1 = len * Math.sin(Math.PI - angle);\n distance2 = len * Math.cos(Math.PI - angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, false);\n }\n else if (angle >= Math.PI && angle < Math.PI * 1.5) {\n distance1 = len * Math.sin(angle - Math.PI);\n distance2 = len * Math.cos(angle - Math.PI);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, true);\n }\n else {\n distance1 = len * Math.sin(Math.PI * 2 - angle);\n distance2 = len * Math.cos(Math.PI * 2 - angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, false);\n }\n return symCoord;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, isClockWise, mathDistance, mid } from './helper';\n\nexport interface TailedAttackArrowOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n swallowTailFactor?: number;\n}\n\n/**\n * 燕尾尖曲箭头\n */\nexport function arrowAttackDirectionTailed(coords: CoordArray[], options: TailedAttackArrowOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n swallowTailFactor = 1,\n } = options;\n\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n\n let [tailLeft, tailRight] = [coords[0], coords[1]];\n if (isClockWise(coords[0], coords[1], coords[2])) {\n tailLeft = coords[1];\n tailRight = coords[0];\n }\n const midTail = mid(tailLeft, tailRight);\n const boneCoords = [midTail].concat(coords.slice(2));\n const headCoords = getArrowHeadCoords(boneCoords, {\n tailLeft,\n tailRight,\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const [neckLeft, neckRight] = [headCoords[0], headCoords[4]];\n const tailWidth = mathDistance(tailLeft, tailRight);\n const allLen = getBaseLength(boneCoords);\n const len = allLen * tailWidthFactor * swallowTailFactor;\n const swallowTailCoord = getThirdCoord(boneCoords[1], boneCoords[0], 0, len, true);\n const factor = tailWidth / allLen;\n const bodyCoords = getArrowBodyCoords(boneCoords, neckLeft, neckRight, factor);\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse(), [swallowTailCoord, leftCoords[0]]);\n }\n else {\n return [];\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getAngleOfThreeCoords,\n getBaseLength,\n getBezierCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n wholeDistance,\n} from './helper';\n\n/**\n * 钳击箭头 有效点位长度3,4,5\n */\nexport function arrowClamped(coords: CoordArray[]): CoordArray[] {\n const options = {\n headHeightFactor: 0.25,\n headWidthFactor: 0.3,\n neckHeightFactor: 0.85,\n neckWidthFactor: 0.15,\n };\n\n if (coords.length < 3) {\n throw new Error(`coords.length must >= 3`);\n }\n const [coord1, coord2, coord3] = coords;\n let tempCoord4: CoordArray, connCoord: CoordArray;\n if (coords.length === 3) {\n tempCoord4 = getTempCoord4(coord1, coord2, coord3);\n connCoord = mid(coord1, coord2);\n }\n else if (coords.length === 4) {\n tempCoord4 = coords[3];\n connCoord = mid(coord1, coord2);\n }\n else {\n tempCoord4 = coords[3];\n connCoord = coords[4];\n }\n let leftArrowCoords: CoordArray[];\n let rightArrowCoords: CoordArray[];\n if (isClockWise(coord1, coord2, coord3)) {\n leftArrowCoords = getArrowCoords(coord1, connCoord, tempCoord4, false, options);\n rightArrowCoords = getArrowCoords(connCoord, coord2, coord3, true, options);\n }\n else {\n leftArrowCoords = getArrowCoords(coord2, connCoord, coord3, false, options);\n rightArrowCoords = getArrowCoords(connCoord, coord1, tempCoord4, true, options);\n }\n const m = leftArrowCoords.length;\n const t = (m - 5) / 2;\n const llBodyCoords = leftArrowCoords.slice(0, t);\n const lArrowCoords = leftArrowCoords.slice(t, t + 5);\n let lrBodyCoords = leftArrowCoords.slice(t + 5, m);\n let rlBodyCoords = rightArrowCoords.slice(0, t);\n const rArrowCoords = rightArrowCoords.slice(t, t + 5);\n const rrBodyCoords = rightArrowCoords.slice(t + 5, m);\n rlBodyCoords = getBezierCoords(rlBodyCoords);\n const bodyCoords = getBezierCoords(rrBodyCoords.concat(llBodyCoords.slice(1)));\n lrBodyCoords = getBezierCoords(lrBodyCoords);\n return rlBodyCoords.concat(rArrowCoords, bodyCoords, lArrowCoords, lrBodyCoords);\n}\n\n/**\n * 插值箭形上的点\n * @param coord1 - Wgs84坐标\n * @param coord2 - Wgs84坐标\n * @param coord3 - Wgs84坐标\n * @param clockWise - 是否顺时针\n */\nfunction getArrowCoords(\n coord1: CoordArray,\n coord2: CoordArray,\n coord3: CoordArray,\n clockWise: boolean,\n options: GetArrowHeadCoordsOptions,\n): CoordArray[] {\n const midCoord = mid(coord1, coord2);\n const len = mathDistance(midCoord, coord3);\n let midCoord1 = getThirdCoord(coord3, midCoord, 0, len * 0.3, true);\n let midCoord2 = getThirdCoord(coord3, midCoord, 0, len * 0.5, true);\n midCoord1 = getThirdCoord(midCoord, midCoord1, HALF_PI, len / 5, clockWise);\n midCoord2 = getThirdCoord(midCoord, midCoord2, HALF_PI, len / 4, clockWise);\n const coords = [midCoord, midCoord1, midCoord2, coord3];\n const arrowCoords = getArrowHeadCoords(coords, options);\n if (arrowCoords && Array.isArray(arrowCoords) && arrowCoords.length > 0) {\n const [neckLeftCoord, neckRightCoord] = [arrowCoords[0], arrowCoords[4]];\n const tailWidthFactor = mathDistance(coord1, coord2) / getBaseLength(coords) / 2;\n const bodyCoords = getArrowBodyCoords(coords, neckLeftCoord, neckRightCoord, tailWidthFactor);\n const n = bodyCoords.length;\n let lCoords = bodyCoords.slice(0, n / 2);\n let rCoords = bodyCoords.slice(n / 2, n);\n lCoords.push(neckLeftCoord);\n rCoords.push(neckRightCoord);\n lCoords = lCoords.reverse();\n lCoords.push(coord2);\n rCoords = rCoords.reverse();\n rCoords.push(coord1);\n return lCoords.reverse().concat(arrowCoords, rCoords);\n }\n else {\n throw new Error('插值出错');\n }\n}\ninterface GetArrowHeadCoordsOptions {\n headHeightFactor: number;\n headWidthFactor: number;\n neckWidthFactor: number;\n neckHeightFactor: number;\n}\n\n/**\n * 插值头部点\n * @param coords\n */\nfunction getArrowHeadCoords(coords: CoordArray[], options: GetArrowHeadCoordsOptions): CoordArray[] {\n const { headHeightFactor, headWidthFactor, neckWidthFactor, neckHeightFactor } = options;\n\n const len = getBaseLength(coords);\n const headHeight = len * headHeightFactor;\n const headCoord = coords.at(-1)!;\n const headWidth = headHeight * headWidthFactor;\n const neckWidth = headHeight * neckWidthFactor;\n const neckHeight = headHeight * neckHeightFactor;\n const headEndCoord = getThirdCoord(coords.at(-2)!, headCoord, 0, headHeight, true);\n const neckEndCoord = getThirdCoord(coords.at(-2)!, headCoord, 0, neckHeight, true);\n const headLeft = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, false);\n const headRight = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, true);\n const neckLeft = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, false);\n const neckRight = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, true);\n return [neckLeft, headLeft, headCoord, headRight, neckRight];\n}\n\n/**\n * 插值面部分数据\n * @param coords\n * @param neckLeft\n * @param neckRight\n * @param tailWidthFactor\n */\nfunction getArrowBodyCoords(\n coords: CoordArray[],\n neckLeft: CoordArray,\n neckRight: CoordArray,\n tailWidthFactor: number,\n): CoordArray[] {\n const allLen = wholeDistance(coords);\n const len = getBaseLength(coords);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = mathDistance(neckLeft, neckRight);\n const widthDif = (tailWidth - neckWidth) / 2;\n let tempLen = 0;\n const leftBodyCoords: CoordArray[] = [];\n const rightBodyCoords: CoordArray[] = [];\n for (let i = 1; i < coords.length - 1; i++) {\n const angle = getAngleOfThreeCoords(coords[i - 1], coords[i], coords[i + 1]) / 2;\n tempLen += mathDistance(coords[i - 1], coords[i]);\n const w = (tailWidth / 2 - (tempLen / allLen) * widthDif) / Math.sin(angle);\n const left = getThirdCoord(coords[i - 1], coords[i], Math.PI - angle, w, true);\n const right = getThirdCoord(coords[i - 1], coords[i], angle, w, false);\n leftBodyCoords.push(left);\n rightBodyCoords.push(right);\n }\n return leftBodyCoords.concat(rightBodyCoords);\n}\n\n/**\n * 获取对称点\n * @param lineCoord1\n * @param lineCoord2\n * @param coord\n */\nfunction getTempCoord4(lineCoord1: CoordArray, lineCoord2: CoordArray, coord: CoordArray): CoordArray {\n const midCoord = mid(lineCoord1, lineCoord2);\n const len = mathDistance(midCoord, coord);\n const angle = getAngleOfThreeCoords(lineCoord1, midCoord, coord);\n if (angle < HALF_PI) {\n const distance1 = len * Math.sin(angle);\n const distance2 = len * Math.cos(angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, true);\n }\n else if (angle >= HALF_PI && angle < Math.PI) {\n const distance1 = len * Math.sin(Math.PI - angle);\n const distance2 = len * Math.cos(Math.PI - angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, false);\n }\n else if (angle >= Math.PI && angle < Math.PI * 1.5) {\n const distance1 = len * Math.sin(angle - Math.PI);\n const distance2 = len * Math.cos(angle - Math.PI);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, true);\n }\n else {\n const distance1 = len * Math.sin(Math.PI * 2 - angle);\n const distance2 = len * Math.cos(Math.PI * 2 - angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, false);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getBaseLength, getThirdCoord, HALF_PI } from './helper';\n\nexport interface FineArrowOptions {\n neckAngle?: number;\n headAngle?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n}\n\n/**\n * 尖箭头\n *\n */\nexport function arrowStraightSharp(coords: CoordArray[], options: FineArrowOptions = {}): CoordArray[] {\n const {\n tailWidthFactor = 0.1,\n neckWidthFactor = 0.2,\n headWidthFactor = 0.25,\n headAngle = Math.PI / 8.5,\n neckAngle = Math.PI / 13,\n } = options;\n\n const coordlength = coords.length;\n\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n const [coord1, coord2] = [coords[0], coords[1]];\n const len = getBaseLength(coords);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = len * neckWidthFactor;\n const headWidth = len * headWidthFactor;\n const tailLeft = getThirdCoord(coord2, coord1, HALF_PI, tailWidth, true);\n const tailRight = getThirdCoord(coord2, coord1, HALF_PI, tailWidth, false);\n const headLeft = getThirdCoord(coord1, coord2, headAngle, headWidth, false);\n const headRight = getThirdCoord(coord1, coord2, headAngle, headWidth, true);\n const neckLeft = getThirdCoord(coord1, coord2, neckAngle, neckWidth, false);\n const neckRight = getThirdCoord(coord1, coord2, neckAngle, neckWidth, true);\n const pList = [tailLeft, neckLeft, headLeft, coord2, headRight, neckRight, tailRight];\n return pList;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { arrowStraightSharp } from './arrowStraightSharp';\n\n/**\n * 直箭头\n */\nexport function arrowStraight(coords: CoordArray[]): CoordArray[] {\n const tailWidthFactor = 0.05;\n const neckWidthFactor = 0.1;\n const headWidthFactor = 0.15;\n\n const headAngle = Math.PI / 4;\n const neckAngle = Math.PI * 0.17741;\n return arrowStraightSharp(coords, {\n tailWidthFactor,\n neckWidthFactor,\n headWidthFactor,\n headAngle,\n neckAngle,\n });\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getThirdCoord, mathDistance } from './helper';\n\n/**\n * 细直箭头\n */\nexport function arrowStraightFine(coords: CoordArray[]): CoordArray[] {\n const maxArrowLength = 3000000;\n const arrowLengthScale = 5;\n\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n const [coord1, coord2] = [coords[0], coords[1]];\n const distance = mathDistance(coord1, coord2);\n let len = distance / arrowLengthScale;\n len = Math.min(len, maxArrowLength);\n const leftCoord = getThirdCoord(coord1, coord2, Math.PI / 6, len, false);\n const rightCoord = getThirdCoord(coord1, coord2, Math.PI / 6, len, true);\n return [coord1, coord2, leftCoord, coord2, rightCoord];\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, HALF_PI } from './helper';\n\nexport interface SquadCombatOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n}\n\n/**\n * 分队战斗行动(尖曲箭头)\n */\nexport function arrowUnitCombatOperation(coords: CoordArray[], options: SquadCombatOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n } = options;\n\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n else {\n const allLen = getBaseLength(coords);\n const tailWidth = allLen * tailWidthFactor;\n const tailLeft = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, false);\n const tailRight = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, true);\n const headCoords = getArrowHeadCoords(coords, {\n tailLeft,\n tailRight,\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const neckLeft = headCoords[0];\n const neckRight = headCoords[4];\n const bodyCoords = getArrowBodyCoords(coords, neckLeft, neckRight, tailWidthFactor);\n\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse());\n }\n else {\n return [];\n }\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, HALF_PI } from './helper';\n\nexport interface TailedSquadCombatOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n headTailFactor?: number;\n swallowTailFactor?: number;\n swallowTailCoord?: CoordArray;\n}\n\n/**\n * 燕尾尖箭头\n */\nexport function arrowUnitCombatOperationTailed(coords: CoordArray[], options: TailedSquadCombatOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n swallowTailFactor = 1,\n } = options;\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const allLen = getBaseLength(coords);\n const tailWidth = allLen * tailWidthFactor;\n const tailLeft = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, false);\n const tailRight = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, true);\n const len = tailWidth * swallowTailFactor;\n const swallowTailCoord = getThirdCoord(coords[1], coords[0], 0, len, true);\n const tailCoords = [tailLeft, swallowTailCoord, tailRight];\n\n const headCoords = getArrowHeadCoords(coords, {\n tailLeft: tailCoords[0],\n tailRight: tailCoords[2],\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const neckLeft = headCoords[0];\n const neckRight = headCoords[4];\n const bodyCoords = getArrowBodyCoords(coords, neckLeft, neckRight, tailWidthFactor);\n\n const coordlength = bodyCoords.length;\n let leftCoords = [tailCoords[0]].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailCoords[2]].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse(), [tailCoords[1], leftCoords[0]]);\n }\n return [];\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, getBisectorNormals, getCubicValue, mid } from './helper';\n\n/**\n * 集结地\n *\n */\nexport function assemblingPlace(coords: CoordArray[]): CoordArray[] {\n if (coords.length < 3) {\n throw new Error(`coords.length must >= 3`);\n }\n const t = 0.4;\n\n const midCoord = mid(coords[0], coords[2]);\n coords.push(midCoord, coords[0], coords[1]);\n let normals: CoordArray[] = [];\n const pList: CoordArray[] = [];\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n const coord3 = coords[i + 2];\n const normalCoords = getBisectorNormals(t, coord1, coord2, coord3);\n normals = normals.concat(normalCoords);\n }\n const count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n pList.push(coord1);\n for (let t = 0; t <= FITTING_COUNT; t++) {\n const coord = getCubicValue(t / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n pList.push(coord);\n }\n pList.push(coord2);\n }\n return pList;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { mathDistance } from './helper';\n\n/**\n * 标绘画圆算法,继承面要素相关方法和属性\n */\nexport function circle(coords: CoordArray[]): CoordArray[] {\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const center = coords[0];\n const radius = mathDistance(center as CoordArray, coords[1]);\n let [x, y, angle] = [0, 0, 0];\n const _coords: CoordArray[] = [];\n for (let i = 0; i <= 100; i++) {\n angle = (Math.PI * 2 * i) / 100;\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n _coords.push([x, y]);\n }\n return _coords;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, getBisectorNormals, getCubicValue } from './helper';\n/**\n * 闭合曲面\n *\n */\nexport function closedCurve(coords: CoordArray[]): CoordArray[] {\n const t = 0.3;\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n coords.push(coords[0], coords[1]);\n let normals: CoordArray[] = [];\n const pList: CoordArray[] = [];\n for (let i = 0; i < coords.length - 2; i++) {\n const normalCoords = getBisectorNormals(t, coords[i], coords[i + 1], coords[i + 2]);\n normals = normals.concat(normalCoords);\n }\n const coordlength = normals.length;\n normals = [normals[coordlength - 1]].concat(normals.slice(0, coordlength - 1));\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n pList.push(coord1);\n for (let t = 0; t <= FITTING_COUNT; t++) {\n const coord = getCubicValue(t / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n pList.push(coord);\n }\n pList.push(coord2);\n }\n return pList;\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getCurveCoords } from './helper';\n/**\n * 标绘曲线算法\n */\nexport function curve(coords: CoordArray[]): CoordArray[] {\n const t = 0.3;\n const coordlength = coords.length;\n if (coordlength < 3) {\n throw new Error('coords.length must >= 2');\n }\n else {\n return getCurveCoords(t, coords);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, mid } from './helper';\n\n/**\n * 标绘画椭圆算法,继承面要素相关方法和属性\n */\nexport function ellipse(coords: CoordArray[]): CoordArray[] {\n const coordLength = coords.length;\n\n if (coordLength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const [coord1, coord2] = [coords[0], coords[1]];\n const center = mid(coord1, coord2);\n const majorRadius = Math.abs((coord1[0] - coord2[0]) / 2);\n const minorRadius = Math.abs((coord1[1] - coord2[1]) / 2);\n let [x, y, angle] = [0, 0, 0];\n const _coords: CoordArray[] = [];\n for (let i = 0; i <= FITTING_COUNT; i++) {\n angle = (Math.PI * 2 * i) / FITTING_COUNT;\n x = center[0] + majorRadius * Math.cos(angle);\n y = center[1] + minorRadius * Math.sin(angle);\n coords.push([x, y]);\n }\n return _coords;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getArcCoords,\n getAzimuth,\n getCircleCenterOfThreeCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n} from './helper';\n\n//\n\n/**\n * 弓形\n */\nexport function lune(coords: CoordArray[]): CoordArray[] {\n coords = [...coords];\n const coordLength = coords.length;\n\n if (coordLength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n if (coordLength === 2) {\n const midCoord = mid(coords[0], coords[1]);\n const d = mathDistance(coords[0], midCoord);\n const coord = getThirdCoord(coords[0], midCoord, HALF_PI, d);\n coords.push(coord);\n }\n\n let [coord1, coord2, coord3, startAngle, endAngle] = [coords[0], coords[1], coords[2], 0, 0];\n const center = getCircleCenterOfThreeCoords(coord1, coord2, coord3);\n const radius = mathDistance(coord1, center);\n const angle1 = getAzimuth(coord1, center);\n const angle2 = getAzimuth(coord2, center);\n if (isClockWise(coord1, coord2, coord3)) {\n startAngle = angle2;\n endAngle = angle1;\n }\n else {\n startAngle = angle1;\n endAngle = angle2;\n }\n coords = getArcCoords(center, radius, startAngle, endAngle);\n coords.push(coords[0]);\n return coords;\n}\n","import type { CoordArray } from '@vesium/shared';\n\n/**\n * 规则矩形\n *\n */\nexport function rectAngle(coords: CoordArray[]): CoordArray[] {\n if (coords.length < 2) {\n throw new Error('coords.length must >= 2');\n }\n const [startCoord, endCoord] = coords;\n return [startCoord, [startCoord[0], endCoord[1]], endCoord, [endCoord[0], startCoord[1]], startCoord];\n}\n","import type { CoordArray } from '@vesium/shared';\n\n/**\n * 斜矩形1\n *\n */\nexport function rectinclined1(coords: CoordArray[]): CoordArray[] {\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n const [coord1, coord2, mouse] = [coords[0], coords[1], coords[2]];\n const d = calculatePerpendicularDistance(coord1, coord2, mouse);\n const direction = calculatePositionRelativeToLine(coord1, coord2, mouse);\n const coord3 = calculatePerpendicularCoord(coord1, coord2, direction * d);\n const coord4 = calculateFourthCoord(coord1, coord2, coord3);\n const pList: CoordArray[] = [];\n pList.push(coord1, coord2, coord3, coord4, coord1);\n return pList;\n }\n}\n\n/**\n * 已知p1,p2,p3三点,计算p3到p1p2的垂直距离\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculatePerpendicularDistance(p1, p2, p3) {\n // 计算向量V的分量\n const vx = p2[0] - p1[0];\n const vy = p2[1] - p1[1];\n // 计算P1P3的分量\n const px = p3[0] - p1[0];\n const py = p3[1] - p1[1];\n // 计算向量V的模长\n const vMagnitude = Math.hypot(vx, vy);\n // 计算点积\n const dotProduct = px * vx + py * vy;\n // 计算投影长度\n const projectionLength = dotProduct / vMagnitude;\n // 计算P1P3的模长\n const pMagnitude = Math.hypot(px, py);\n // 计算垂直距离\n const perpendicularDistance = Math.sqrt(pMagnitude * pMagnitude - projectionLength * projectionLength);\n return perpendicularDistance;\n}\n\n/**\n * 已知p1,p2,两点,判断p3点在p1p2的左右,返回-1右侧,0线上,1左侧\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculatePositionRelativeToLine(p1, p2, p3) {\n const v1 = {\n x: p2[0] - p1[0],\n y: p2[1] - p1[1],\n };\n const v2 = {\n x: p3[0] - p1[0],\n y: p3[1] - p1[1],\n };\n const crossProduct = v1.x * v2.y - v1.y * v2.x;\n const direction = crossProduct > 0 ? 1 : -1;\n if (p1[1] > p2[1]) {\n return direction;\n }\n return -direction;\n}\n\n/**\n * 已知p1,p2,p3点求矩形的p4点\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculateFourthCoord(p1, p2, p3): CoordArray {\n const x = p1[0] + p3[0] - p2[0];\n const y = p1[1] + p3[1] - p2[1];\n return [x, y];\n}\n\n/**\n * 已知p1,p2两点和距离d,求距离p1p2垂直距离为d的点p3\n * @param {*} p1\n * @param {*} p2\n * @param {*} d\n */\nexport function calculatePerpendicularCoord(p1, p2, d): CoordArray {\n // 计算p1p2的斜率\n const m = (p2[1] - p1[1]) / (p2[0] - p1[0]);\n\n let x, y;\n // 计算垂线的斜率\n if (m !== 0) {\n const perpendicularSlope = -1 / m;\n // 根据垂线斜率和已知点p2的坐标,得到垂线方程中的常数项\n const c = p2[1] - perpendicularSlope * p2[0];\n // 解垂线方程,求解x和y的值\n x = d * Math.sqrt(1 / (1 + perpendicularSlope ** 2)) + p2[0];\n y = perpendicularSlope * x + c;\n }\n else {\n x = p2[0];\n y = p2[1] - d;\n }\n // 返回垂线另一端点的坐标\n return [x, y];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.cjs","names":["coords: CoordArray[]","coord1: CoordArray","coord2: CoordArray","coord3: CoordArray","bezierCoords: CoordArray[]","leftBodyCoords: CoordArray[]","rightBodyCoords: CoordArray[]","midCoord2: CoordArray","tempCoord4: CoordArray","connCoord: CoordArray","getTempCoord4","leftArrowCoords: CoordArray[]","rightArrowCoords: CoordArray[]","getArrowCoords","getArrowHeadCoords","getArrowBodyCoords","leftBodyCoords: CoordArray[]","rightBodyCoords: CoordArray[]","normals: CoordArray[]","pList: CoordArray[]","t","_coords: CoordArray[]","normals: CoordArray[]","pList: CoordArray[]","t","_coords: CoordArray[]","pList: CoordArray[]"],"sources":["../src/helper.ts","../src/arc.ts","../src/arrowAttackDirection.ts","../src/arrowAttackDirectionTailed.ts","../src/arrowClamped.ts","../src/arrowStraightSharp.ts","../src/arrowStraight.ts","../src/arrowStraightFine.ts","../src/arrowUnitCombatOperation.ts","../src/arrowUnitCombatOperationTailed.ts","../src/assemblingPlace.ts","../src/circle.ts","../src/closedCurve.ts","../src/curve.ts","../src/ellipse.ts","../src/lune.ts","../src/rectAngle.ts","../src/rectinclined1.ts"],"sourcesContent":["import type { CoordArray } from '@vesium/shared';\n\nexport const FITTING_COUNT = 100;\nexport const HALF_PI = Math.PI / 2;\nexport const ZERO_TOLERANCE = 0.0001;\nexport const TWO_PI = Math.PI * 2;\n\n/**\n * 计算两个坐标之间的距离\n * @param coord1\n * @param coord2\n */\nexport function mathDistance(coord1: CoordArray, coord2: CoordArray): number {\n return Math.hypot(coord1[0] - coord2[0], coord1[1] - coord2[1]);\n}\n\n/**\n * 计算点集合的总距离\n * @param points\n */\nexport function wholeDistance(points: CoordArray[]): number {\n let distance = 0;\n if (points && Array.isArray(points) && points.length > 0) {\n points.forEach((item, index) => {\n if (index < points.length - 1) {\n distance += mathDistance(item, points[index + 1]);\n }\n });\n }\n return distance;\n}\n/**\n * 获取基础长度\n * @param points\n */\nexport const getBaseLength = (points: CoordArray[]): number => wholeDistance(points) ** 0.99;\n\n/**\n * 求取两个坐标的中间坐标\n * @param coord1\n * @param coord2\n */\nexport function mid(coord1: CoordArray, coord2: CoordArray): CoordArray {\n return [\n (coord1[0] + coord2[0]) / 2,\n (coord1[1] + coord2[1]) / 2,\n ];\n}\n\n/**\n * 通过三个点确定一个圆的中心点\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getCircleCenterOfThreeCoords(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray {\n const coordA = [(coord1[0] + coord2[0]) / 2, (coord1[1] + coord2[1]) / 2] as CoordArray;\n const coordB = [coordA[0] - coord1[1] + coord2[1], coordA[1] + coord1[0] - coord2[0]] as CoordArray;\n const coordC = [(coord1[0] + coord3[0]) / 2, (coord1[1] + coord3[1]) / 2] as CoordArray;\n const coordD = [coordC[0] - coord1[1] + coord3[1], coordC[1] + coord1[0] - coord3[0]] as CoordArray;\n return getIntersectCoord(coordA, coordB, coordC, coordD);\n}\n\n/**\n * 获取交集的点\n * @param coordA\n * @param coordB\n * @param coordC\n * @param coordD\n */\nexport function getIntersectCoord(coordA: CoordArray, coordB: CoordArray, coordC: CoordArray, coordD: CoordArray): CoordArray {\n if (coordA[1] === coordB[1]) {\n const f = (coordD[0] - coordC[0]) / (coordD[1] - coordC[1]);\n const x = f * (coordA[1] - coordC[1]) + coordC[0];\n const y = coordA[1];\n return [x, y];\n }\n if (coordC[1] === coordD[1]) {\n const e = (coordB[0] - coordA[0]) / (coordB[1] - coordA[1]);\n const x = e * (coordC[1] - coordA[1]) + coordA[0];\n const y = coordC[1];\n return [x, y];\n }\n const e = (coordB[0] - coordA[0]) / (coordB[1] - coordA[1]);\n const f = (coordD[0] - coordC[0]) / (coordD[1] - coordC[1]);\n const y = (e * coordA[1] - coordA[0] - f * coordC[1] + coordC[0]) / (e - f);\n const x = e * y - e * coordA[1] + coordA[0];\n return [x, y];\n}\n\n/**\n * 获取方位角(地平经度)\n * @param startCoord\n * @param endCoord\n */\nexport function getAzimuth(startCoord: CoordArray, endCoord: CoordArray): number {\n let azimuth = 0;\n const angle = Math.asin(Math.abs(endCoord[1] - startCoord[1]) / mathDistance(startCoord, endCoord));\n if (endCoord[1] >= startCoord[1] && endCoord[0] >= startCoord[0]) {\n azimuth = angle + Math.PI;\n }\n else if (endCoord[1] >= startCoord[1] && endCoord[0] < startCoord[0]) {\n azimuth = Math.PI * 2 - angle;\n }\n else if (endCoord[1] < startCoord[1] && endCoord[0] < startCoord[0]) {\n azimuth = angle;\n }\n else if (endCoord[1] < startCoord[1] && endCoord[0] >= startCoord[0]) {\n azimuth = Math.PI - angle;\n }\n return azimuth;\n}\n\n/**\n * 通过三个点获取方位角\n * @param coordA\n * @param coordB\n * @param coordC\n */\nexport function getAngleOfThreeCoords(coordA: CoordArray, coordB: CoordArray, coordC: CoordArray): number {\n const angle = getAzimuth(coordB, coordA) - getAzimuth(coordB, coordC);\n return angle < 0 ? angle + Math.PI * 2 : angle;\n}\n\n/**\n * 判断是否是顺时针\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function isClockWise(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): boolean {\n return (coord3[1] - coord1[1]) * (coord2[0] - coord1[0]) > (coord2[1] - coord1[1]) * (coord3[0] - coord1[0]);\n}\n\n/**\n * 获取线上的点\n * @param t\n * @param startCoord\n * @param endCoord\n */\nexport function getCoordOnLine(t: number, startCoord: CoordArray, endCoord: CoordArray): CoordArray {\n const x = startCoord[0] + t * (endCoord[0] - startCoord[0]);\n const y = startCoord[1] + t * (endCoord[1] - startCoord[1]);\n return [x, y];\n}\n\n/**\n * 获取立方值\n */\nexport function getCubicValue(\n t: number,\n startCoord: CoordArray,\n coord1: CoordArray,\n coord2: CoordArray,\n endCoord: CoordArray,\n): CoordArray {\n t = Math.max(Math.min(t, 1), 0);\n const [tp, t2] = [1 - t, t * t];\n const t3 = t2 * t;\n const tp2 = tp * tp;\n const tp3 = tp2 * tp;\n const x = tp3 * startCoord[0] + 3 * tp2 * t * coord1[0] + 3 * tp * t2 * coord2[0] + t3 * endCoord[0];\n const y = tp3 * startCoord[1] + 3 * tp2 * t * coord1[1] + 3 * tp * t2 * coord2[1] + t3 * endCoord[1];\n return [x, y];\n}\n\n/**\n * 根据起止点和旋转方向求取第三个点\n * @param startCoord\n * @param endCoord\n * @param angle\n * @param distance\n * @param clockWise\n */\nexport function getThirdCoord(startCoord: CoordArray, endCoord: CoordArray, angle: number, distance: number, clockWise?: boolean): CoordArray {\n const azimuth = getAzimuth(startCoord, endCoord);\n const alpha = clockWise ? azimuth + angle : azimuth - angle;\n const dx = distance * Math.cos(alpha);\n const dy = distance * Math.sin(alpha);\n return [endCoord[0] + dx, endCoord[1] + dy];\n}\n\n/**\n * 插值弓形线段点\n * @param center\n * @param radius\n * @param startAngle\n * @param endAngle\n */\nexport function getArcCoords(center: CoordArray, radius: number, startAngle: number, endAngle: number): CoordArray[] {\n let [x, y, coords, angleDiff]: [number, number, CoordArray[], number] = [0, 0, [], endAngle - startAngle];\n angleDiff = angleDiff < 0 ? angleDiff + Math.PI * 2 : angleDiff;\n for (let i = 0; i <= 100; i++) {\n const angle = startAngle + (angleDiff * i) / 100;\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n coords.push([x, y]);\n }\n return coords;\n}\n\n/**\n * getBisectorNormals\n * @param t\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getBisectorNormals(t: number, coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray[] {\n const normal = getNormal(coord1, coord2, coord3);\n let [bisectorNormalRight, bisectorNormalLeft, dt, x, y]: [CoordArray, CoordArray, number, number, number] = [\n [0, 0],\n [0, 0],\n 0,\n 0,\n 0,\n ];\n const dist = Math.hypot(normal[0], normal[1]);\n const uX = normal[0] / dist;\n const uY = normal[1] / dist;\n const d1 = mathDistance(coord1, coord2);\n const d2 = mathDistance(coord2, coord3);\n if (dist > ZERO_TOLERANCE) {\n if (isClockWise(coord1, coord2, coord3)) {\n dt = t * d1;\n x = coord2[0] - dt * uY;\n y = coord2[1] + dt * uX;\n bisectorNormalRight = [x, y];\n dt = t * d2;\n x = coord2[0] + dt * uY;\n y = coord2[1] - dt * uX;\n bisectorNormalLeft = [x, y];\n }\n else {\n dt = t * d1;\n x = coord2[0] + dt * uY;\n y = coord2[1] - dt * uX;\n bisectorNormalRight = [x, y];\n dt = t * d2;\n x = coord2[0] - dt * uY;\n y = coord2[1] + dt * uX;\n bisectorNormalLeft = [x, y];\n }\n }\n else {\n x = coord2[0] + t * (coord1[0] - coord2[0]);\n y = coord2[1] + t * (coord1[1] - coord2[1]);\n bisectorNormalRight = [x, y];\n x = coord2[0] + t * (coord3[0] - coord2[0]);\n y = coord2[1] + t * (coord3[1] - coord2[1]);\n bisectorNormalLeft = [x, y];\n }\n return [bisectorNormalRight, bisectorNormalLeft];\n}\n\n/**\n * 获取默认三点的内切圆\n * @param coord1\n * @param coord2\n * @param coord3\n */\nexport function getNormal(coord1: CoordArray, coord2: CoordArray, coord3: CoordArray): CoordArray {\n let dX1 = coord1[0] - coord2[0];\n let dY1 = coord1[1] - coord2[1];\n const d1 = Math.hypot(dX1, dY1);\n dX1 /= d1;\n dY1 /= d1;\n let dX2 = coord3[0] - coord2[0];\n let dY2 = coord3[1] - coord2[1];\n const d2 = Math.hypot(dX2, dY2);\n dX2 /= d2;\n dY2 /= d2;\n const uX = dX1 + dX2;\n const uY = dY1 + dY2;\n return [uX, uY];\n}\n\n/**\n * 获取左边控制点\n * @param controlCoords\n * @param t\n */\nexport function getLeftMostControlCoord(controlCoords: CoordArray[], t: number): CoordArray {\n let [coord1, coord2, coord3, controlX, controlY]: [CoordArray, CoordArray, CoordArray, number, number] = [\n controlCoords[0],\n controlCoords[1],\n controlCoords[2],\n 0,\n 0,\n ];\n const coords = getBisectorNormals(0, coord1, coord2, coord3);\n const normalRight = coords[0];\n const normal = getNormal(coord1, coord2, coord3);\n const dist = Math.hypot(normal[0], normal[1]);\n if (dist > ZERO_TOLERANCE) {\n const midCoord = mid(coord1, coord2);\n const pX = coord1[0] - midCoord[0];\n const pY = coord1[1] - midCoord[1];\n const d1 = mathDistance(coord1, coord2);\n const n = 2 / d1;\n const nX = -n * pY;\n const nY = n * pX;\n const a11 = nX * nX - nY * nY;\n const a12 = 2 * nX * nY;\n const a22 = nY * nY - nX * nX;\n const dX = normalRight[0] - midCoord[0];\n const dY = normalRight[1] - midCoord[1];\n controlX = midCoord[0] + a11 * dX + a12 * dY;\n controlY = midCoord[1] + a12 * dX + a22 * dY;\n }\n else {\n controlX = coord1[0] + t * (coord2[0] - coord1[0]);\n controlY = coord1[1] + t * (coord2[1] - coord1[1]);\n }\n return [controlX, controlY];\n}\n\n/**\n * 获取右边控制点\n * @param controlCoords\n * @param t\n */\nexport function getRightMostControlCoord(controlCoords: CoordArray[], t: number): CoordArray {\n const coordlength = controlCoords.length;\n const coord1 = controlCoords[coordlength - 3];\n const coord2 = controlCoords[coordlength - 2];\n const coord3 = controlCoords[coordlength - 1];\n const coords = getBisectorNormals(0, coord1, coord2, coord3);\n const normalLeft = coords[1];\n const normal = getNormal(coord1, coord2, coord3);\n const dist = Math.hypot(normal[0], normal[1]);\n let [controlX, controlY] = [0, 0];\n if (dist > ZERO_TOLERANCE) {\n const midCoord = mid(coord2, coord3);\n const pX = coord3[0] - midCoord[0];\n const pY = coord3[1] - midCoord[1];\n const d1 = mathDistance(coord2, coord3);\n const n = 2 / d1;\n const nX = -n * pY;\n const nY = n * pX;\n const a11 = nX * nX - nY * nY;\n const a12 = 2 * nX * nY;\n const a22 = nY * nY - nX * nX;\n const dX = normalLeft[0] - midCoord[0];\n const dY = normalLeft[1] - midCoord[1];\n controlX = midCoord[0] + a11 * dX + a12 * dY;\n controlY = midCoord[1] + a12 * dX + a22 * dY;\n }\n else {\n controlX = coord3[0] + t * (coord2[0] - coord3[0]);\n controlY = coord3[1] + t * (coord2[1] - coord3[1]);\n }\n return [controlX, controlY];\n}\n\n/**\n * 插值曲线点\n * @param t\n * @param controlCoords\n */\nexport function getCurveCoords(t: number, controlCoords: CoordArray[]): CoordArray[] {\n let normals = [getLeftMostControlCoord(controlCoords, t)];\n const coords: CoordArray[] = [];\n let coord1: CoordArray, coord2: CoordArray, coord3: CoordArray;\n\n for (let i = 0; i < controlCoords.length - 2; i++) {\n [coord1, coord2, coord3] = [controlCoords[i], controlCoords[i + 1], controlCoords[i + 2]];\n const normalCoords = getBisectorNormals(t, coord1, coord2, coord3);\n normals = normals.concat(normalCoords);\n }\n const rightControl = getRightMostControlCoord(controlCoords, t);\n if (rightControl) {\n normals.push(rightControl);\n }\n for (let i = 0; i < controlCoords.length - 1; i++) {\n coord1 = controlCoords[i];\n coord2 = controlCoords[i + 1];\n coords.push(coord1);\n for (let j = 0; j < FITTING_COUNT; j++) {\n const coord = getCubicValue(j / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n coords.push(coord);\n }\n coords.push(coord2);\n }\n return coords;\n}\n\n/**\n * 贝塞尔曲线\n * @param points\n */\nexport function getBezierCoords(points: CoordArray[]): CoordArray[] {\n if (points.length <= 2) {\n return points;\n }\n const bezierCoords: CoordArray[] = [];\n const n = points.length - 1;\n for (let t = 0; t <= 1; t += 0.01) {\n let [x, y] = [0, 0];\n for (let index = 0; index <= n; index++) {\n const factor = getBinomialFactor(n, index);\n const a = t ** index;\n const b = (1 - t) ** (n - index);\n x += factor * a * b * points[index][0];\n y += factor * a * b * points[index][1];\n }\n bezierCoords.push([x, y]);\n }\n bezierCoords.push(points[n]);\n return bezierCoords;\n}\n\n/**\n * 获取阶乘数据\n * @param n\n */\nexport function getFactorial(n: number): number {\n let result = 1;\n switch (true) {\n case n <= 1:\n result = 1;\n break;\n case n === 2:\n result = 2;\n break;\n case n === 3:\n result = 6;\n break;\n case n === 24:\n result = 24;\n break;\n case n === 5:\n result = 120;\n break;\n default:\n for (let i = 1; i <= n; i++) {\n result *= i;\n }\n break;\n }\n return result;\n}\n\n/**\n * 获取二项分布\n * @param n\n * @param index\n */\nexport function getBinomialFactor(n: number, index: number): number {\n return getFactorial(n) / (getFactorial(index) * getFactorial(n - index));\n}\n\n/**\n * 插值线性点\n * @param points\n */\nexport function getQBSplineCoords(points: CoordArray[]): CoordArray[] {\n if (points.length <= 2) {\n return points;\n }\n const [n, bSplineCoords]: [number, CoordArray[]] = [2, []];\n const m = points.length - n - 1;\n bSplineCoords.push(points[0]);\n for (let i = 0; i <= m; i++) {\n for (let t = 0; t <= 1; t += 0.05) {\n let [x, y] = [0, 0];\n for (let k = 0; k <= n; k++) {\n const factor = getQuadricBSplineFactor(k, t);\n x += factor * points[i + k][0];\n y += factor * points[i + k][1];\n }\n bSplineCoords.push([x, y]);\n }\n }\n bSplineCoords.push(points.at(-1)!);\n return bSplineCoords;\n}\n\n/**\n * 得到二次线性因子\n * @param k\n * @param t\n */\nexport function getQuadricBSplineFactor(k: number, t: number): number {\n let res = 0;\n if (k === 0) {\n res = (t - 1) ** 2 / 2;\n }\n else if (k === 1) {\n res = (-2 * t ** 2 + 2 * t + 1) / 2;\n }\n else if (k === 2) {\n res = t ** 2 / 2;\n }\n return res;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArcCoords, getAzimuth, getCircleCenterOfThreeCoords, isClockWise, mathDistance } from './helper';\n\n/**\n * 标绘画弓形算法,继承线要素相关方法和属性\n */\nexport function arc(coords: CoordArray[]): CoordArray[] {\n const coordlength = coords.length;\n\n if (coordlength <= 2) {\n throw new Error('coords.length must >= 3');\n }\n else {\n let [coord1, coord2, coord3, startAngle, endAngle] = [coords[0], coords[1], coords[2], 0, 0];\n const center = getCircleCenterOfThreeCoords(coord1, coord2, coord3);\n const radius = mathDistance(coord1, center);\n const angle1 = getAzimuth(coord1, center);\n const angle2 = getAzimuth(coord2, center);\n if (isClockWise(coord1, coord2, coord3)) {\n startAngle = angle2;\n endAngle = angle1;\n }\n else {\n startAngle = angle1;\n endAngle = angle2;\n }\n return getArcCoords(center, radius, startAngle, endAngle);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getAngleOfThreeCoords,\n getBaseLength,\n getQBSplineCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n wholeDistance,\n} from './helper';\n\nexport interface AttackArrowOptions {\n headWidthFactor?: number;\n headHeightFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n tailWidthFactor?: number;\n headTailFactor?: number;\n swallowTailFactor?: number;\n swallowTailCoord?: CoordArray;\n}\n/**\n * 尖曲箭头\n */\nexport function arrowAttackDirection(coords: CoordArray[], options: AttackArrowOptions = {}): CoordArray[] {\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n let [tailLeft, tailRight] = [coords[0], coords[1]];\n if (isClockWise(coords[0], coords[1], coords[2])) {\n tailLeft = coords[1];\n tailRight = coords[0];\n }\n const midTail = mid(tailLeft, tailRight);\n const boneCoords = [midTail].concat(coords.slice(2));\n const headCoords = getArrowHeadCoords(boneCoords, {\n tailLeft,\n tailRight,\n ...options,\n });\n if (headCoords && headCoords.length > 4) {\n const [neckLeft, neckRight] = [headCoords[0], headCoords[4]];\n const tailWidthFactor = mathDistance(tailLeft, tailRight) / getBaseLength(boneCoords);\n const bodyCoords = getArrowBodyCoords(boneCoords, neckLeft, neckRight, tailWidthFactor);\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse());\n }\n else {\n return [];\n }\n }\n}\n\nexport interface GetArrowCoordsOptions {\n tailLeft?: CoordArray;\n tailRight?: CoordArray;\n headHeightFactor?: number;\n headTailFactor?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n}\n\n/**\n * 插值箭形上的点\n * @param coord1\n * @param coord2\n * @param coord3\n * @param clockWise\n */\nexport function getArrowCoords(\n coord1: CoordArray,\n coord2: CoordArray,\n coord3: CoordArray,\n clockWise: boolean,\n options: GetArrowCoordsOptions = {},\n): CoordArray[] | undefined {\n const midCoord = mid(coord1, coord2);\n const len = mathDistance(midCoord, coord3);\n let midCoord1 = getThirdCoord(coord3, midCoord, 0, len * 0.3, true);\n let midCoord2 = getThirdCoord(coord3, midCoord, 0, len * 0.5, true);\n midCoord1 = getThirdCoord(midCoord, midCoord1, HALF_PI, len / 5, clockWise);\n midCoord2 = getThirdCoord(midCoord, midCoord2, HALF_PI, len / 4, clockWise);\n const points = [midCoord, midCoord1, midCoord2, coord3];\n const arrowCoords = getArrowHeadCoords(points, options);\n if (arrowCoords && Array.isArray(arrowCoords) && arrowCoords.length > 0) {\n const [neckLeftCoord, neckRightCoord] = [arrowCoords[0], arrowCoords[4]];\n const tailWidthFactor = mathDistance(coord1, coord2) / getBaseLength(points) / 2;\n const bodyCoords = getArrowBodyCoords(points, neckLeftCoord, neckRightCoord, tailWidthFactor);\n if (bodyCoords) {\n const n = bodyCoords.length;\n let lCoords = bodyCoords.slice(0, n / 2);\n let rCoords = bodyCoords.slice(n / 2, n);\n lCoords.push(neckLeftCoord);\n rCoords.push(neckRightCoord);\n lCoords = lCoords.reverse();\n lCoords.push(coord2);\n rCoords = rCoords.reverse();\n rCoords.push(coord1);\n return lCoords.reverse().concat(arrowCoords, rCoords);\n }\n }\n else {\n throw new Error('插值出错');\n }\n}\n\nexport interface GetArrowHeadCoordsOptions {\n tailLeft?: CoordArray;\n tailRight?: CoordArray;\n headHeightFactor?: number;\n headTailFactor?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n neckHeightFactor?: number;\n}\n\n/**\n * 插值头部点\n */\nexport function getArrowHeadCoords(points: CoordArray[], options: GetArrowHeadCoordsOptions): CoordArray[] {\n const {\n tailLeft,\n tailRight,\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n headTailFactor = 0.8,\n } = options;\n\n let len = getBaseLength(points);\n let headHeight = len * headHeightFactor;\n const headCoord = points.at(-1)!;\n len = mathDistance(headCoord, points.at(-2)!);\n let tailWidth = 0;\n if (tailLeft && tailRight) {\n tailWidth = mathDistance(tailLeft, tailRight);\n }\n if (headHeight > tailWidth * headTailFactor) {\n headHeight = tailWidth * headTailFactor;\n }\n const headWidth = headHeight * headWidthFactor;\n const neckWidth = headHeight * neckWidthFactor;\n headHeight = Math.min(headHeight, len);\n const neckHeight = headHeight * neckHeightFactor;\n const headEndCoord = getThirdCoord(points.at(-2)!, headCoord, 0, headHeight, true);\n const neckEndCoord = getThirdCoord(points.at(-2)!, headCoord, 0, neckHeight, true);\n const headLeft = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, false);\n const headRight = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, true);\n const neckLeft = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, false);\n const neckRight = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, true);\n return [neckLeft, headLeft, headCoord, headRight, neckRight];\n}\n\n/**\n * 插值面部分数据\n * @param points\n * @param neckLeft\n * @param neckRight\n * @param tailWidthFactor\n */\nexport function getArrowBodyCoords(points: CoordArray[], neckLeft: CoordArray, neckRight: CoordArray, tailWidthFactor: number): Array<CoordArray> {\n const allLen = wholeDistance(points);\n const len = getBaseLength(points);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = mathDistance(neckLeft, neckRight);\n const widthDif = (tailWidth - neckWidth) / 2;\n\n let tempLen = 0;\n const leftBodyCoords: CoordArray[] = [];\n const rightBodyCoords: CoordArray[] = [];\n for (let i = 1; i < points.length - 1; i++) {\n const angle = getAngleOfThreeCoords(points[i - 1], points[i], points[i + 1]) / 2;\n tempLen += mathDistance(points[i - 1], points[i]);\n const w = (tailWidth / 2 - (tempLen / allLen) * widthDif) / Math.sin(angle);\n const left = getThirdCoord(points[i - 1], points[i], Math.PI - angle, w, true);\n const right = getThirdCoord(points[i - 1], points[i], angle, w, false);\n leftBodyCoords.push(left);\n rightBodyCoords.push(right);\n }\n return leftBodyCoords.concat(rightBodyCoords);\n}\n\n/**\n * 获取对称点\n * @param lineCoord1\n * @param lineCoord2\n * @param coord\n */\nexport function getTempCoord4(lineCoord1: CoordArray, lineCoord2: CoordArray, coord: CoordArray): CoordArray {\n const midCoord = mid(lineCoord1, lineCoord2);\n const len = mathDistance(midCoord, coord);\n const angle = getAngleOfThreeCoords(lineCoord1, midCoord, coord);\n let symCoord;\n let distance1 = 0;\n let distance2 = 0;\n let midCoord2: CoordArray;\n if (angle < HALF_PI) {\n distance1 = len * Math.sin(angle);\n distance2 = len * Math.cos(angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, true);\n }\n else if (angle >= HALF_PI && angle < Math.PI) {\n distance1 = len * Math.sin(Math.PI - angle);\n distance2 = len * Math.cos(Math.PI - angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, false);\n }\n else if (angle >= Math.PI && angle < Math.PI * 1.5) {\n distance1 = len * Math.sin(angle - Math.PI);\n distance2 = len * Math.cos(angle - Math.PI);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, true);\n }\n else {\n distance1 = len * Math.sin(Math.PI * 2 - angle);\n distance2 = len * Math.cos(Math.PI * 2 - angle);\n midCoord2 = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n symCoord = getThirdCoord(midCoord, midCoord2, HALF_PI, distance2, false);\n }\n return symCoord;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, isClockWise, mathDistance, mid } from './helper';\n\nexport interface TailedAttackArrowOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n swallowTailFactor?: number;\n}\n\n/**\n * 燕尾尖曲箭头\n */\nexport function arrowAttackDirectionTailed(coords: CoordArray[], options: TailedAttackArrowOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n swallowTailFactor = 1,\n } = options;\n\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n\n let [tailLeft, tailRight] = [coords[0], coords[1]];\n if (isClockWise(coords[0], coords[1], coords[2])) {\n tailLeft = coords[1];\n tailRight = coords[0];\n }\n const midTail = mid(tailLeft, tailRight);\n const boneCoords = [midTail].concat(coords.slice(2));\n const headCoords = getArrowHeadCoords(boneCoords, {\n tailLeft,\n tailRight,\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const [neckLeft, neckRight] = [headCoords[0], headCoords[4]];\n const tailWidth = mathDistance(tailLeft, tailRight);\n const allLen = getBaseLength(boneCoords);\n const len = allLen * tailWidthFactor * swallowTailFactor;\n const swallowTailCoord = getThirdCoord(boneCoords[1], boneCoords[0], 0, len, true);\n const factor = tailWidth / allLen;\n const bodyCoords = getArrowBodyCoords(boneCoords, neckLeft, neckRight, factor);\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse(), [swallowTailCoord, leftCoords[0]]);\n }\n else {\n return [];\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getAngleOfThreeCoords,\n getBaseLength,\n getBezierCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n wholeDistance,\n} from './helper';\n\n/**\n * 钳击箭头 有效点位长度3,4,5\n */\nexport function arrowClamped(coords: CoordArray[]): CoordArray[] {\n const options = {\n headHeightFactor: 0.25,\n headWidthFactor: 0.3,\n neckHeightFactor: 0.85,\n neckWidthFactor: 0.15,\n };\n\n if (coords.length < 3) {\n throw new Error(`coords.length must >= 3`);\n }\n const [coord1, coord2, coord3] = coords;\n let tempCoord4: CoordArray, connCoord: CoordArray;\n if (coords.length === 3) {\n tempCoord4 = getTempCoord4(coord1, coord2, coord3);\n connCoord = mid(coord1, coord2);\n }\n else if (coords.length === 4) {\n tempCoord4 = coords[3];\n connCoord = mid(coord1, coord2);\n }\n else {\n tempCoord4 = coords[3];\n connCoord = coords[4];\n }\n let leftArrowCoords: CoordArray[];\n let rightArrowCoords: CoordArray[];\n if (isClockWise(coord1, coord2, coord3)) {\n leftArrowCoords = getArrowCoords(coord1, connCoord, tempCoord4, false, options);\n rightArrowCoords = getArrowCoords(connCoord, coord2, coord3, true, options);\n }\n else {\n leftArrowCoords = getArrowCoords(coord2, connCoord, coord3, false, options);\n rightArrowCoords = getArrowCoords(connCoord, coord1, tempCoord4, true, options);\n }\n const m = leftArrowCoords.length;\n const t = (m - 5) / 2;\n const llBodyCoords = leftArrowCoords.slice(0, t);\n const lArrowCoords = leftArrowCoords.slice(t, t + 5);\n let lrBodyCoords = leftArrowCoords.slice(t + 5, m);\n let rlBodyCoords = rightArrowCoords.slice(0, t);\n const rArrowCoords = rightArrowCoords.slice(t, t + 5);\n const rrBodyCoords = rightArrowCoords.slice(t + 5, m);\n rlBodyCoords = getBezierCoords(rlBodyCoords);\n const bodyCoords = getBezierCoords(rrBodyCoords.concat(llBodyCoords.slice(1)));\n lrBodyCoords = getBezierCoords(lrBodyCoords);\n return rlBodyCoords.concat(rArrowCoords, bodyCoords, lArrowCoords, lrBodyCoords);\n}\n\n/**\n * 插值箭形上的点\n * @param coord1 - Wgs84坐标\n * @param coord2 - Wgs84坐标\n * @param coord3 - Wgs84坐标\n * @param clockWise - 是否顺时针\n */\nfunction getArrowCoords(\n coord1: CoordArray,\n coord2: CoordArray,\n coord3: CoordArray,\n clockWise: boolean,\n options: GetArrowHeadCoordsOptions,\n): CoordArray[] {\n const midCoord = mid(coord1, coord2);\n const len = mathDistance(midCoord, coord3);\n let midCoord1 = getThirdCoord(coord3, midCoord, 0, len * 0.3, true);\n let midCoord2 = getThirdCoord(coord3, midCoord, 0, len * 0.5, true);\n midCoord1 = getThirdCoord(midCoord, midCoord1, HALF_PI, len / 5, clockWise);\n midCoord2 = getThirdCoord(midCoord, midCoord2, HALF_PI, len / 4, clockWise);\n const coords = [midCoord, midCoord1, midCoord2, coord3];\n const arrowCoords = getArrowHeadCoords(coords, options);\n if (arrowCoords && Array.isArray(arrowCoords) && arrowCoords.length > 0) {\n const [neckLeftCoord, neckRightCoord] = [arrowCoords[0], arrowCoords[4]];\n const tailWidthFactor = mathDistance(coord1, coord2) / getBaseLength(coords) / 2;\n const bodyCoords = getArrowBodyCoords(coords, neckLeftCoord, neckRightCoord, tailWidthFactor);\n const n = bodyCoords.length;\n let lCoords = bodyCoords.slice(0, n / 2);\n let rCoords = bodyCoords.slice(n / 2, n);\n lCoords.push(neckLeftCoord);\n rCoords.push(neckRightCoord);\n lCoords = lCoords.reverse();\n lCoords.push(coord2);\n rCoords = rCoords.reverse();\n rCoords.push(coord1);\n return lCoords.reverse().concat(arrowCoords, rCoords);\n }\n else {\n throw new Error('插值出错');\n }\n}\ninterface GetArrowHeadCoordsOptions {\n headHeightFactor: number;\n headWidthFactor: number;\n neckWidthFactor: number;\n neckHeightFactor: number;\n}\n\n/**\n * 插值头部点\n * @param coords\n */\nfunction getArrowHeadCoords(coords: CoordArray[], options: GetArrowHeadCoordsOptions): CoordArray[] {\n const { headHeightFactor, headWidthFactor, neckWidthFactor, neckHeightFactor } = options;\n\n const len = getBaseLength(coords);\n const headHeight = len * headHeightFactor;\n const headCoord = coords.at(-1)!;\n const headWidth = headHeight * headWidthFactor;\n const neckWidth = headHeight * neckWidthFactor;\n const neckHeight = headHeight * neckHeightFactor;\n const headEndCoord = getThirdCoord(coords.at(-2)!, headCoord, 0, headHeight, true);\n const neckEndCoord = getThirdCoord(coords.at(-2)!, headCoord, 0, neckHeight, true);\n const headLeft = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, false);\n const headRight = getThirdCoord(headCoord, headEndCoord, HALF_PI, headWidth, true);\n const neckLeft = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, false);\n const neckRight = getThirdCoord(headCoord, neckEndCoord, HALF_PI, neckWidth, true);\n return [neckLeft, headLeft, headCoord, headRight, neckRight];\n}\n\n/**\n * 插值面部分数据\n * @param coords\n * @param neckLeft\n * @param neckRight\n * @param tailWidthFactor\n */\nfunction getArrowBodyCoords(\n coords: CoordArray[],\n neckLeft: CoordArray,\n neckRight: CoordArray,\n tailWidthFactor: number,\n): CoordArray[] {\n const allLen = wholeDistance(coords);\n const len = getBaseLength(coords);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = mathDistance(neckLeft, neckRight);\n const widthDif = (tailWidth - neckWidth) / 2;\n let tempLen = 0;\n const leftBodyCoords: CoordArray[] = [];\n const rightBodyCoords: CoordArray[] = [];\n for (let i = 1; i < coords.length - 1; i++) {\n const angle = getAngleOfThreeCoords(coords[i - 1], coords[i], coords[i + 1]) / 2;\n tempLen += mathDistance(coords[i - 1], coords[i]);\n const w = (tailWidth / 2 - (tempLen / allLen) * widthDif) / Math.sin(angle);\n const left = getThirdCoord(coords[i - 1], coords[i], Math.PI - angle, w, true);\n const right = getThirdCoord(coords[i - 1], coords[i], angle, w, false);\n leftBodyCoords.push(left);\n rightBodyCoords.push(right);\n }\n return leftBodyCoords.concat(rightBodyCoords);\n}\n\n/**\n * 获取对称点\n * @param lineCoord1\n * @param lineCoord2\n * @param coord\n */\nfunction getTempCoord4(lineCoord1: CoordArray, lineCoord2: CoordArray, coord: CoordArray): CoordArray {\n const midCoord = mid(lineCoord1, lineCoord2);\n const len = mathDistance(midCoord, coord);\n const angle = getAngleOfThreeCoords(lineCoord1, midCoord, coord);\n if (angle < HALF_PI) {\n const distance1 = len * Math.sin(angle);\n const distance2 = len * Math.cos(angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, true);\n }\n else if (angle >= HALF_PI && angle < Math.PI) {\n const distance1 = len * Math.sin(Math.PI - angle);\n const distance2 = len * Math.cos(Math.PI - angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, false);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, false);\n }\n else if (angle >= Math.PI && angle < Math.PI * 1.5) {\n const distance1 = len * Math.sin(angle - Math.PI);\n const distance2 = len * Math.cos(angle - Math.PI);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, true);\n }\n else {\n const distance1 = len * Math.sin(Math.PI * 2 - angle);\n const distance2 = len * Math.cos(Math.PI * 2 - angle);\n const mid = getThirdCoord(lineCoord1, midCoord, HALF_PI, distance1, true);\n return getThirdCoord(midCoord, mid, HALF_PI, distance2, false);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getBaseLength, getThirdCoord, HALF_PI } from './helper';\n\nexport interface FineArrowOptions {\n neckAngle?: number;\n headAngle?: number;\n headWidthFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n}\n\n/**\n * 尖箭头\n *\n */\nexport function arrowStraightSharp(coords: CoordArray[], options: FineArrowOptions = {}): CoordArray[] {\n const {\n tailWidthFactor = 0.1,\n neckWidthFactor = 0.2,\n headWidthFactor = 0.25,\n headAngle = Math.PI / 8.5,\n neckAngle = Math.PI / 13,\n } = options;\n\n const coordlength = coords.length;\n\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n const [coord1, coord2] = [coords[0], coords[1]];\n const len = getBaseLength(coords);\n const tailWidth = len * tailWidthFactor;\n const neckWidth = len * neckWidthFactor;\n const headWidth = len * headWidthFactor;\n const tailLeft = getThirdCoord(coord2, coord1, HALF_PI, tailWidth, true);\n const tailRight = getThirdCoord(coord2, coord1, HALF_PI, tailWidth, false);\n const headLeft = getThirdCoord(coord1, coord2, headAngle, headWidth, false);\n const headRight = getThirdCoord(coord1, coord2, headAngle, headWidth, true);\n const neckLeft = getThirdCoord(coord1, coord2, neckAngle, neckWidth, false);\n const neckRight = getThirdCoord(coord1, coord2, neckAngle, neckWidth, true);\n const pList = [tailLeft, neckLeft, headLeft, coord2, headRight, neckRight, tailRight];\n return pList;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { arrowStraightSharp } from './arrowStraightSharp';\n\n/**\n * 直箭头\n */\nexport function arrowStraight(coords: CoordArray[]): CoordArray[] {\n const tailWidthFactor = 0.05;\n const neckWidthFactor = 0.1;\n const headWidthFactor = 0.15;\n\n const headAngle = Math.PI / 4;\n const neckAngle = Math.PI * 0.17741;\n return arrowStraightSharp(coords, {\n tailWidthFactor,\n neckWidthFactor,\n headWidthFactor,\n headAngle,\n neckAngle,\n });\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getThirdCoord, mathDistance } from './helper';\n\n/**\n * 细直箭头\n */\nexport function arrowStraightFine(coords: CoordArray[]): CoordArray[] {\n const maxArrowLength = 3000000;\n const arrowLengthScale = 5;\n\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n const [coord1, coord2] = [coords[0], coords[1]];\n const distance = mathDistance(coord1, coord2);\n let len = distance / arrowLengthScale;\n len = Math.min(len, maxArrowLength);\n const leftCoord = getThirdCoord(coord1, coord2, Math.PI / 6, len, false);\n const rightCoord = getThirdCoord(coord1, coord2, Math.PI / 6, len, true);\n return [coord1, coord2, leftCoord, coord2, rightCoord];\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, HALF_PI } from './helper';\n\nexport interface SquadCombatOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n}\n\n/**\n * 分队战斗行动(尖曲箭头)\n */\nexport function arrowUnitCombatOperation(coords: CoordArray[], options: SquadCombatOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n } = options;\n\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n else {\n const allLen = getBaseLength(coords);\n const tailWidth = allLen * tailWidthFactor;\n const tailLeft = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, false);\n const tailRight = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, true);\n const headCoords = getArrowHeadCoords(coords, {\n tailLeft,\n tailRight,\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const neckLeft = headCoords[0];\n const neckRight = headCoords[4];\n const bodyCoords = getArrowBodyCoords(coords, neckLeft, neckRight, tailWidthFactor);\n\n const coordlength = bodyCoords.length;\n let leftCoords = [tailLeft].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailRight].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse());\n }\n else {\n return [];\n }\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getArrowBodyCoords, getArrowHeadCoords } from './arrowAttackDirection';\nimport { getBaseLength, getQBSplineCoords, getThirdCoord, HALF_PI } from './helper';\n\nexport interface TailedSquadCombatOptions {\n headHeightFactor?: number;\n headWidthFactor?: number;\n neckHeightFactor?: number;\n neckWidthFactor?: number;\n tailWidthFactor?: number;\n headTailFactor?: number;\n swallowTailFactor?: number;\n swallowTailCoord?: CoordArray;\n}\n\n/**\n * 燕尾尖箭头\n */\nexport function arrowUnitCombatOperationTailed(coords: CoordArray[], options: TailedSquadCombatOptions = {}): CoordArray[] {\n const {\n headHeightFactor = 0.18,\n headWidthFactor = 0.3,\n neckHeightFactor = 0.85,\n neckWidthFactor = 0.15,\n tailWidthFactor = 0.1,\n swallowTailFactor = 1,\n } = options;\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const allLen = getBaseLength(coords);\n const tailWidth = allLen * tailWidthFactor;\n const tailLeft = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, false);\n const tailRight = getThirdCoord(coords[1], coords[0], HALF_PI, tailWidth, true);\n const len = tailWidth * swallowTailFactor;\n const swallowTailCoord = getThirdCoord(coords[1], coords[0], 0, len, true);\n const tailCoords = [tailLeft, swallowTailCoord, tailRight];\n\n const headCoords = getArrowHeadCoords(coords, {\n tailLeft: tailCoords[0],\n tailRight: tailCoords[2],\n headHeightFactor,\n headWidthFactor,\n neckWidthFactor,\n neckHeightFactor,\n });\n if (headCoords && headCoords.length > 4) {\n const neckLeft = headCoords[0];\n const neckRight = headCoords[4];\n const bodyCoords = getArrowBodyCoords(coords, neckLeft, neckRight, tailWidthFactor);\n\n const coordlength = bodyCoords.length;\n let leftCoords = [tailCoords[0]].concat(bodyCoords.slice(0, coordlength / 2));\n leftCoords.push(neckLeft);\n let rightCoords = [tailCoords[2]].concat(bodyCoords.slice(coordlength / 2, coordlength));\n rightCoords.push(neckRight);\n leftCoords = getQBSplineCoords(leftCoords);\n rightCoords = getQBSplineCoords(rightCoords);\n return leftCoords.concat(headCoords, rightCoords.reverse(), [tailCoords[1], leftCoords[0]]);\n }\n return [];\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, getBisectorNormals, getCubicValue, mid } from './helper';\n\n/**\n * 集结地\n *\n */\nexport function assemblingPlace(coords: CoordArray[]): CoordArray[] {\n if (coords.length < 3) {\n throw new Error(`coords.length must >= 3`);\n }\n const t = 0.4;\n\n const midCoord = mid(coords[0], coords[2]);\n coords.push(midCoord, coords[0], coords[1]);\n let normals: CoordArray[] = [];\n const pList: CoordArray[] = [];\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n const coord3 = coords[i + 2];\n const normalCoords = getBisectorNormals(t, coord1, coord2, coord3);\n normals = normals.concat(normalCoords);\n }\n const count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n pList.push(coord1);\n for (let t = 0; t <= FITTING_COUNT; t++) {\n const coord = getCubicValue(t / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n pList.push(coord);\n }\n pList.push(coord2);\n }\n return pList;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { mathDistance } from './helper';\n\n/**\n * 标绘画圆算法,继承面要素相关方法和属性\n */\nexport function circle(coords: CoordArray[]): CoordArray[] {\n const coordlength = coords.length;\n if (coordlength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const center = coords[0];\n const radius = mathDistance(center as CoordArray, coords[1]);\n let [x, y, angle] = [0, 0, 0];\n const _coords: CoordArray[] = [];\n for (let i = 0; i <= 100; i++) {\n angle = (Math.PI * 2 * i) / 100;\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n _coords.push([x, y]);\n }\n return _coords;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, getBisectorNormals, getCubicValue } from './helper';\n/**\n * 闭合曲面\n *\n */\nexport function closedCurve(coords: CoordArray[]): CoordArray[] {\n const t = 0.3;\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n coords.push(coords[0], coords[1]);\n let normals: CoordArray[] = [];\n const pList: CoordArray[] = [];\n for (let i = 0; i < coords.length - 2; i++) {\n const normalCoords = getBisectorNormals(t, coords[i], coords[i + 1], coords[i + 2]);\n normals = normals.concat(normalCoords);\n }\n const coordlength = normals.length;\n normals = [normals[coordlength - 1]].concat(normals.slice(0, coordlength - 1));\n for (let i = 0; i < coords.length - 2; i++) {\n const coord1 = coords[i];\n const coord2 = coords[i + 1];\n pList.push(coord1);\n for (let t = 0; t <= FITTING_COUNT; t++) {\n const coord = getCubicValue(t / FITTING_COUNT, coord1, normals[i * 2], normals[i * 2 + 1], coord2);\n pList.push(coord);\n }\n pList.push(coord2);\n }\n return pList;\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { getCurveCoords } from './helper';\n/**\n * 标绘曲线算法\n */\nexport function curve(coords: CoordArray[]): CoordArray[] {\n const t = 0.3;\n const coordlength = coords.length;\n if (coordlength < 3) {\n throw new Error('coords.length must >= 2');\n }\n else {\n return getCurveCoords(t, coords);\n }\n}\n","import type { CoordArray } from '@vesium/shared';\nimport { FITTING_COUNT, mid } from './helper';\n\n/**\n * 标绘画椭圆算法,继承面要素相关方法和属性\n */\nexport function ellipse(coords: CoordArray[]): CoordArray[] {\n const coordLength = coords.length;\n\n if (coordLength < 2) {\n throw new Error('coords.length must >= 2');\n }\n const [coord1, coord2] = [coords[0], coords[1]];\n const center = mid(coord1, coord2);\n const majorRadius = Math.abs((coord1[0] - coord2[0]) / 2);\n const minorRadius = Math.abs((coord1[1] - coord2[1]) / 2);\n let [x, y, angle] = [0, 0, 0];\n const _coords: CoordArray[] = [];\n for (let i = 0; i <= FITTING_COUNT; i++) {\n angle = (Math.PI * 2 * i) / FITTING_COUNT;\n x = center[0] + majorRadius * Math.cos(angle);\n y = center[1] + minorRadius * Math.sin(angle);\n coords.push([x, y]);\n }\n return _coords;\n}\n","import type { CoordArray } from '@vesium/shared';\nimport {\n getArcCoords,\n getAzimuth,\n getCircleCenterOfThreeCoords,\n getThirdCoord,\n HALF_PI,\n isClockWise,\n mathDistance,\n mid,\n} from './helper';\n\n//\n\n/**\n * 弓形\n */\nexport function lune(coords: CoordArray[]): CoordArray[] {\n coords = [...coords];\n const coordLength = coords.length;\n\n if (coordLength < 2) {\n throw new Error('coords.length must >= 2');\n }\n\n if (coordLength === 2) {\n const midCoord = mid(coords[0], coords[1]);\n const d = mathDistance(coords[0], midCoord);\n const coord = getThirdCoord(coords[0], midCoord, HALF_PI, d);\n coords.push(coord);\n }\n\n let [coord1, coord2, coord3, startAngle, endAngle] = [coords[0], coords[1], coords[2], 0, 0];\n const center = getCircleCenterOfThreeCoords(coord1, coord2, coord3);\n const radius = mathDistance(coord1, center);\n const angle1 = getAzimuth(coord1, center);\n const angle2 = getAzimuth(coord2, center);\n if (isClockWise(coord1, coord2, coord3)) {\n startAngle = angle2;\n endAngle = angle1;\n }\n else {\n startAngle = angle1;\n endAngle = angle2;\n }\n coords = getArcCoords(center, radius, startAngle, endAngle);\n coords.push(coords[0]);\n return coords;\n}\n","import type { CoordArray } from '@vesium/shared';\n\n/**\n * 规则矩形\n *\n */\nexport function rectAngle(coords: CoordArray[]): CoordArray[] {\n if (coords.length < 2) {\n throw new Error('coords.length must >= 2');\n }\n const [startCoord, endCoord] = coords;\n return [startCoord, [startCoord[0], endCoord[1]], endCoord, [endCoord[0], startCoord[1]], startCoord];\n}\n","import type { CoordArray } from '@vesium/shared';\n\n/**\n * 斜矩形1\n *\n */\nexport function rectinclined1(coords: CoordArray[]): CoordArray[] {\n const coordLength = coords.length;\n if (coordLength < 3) {\n throw new Error('coords.length must >= 3');\n }\n else {\n const [coord1, coord2, mouse] = [coords[0], coords[1], coords[2]];\n const d = calculatePerpendicularDistance(coord1, coord2, mouse);\n const direction = calculatePositionRelativeToLine(coord1, coord2, mouse);\n const coord3 = calculatePerpendicularCoord(coord1, coord2, direction * d);\n const coord4 = calculateFourthCoord(coord1, coord2, coord3);\n const pList: CoordArray[] = [];\n pList.push(coord1, coord2, coord3, coord4, coord1);\n return pList;\n }\n}\n\n/**\n * 已知p1,p2,p3三点,计算p3到p1p2的垂直距离\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculatePerpendicularDistance(p1: CoordArray, p2: CoordArray, p3: CoordArray) {\n // 计算向量V的分量\n const vx = p2[0] - p1[0];\n const vy = p2[1] - p1[1];\n // 计算P1P3的分量\n const px = p3[0] - p1[0];\n const py = p3[1] - p1[1];\n // 计算向量V的模长\n const vMagnitude = Math.hypot(vx, vy);\n // 计算点积\n const dotProduct = px * vx + py * vy;\n // 计算投影长度\n const projectionLength = dotProduct / vMagnitude;\n // 计算P1P3的模长\n const pMagnitude = Math.hypot(px, py);\n // 计算垂直距离\n const perpendicularDistance = Math.sqrt(pMagnitude * pMagnitude - projectionLength * projectionLength);\n return perpendicularDistance;\n}\n\n/**\n * 已知p1,p2,两点,判断p3点在p1p2的左右,返回-1右侧,0线上,1左侧\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculatePositionRelativeToLine(p1: CoordArray, p2: CoordArray, p3: CoordArray) {\n const v1 = {\n x: p2[0] - p1[0],\n y: p2[1] - p1[1],\n };\n const v2 = {\n x: p3[0] - p1[0],\n y: p3[1] - p1[1],\n };\n const crossProduct = v1.x * v2.y - v1.y * v2.x;\n const direction = crossProduct > 0 ? 1 : -1;\n if (p1[1] > p2[1]) {\n return direction;\n }\n return -direction;\n}\n\n/**\n * 已知p1,p2,p3点求矩形的p4点\n * @param {*} p1\n * @param {*} p2\n * @param {*} p3\n */\nexport function calculateFourthCoord(p1: CoordArray, p2: CoordArray, p3: CoordArray): CoordArray {\n const x = p1[0] + p3[0] - p2[0];\n const y = p1[1] + p3[1] - p2[1];\n return [x, y];\n}\n\n/**\n * 已知p1,p2两点和距离d,求距离p1p2垂直距离为d的点p3\n * @param {*} p1\n * @param {*} p2\n * @param {*} d\n */\nexport function calculatePerpendicularCoord(p1: CoordArray, p2: CoordArray, d: number): CoordArray {\n // 计算p1p2的斜率\n const m = (p2[1] - p1[1]) / (p2[0] - p1[0]);\n\n let x, y;\n // 计算垂线的斜率\n if (m !== 0) {\n const perpendicularSlope = -1 / m;\n // 根据垂线斜率和已知点p2的坐标,得到垂线方程中的常数项\n const c = p2[1] - perpendicularSlope * p2[0];\n // 解垂线方程,求解x和y的值\n x = d * Math.sqrt(1 / (1 + perpendicularSlope ** 2)) + p2[0];\n y = perpendicularSlope * x + c;\n }\n else {\n x = p2[0];\n y = p2[1] - d;\n }\n // 返回垂线另一端点的坐标\n return [x, y];\n}\n"],"mappings":"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"}
|