Pārlūkot izejas kodu

improve the area math

tags/2.3.1
Caven Chen pirms 4 gadiem
vecāks
revīzija
bd5efc4bad
1 mainītis faili ar 50 papildinājumiem un 9 dzēšanām
  1. 50
    9
      modules/math/area.js

+ 50
- 9
modules/math/area.js Parādīt failu

@@ -3,19 +3,60 @@
* @Date: 2020-04-24 14:49:37
*/

import { Cesium } from '@dc-modules/namespace'
import { Transform } from '@dc-modules/transform'

/**
*
* @param p0
* @param p1
* @param p2
* @returns {number}
* @private
*/
function triangleArea(p0, p1, p2) {
let v0 = Cesium.Cartesian3.subtract(p0, p1, new Cesium.Cartesian3())
let v1 = Cesium.Cartesian3.subtract(p2, p1, new Cesium.Cartesian3())
let cross = Cesium.Cartesian3.cross(v0, v1, v0)
return Cesium.Cartesian3.magnitude(cross) * 0.5
}

export default function area(positions) {
let result = 0
if (positions && Array.isArray(positions)) {
let h = 0
let pos = positions.concat(positions[0])
for (let i = 1; i < pos.length; i++) {
let oel = Transform.transformWGS84ToCartesian(pos[i - 1])
let el = Transform.transformWGS84ToCartesian(pos[i])
h += oel.x * el.y - el.x * oel.y
}
result = Math.abs(h).toFixed(2)
if (!Array.isArray(positions)) {
return result
}
if (!(positions[0] instanceof Cesium.Cartesian3)) {
positions = Transform.transformWGS84ArrayToCartesianArray(positions)
}
let geometry = Cesium.CoplanarPolygonGeometry.createGeometry(
Cesium.CoplanarPolygonGeometry.fromPositions({
positions: positions,
vertexFormat: Cesium.VertexFormat.POSITION_ONLY
})
)
if (!geometry) {
return result
}
let flatPositions = geometry.attributes.position.values
let indices = geometry.indices
for (let i = 0; i < indices.length; i += 3) {
let p0 = Cesium.Cartesian3.unpack(
flatPositions,
indices[i] * 3,
new Cesium.Cartesian3()
)
let p1 = Cesium.Cartesian3.unpack(
flatPositions,
indices[i + 1] * 3,
new Cesium.Cartesian3()
)
let p2 = Cesium.Cartesian3.unpack(
flatPositions,
indices[i + 2] * 3,
new Cesium.Cartesian3()
)
result += triangleArea(p0, p1, p2)
}
return result
}

Notiek ielāde…
Atcelt
Saglabāt