Cesium计算多边形面积(十一)

 

复制代码
      //计算三角形面积
      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
      }

      //计算多边形面积
      function area(positions) {
        let result = 0
        if (!Array.isArray(positions)) {
          console.log('不是数组');          
          return result
        }

        if (!(positions[0] instanceof Cesium.Cartesian3)) {
          console.log('不是Cartesian3');
          //转换为Cartesian3数组
          positions = Transform.transformWGS84ArrayToCartesianArray(positions);
        }

        //创建一个geometry
        let geometry = Cesium.CoplanarPolygonGeometry.createGeometry(
          Cesium.CoplanarPolygonGeometry.fromPositions({
            positions: positions,
            vertexFormat: Cesium.VertexFormat.POSITION_ONLY
          })
        )

        if (!geometry) {
          console.log('不是geometry');
          return result
        }

        //顶点坐标数组p;
        let flatPositions = geometry.attributes.position.values
        console.log(flatPositions);

        //确定geometry的基本体的索引,也就是组成其的三角形的索引,每三个为一组,组成一个三角形
        let indices = geometry.indices
        console.log(indices);
        

        //计算三角形面积,最后加在一起
        for (let i = 0; i < indices.length; i += 3) {
          let p0 = Cesium.Cartesian3.unpack(
            flatPositions,
            indices[i] * 3,
            new Cesium.Cartesian3()
          )
          console.log(p0);
          
          let p1 = Cesium.Cartesian3.unpack(
            flatPositions,
            indices[i + 1] * 3,
            new Cesium.Cartesian3()
          )
          console.log(p1);
          let p2 = Cesium.Cartesian3.unpack(
            flatPositions,
            indices[i + 2] * 3,
            new Cesium.Cartesian3()
          )
          console.log(p2);
          result += triangleArea(p0, p1, p2)
        }
        return result
      }

      //一个正方形的四个端点
      var p0 = new Cesium.Cartesian3(0,0,0);
      var p1 = new Cesium.Cartesian3(1,0,0);
      var p2 = new Cesium.Cartesian3(1,1,0);
      var p3 = new Cesium.Cartesian3(0,1,0);

      var input = [p0,p1,p2,p3];
      var output = area(input);
      console.log(output);
  
复制代码

顶点坐标数组flatPositions:

 

 

 

确定geometry的基本体的索引,也就是组成其的三角形的索引,每三个为一组,组成一个三角形indices:

 

 也就是顶点2、3、0组成一个三角形,0,1,2组成一个三角形

 

至于代码中为了要乘3,是为了保证每次取的数组是连续的,比如2、3、0乘3是6、9、0,从6开始取三个6,7,8,从9开始取三个9,10,11,从0开始取三个0,1,2,这样取到的三个点才是正确的三角形

 

用到的一些方法:

Cesium.CoplanarPolygonGeometry.createGeometry 创建geometry
Cesium.Cartesian3.unpack 从数组中生成Cartesian3
Cesium.Cartesian3.subtract 相减,用于生成向量
Cesium.Cartesian3.cross 求叉积
Cesium.Cartesian3.magnitude 求向量的长度
Array.isArray 判断是否是数组

 

 

 
posted @   一摩尔时光  阅读(1187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示