一些技术路线测试,增加git,方便代码还原
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
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
}