/**
|
* @Author: Caven
|
* @Date: 2020-08-30 17:17:52
|
*/
|
|
import { Cesium } from '@dc-modules/namespace'
|
import Parse from '@dc-modules/parse/Parse'
|
import { Transform } from '@dc-modules/transform'
|
import { PlotUtil } from '@dc-modules/utils'
|
|
const HALF_PI = Math.PI / 2
|
|
const FITTING_COUNT = 100
|
|
class GatheringPlaceGraphics {
|
constructor(options) {
|
this._positions = options?.positions || []
|
this.t = 0.4
|
}
|
|
set positions(positions) {
|
this._positions = positions
|
}
|
|
get positions() {
|
return this._positions
|
}
|
|
get hierarchy() {
|
return this._createHierarchy()
|
}
|
|
_createHierarchy() {
|
let pnts = Parse.parsePolygonCoordToArray(
|
Transform.transformCartesianArrayToWGS84Array(this._positions)
|
)[0]
|
if (this._positions.length === 2) {
|
let mid = PlotUtil.mid(pnts[0], pnts[1])
|
let d = PlotUtil.distance(pnts[0], mid) / 0.9
|
let pnt = PlotUtil.getThirdPoint(pnts[0], mid, HALF_PI, d, true)
|
pnts = [pnts[0], pnt, pnts[1]]
|
}
|
let mid = PlotUtil.mid(pnts[0], pnts[2])
|
pnts.push(mid, pnts[0], pnts[1])
|
let normals = []
|
for (let i = 0; i < pnts.length - 2; i++) {
|
let pnt1 = pnts[i]
|
let pnt2 = pnts[i + 1]
|
let pnt3 = pnts[i + 2]
|
let normalPoints = PlotUtil.getBisectorNormals(this.t, pnt1, pnt2, pnt3)
|
normals = normals.concat(normalPoints)
|
}
|
let count = normals.length
|
normals = [normals[count - 1]].concat(normals.slice(0, count - 1))
|
let pList = []
|
for (let i = 0; i < pnts.length - 2; i++) {
|
let pnt1 = pnts[i]
|
let pnt2 = pnts[i + 1]
|
pList.push(pnt1)
|
for (let t = 0; t <= FITTING_COUNT; t++) {
|
let pnt = PlotUtil.getCubicValue(
|
t / FITTING_COUNT,
|
pnt1,
|
normals[i * 2],
|
normals[i * 2 + 1],
|
pnt2
|
)
|
pList.push(pnt)
|
}
|
pList.push(pnt2)
|
}
|
return new Cesium.PolygonHierarchy(
|
Transform.transformWGS84ArrayToCartesianArray(Parse.parsePositions(pList))
|
)
|
}
|
}
|
|
export default GatheringPlaceGraphics
|