import { GeometryUtils } from '../utils/geometry-utils.js' const gu = new GeometryUtils() export async function calcRouteSplit (viewer, positions, angle, space, relativeHeight, isActivateEdit) { const entity = viewer.entities.getById('flightLine') if (entity) viewer.entities.remove(entity) if (!Array.isArray(positions) || positions.length < 4 || !(space > 0)) return [] const positionOffset = gu.computeOffsetPositions(positions, relativeHeight) const distance01 = Cesium.Cartesian3.distance(positionOffset[0], positionOffset[1]) const distance12 = Cesium.Cartesian3.distance(positionOffset[1], positionOffset[2]) const distance23 = Cesium.Cartesian3.distance(positionOffset[2], positionOffset[3]) const distance30 = Cesium.Cartesian3.distance(positionOffset[3], positionOffset[0]) const splitLinePosition = [] if (angle === 0) { if (!isActivateEdit) { const split12 = gu.splitSegment(positionOffset[1], positionOffset[2], space, false) const newSplit03 = gu.splitSegment(positionOffset[3], positionOffset[0], space, true) for (let i = 0; i < split12.length; i++) { if (i % 2 === 0) { splitLinePosition.push(newSplit03[i], split12[i]) } else { splitLinePosition.push(split12[i], newSplit03[i]) } } } else { const adj = gu.adjustCornersByProjection(positionOffset, distance01) const newPointList = adj.newPointList const distanceNew12 = Cesium.Cartesian3.distance(positionOffset[1], positionOffset[2]) const distanceNew23 = Cesium.Cartesian3.distance(positionOffset[2], positionOffset[3]) const distanceNew30 = Cesium.Cartesian3.distance(positionOffset[3], positionOffset[0]) const newSplit12 = gu.splitSegment(newPointList[1], newPointList[2], space, false) const newSplit03 = gu.splitSegment(newPointList[3], newPointList[0], space, true) const newSplitLinePosition03 = [] const newSplitLinePosition12 = [] const newSplitLinePosition23 = [] for (let i = 0; i < newSplit12.length; i++) { const newLinePoint1 = [newSplit12[i].x, newSplit12[i].y, newSplit12[i].z] const newLinePoint2 = [newSplit03[i].x, newSplit03[i].y, newSplit03[i].z] const linePoint1 = [positionOffset[1].x, positionOffset[1].y, positionOffset[1].z] const linePoint2 = [positionOffset[2].x, positionOffset[2].y, positionOffset[2].z] const intersectPoint12 = math.intersect(newLinePoint1, newLinePoint2, linePoint1, linePoint2) if (intersectPoint12 && intersectPoint12.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint12[0], intersectPoint12[1], intersectPoint12[2]) const distanceLine12 = Cesium.Cartesian3.distance(cartesian3, positionOffset[1]) if (distanceLine12 <= distanceNew12) newSplitLinePosition12.push(cartesian3) } const linePoint3 = [positionOffset[3].x, positionOffset[3].y, positionOffset[3].z] const linePoint0 = [positionOffset[0].x, positionOffset[0].y, positionOffset[0].z] const intersectPoint03 = math.intersect(newLinePoint1, newLinePoint2, linePoint3, linePoint0) if (intersectPoint03 && intersectPoint03.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint03[0], intersectPoint03[1], intersectPoint03[2]) const distanceLine30 = Cesium.Cartesian3.distance(cartesian3, positionOffset[0]) if (distanceLine30 <= distanceNew30) newSplitLinePosition03.push(cartesian3) } const intersectPoint23 = math.intersect(newLinePoint1, newLinePoint2, linePoint3, linePoint2) if (intersectPoint23 && intersectPoint23.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint23[0], intersectPoint23[1], intersectPoint23[2]) const distanceLine23 = Cesium.Cartesian3.distance(cartesian3, adj.distanceP2 > adj.distanceP3 ? positionOffset[2] : positionOffset[3]) if (distanceLine23 < distanceNew23) newSplitLinePosition23.push(cartesian3) } } if (adj.distanceP2 > adj.distanceP3) { const reNewSplitLinePosition0323 = [...newSplitLinePosition03, ...newSplitLinePosition23] for (let i = 0; i < newSplitLinePosition12.length; i++) { if (i % 2 === 0) splitLinePosition.push(reNewSplitLinePosition0323[i], newSplitLinePosition12[i]) else splitLinePosition.push(newSplitLinePosition12[i], reNewSplitLinePosition0323[i]) } } else { const reNewSplitLinePosition1223 = [...newSplitLinePosition12, ...newSplitLinePosition23] for (let i = 0; i < newSplitLinePosition03.length; i++) { if (i % 2 === 0) splitLinePosition.push(newSplitLinePosition03[i], reNewSplitLinePosition1223[i]) else splitLinePosition.push(reNewSplitLinePosition1223[i], newSplitLinePosition03[i]) } } } } else { if (distance12 === distance30) { const split01 = gu.splitSegment(positionOffset[0], positionOffset[1], space, false) const newSplit23 = gu.splitSegment(positionOffset[2], positionOffset[3], space, true) for (let i = 0; i < split01.length; i++) { if (i % 2 === 0) splitLinePosition.push(split01[i], newSplit23[i]) else splitLinePosition.push(newSplit23[i], split01[i]) } } else { const adj = gu.adjustCornersByProjection(positionOffset, distance01) const newPointList = adj.newPointList const distanceNew12 = Cesium.Cartesian3.distance(positionOffset[1], positionOffset[2]) const distanceNew23 = Cesium.Cartesian3.distance(positionOffset[2], positionOffset[3]) const distanceNew30 = Cesium.Cartesian3.distance(positionOffset[3], positionOffset[0]) const distanceNew01 = Cesium.Cartesian3.distance(positionOffset[1], positionOffset[0]) const newSplit01 = gu.splitSegment(newPointList[0], newPointList[1], space, false) const newSplit32 = gu.splitSegment(newPointList[3], newPointList[2], space, false) const newSplitLinePosition01 = [] const newSplitLinePosition12 = [] const newSplitLinePosition23 = [] const newSplitLinePosition03 = [] for (let i = 0; i < newSplit01.length; i++) { const newLinePoint1 = [newSplit01[i].x, newSplit01[i].y, newSplit01[i].z] const newLinePoint2 = [newSplit32[i].x, newSplit32[i].y, newSplit32[i].z] const linePoint1 = [positionOffset[1].x, positionOffset[1].y, positionOffset[1].z] const linePoint2 = [positionOffset[2].x, positionOffset[2].y, positionOffset[2].z] const intersectPoint12 = math.intersect(newLinePoint1, newLinePoint2, linePoint1, linePoint2) if (intersectPoint12 && intersectPoint12.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint12[0], intersectPoint12[1], intersectPoint12[2]) const distanceLine12 = Cesium.Cartesian3.distance(cartesian3, positionOffset[1]) const Cartographic1 = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3) const Cartographic2 = viewer.scene.globe.ellipsoid.cartesianToCartographic(positionOffset[1]) if (distanceLine12 <= distanceNew12 && Cartographic1.height >= Cartographic2.height) newSplitLinePosition12.push(cartesian3) } const linePoint3 = [positionOffset[3].x, positionOffset[3].y, positionOffset[3].z] const linePoint0 = [positionOffset[0].x, positionOffset[0].y, positionOffset[0].z] const intersectPoint03 = math.intersect(newLinePoint1, newLinePoint2, linePoint3, linePoint0) if (intersectPoint03 && intersectPoint03.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint03[0], intersectPoint03[1], intersectPoint03[2]) const distanceLine30 = Cesium.Cartesian3.distance(cartesian3, positionOffset[0]) const Cartographic1 = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3) const Cartographic2 = viewer.scene.globe.ellipsoid.cartesianToCartographic(positionOffset[0]) if (distanceLine30 <= distanceNew30 && Cartographic1.height >= Cartographic2.height) newSplitLinePosition03.push(cartesian3) } const intersectPoint23 = math.intersect(newLinePoint1, newLinePoint2, linePoint3, linePoint2) if (intersectPoint23 && intersectPoint23.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint23[0], intersectPoint23[1], intersectPoint23[2]) const distanceLine03 = Cesium.Cartesian3.distance(cartesian3, positionOffset[2]) const distanceLine04 = Cesium.Cartesian3.distance(cartesian3, positionOffset[3]) const distanceLine233 = Cesium.Cartesian3.distance(positionOffset[2], positionOffset[3]) const distance = distanceLine04 > distanceLine03 ? distanceLine04 : distanceLine03 if (distance < distanceLine233) newSplitLinePosition23.push(cartesian3) } const intersectPoint01 = math.intersect(newLinePoint1, newLinePoint2, linePoint0, linePoint1) if (intersectPoint01 && intersectPoint01.length > 0) { const cartesian3 = new Cesium.Cartesian3(intersectPoint01[0], intersectPoint01[1], intersectPoint01[2]) const distanceLine01 = Cesium.Cartesian3.distance(cartesian3, positionOffset[0]) const distanceLine02 = Cesium.Cartesian3.distance(cartesian3, positionOffset[1]) const distanceLine012 = Cesium.Cartesian3.distance(positionOffset[0], positionOffset[1]) const distance = distanceLine02 > distanceLine01 ? distanceLine02 : distanceLine01 if (distance < distanceLine012) newSplitLinePosition01.push(cartesian3) } } if (adj.distanceP2 > adj.distanceP3) { let arr, brr, startPoint, endPoint if (adj.distanceP20 + adj.distanceP21 > distance01) { if (adj.distanceP30 + adj.distanceP31 > distance01) { arr = [...newSplitLinePosition23].reverse() brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition01].reverse(), [...newSplitLinePosition03].reverse()) startPoint = brr.shift(); endPoint = arr.pop() } else { arr = [...newSplitLinePosition23].reverse().concat([...newSplitLinePosition03].reverse()) brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition01].reverse()) startPoint = brr.shift(); endPoint = arr.pop() } } else { if (adj.distanceP30 + adj.distanceP31 > distance01) { arr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition23].reverse()) brr = [...newSplitLinePosition01].reverse().concat([...newSplitLinePosition03].reverse()) startPoint = arr.shift(); endPoint = brr.pop() } else { arr = [...newSplitLinePosition01].reverse() brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition23].reverse(), [...newSplitLinePosition03].reverse()) startPoint = brr.shift(); endPoint = arr.pop() } } splitLinePosition.push(startPoint) gu.handleSplitLinePosition(arr, brr, splitLinePosition) splitLinePosition.push(endPoint) } else { let arr, brr if (adj.distanceP20 + adj.distanceP21 > distance01) { if (adj.distanceP30 + adj.distanceP31 > distance01) { arr = [...newSplitLinePosition23].reverse() brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition01].reverse(), [...newSplitLinePosition03].reverse()) } else { arr = [...newSplitLinePosition23].reverse().concat([...newSplitLinePosition03].reverse()) brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition01].reverse()) } } else { if (adj.distanceP30 + adj.distanceP31 > distance01) { arr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition23].reverse()) brr = [...newSplitLinePosition01].reverse().concat([...newSplitLinePosition03].reverse()) } else { arr = [...newSplitLinePosition01].reverse() brr = [...newSplitLinePosition12].reverse().concat([...newSplitLinePosition23].reverse(), [...newSplitLinePosition03].reverse()) } } gu.handleSplitLinePosition(arr, brr, splitLinePosition) } } } return splitLinePosition }