//计算三角形面积
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 判断是否是数组
 

Cesium计算多边形面积(十一)的更多相关文章

  1. poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】

    题目:http://poj.org/problem?id=1265 Sample Input 2 4 1 0 0 1 -1 0 0 -1 7 5 0 1 3 -2 2 -1 0 0 -3 -3 1 0 ...

  2. 利用python计算多边形面积

    最近业务上有一个需求,给出多边形面积. Google了一下,发现国内论坛给的算法都是你抄我我抄你,也不验证一下是否正确, 从 博客园到csdncsdn 然后传播到国内各个角落...真是无力吐槽了. 直 ...

  3. js版根据经纬度计算多边形面积(墨卡托投影)

    [摘要:var earthRadiusMeters = 6371000.0; var metersPerDegree = 2.0 * Math.PI * earthRadiusMeters / 360 ...

  4. POJ 3907 Build Your Home | 计算多边形面积

    给个多边形 计算面积 输出要四舍五入 直接用向量叉乘就好 四舍五入可以+0.5向下取整 #include<cstdio> #include<algorithm> #includ ...

  5. [C语言] 关于计算多边形面积的一点问题

    [一道练习题] 面基 时间限制:1000ms   内存限制:65536kb 通过率:107/134 (79.85%)    正确率:107/319 (33.54%) 题目描述 按顺时针或逆时针顺序输入 ...

  6. leaflet计算多边形面积

    上一篇介绍了使用leaflet绘制圆形,那如何计算圆形的面积呢? 1.使用数学公式计算,绘制好圆形后,获取中心点以及半径即可 2.使用第三方工具计算,如turf.js. 这里turf的area方法入参 ...

  7. hdu-2036求任意多边形面积

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. 【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】

    利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的 ...

  9. HDU_2036——多边形面积,行列式计算

    Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)”话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也 ...

  10. hdu2036 (计算多边形的面积)

    Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...

随机推荐

  1. linux配置 python 开发环境sublime text及一些使用心得

    前言 一直以来我都使用 sublime text 作为主流开发的 ide ,但其实我开始在我的 linux mint 系统使用 sublime text 配置 python3 的开发环境踩过的坑又何止 ...

  2. Django的manytomany字段

    manytomany字段 用于表示多对多的关系,最常见的就是老师和班级的例子 一个老师可以教多个班级,一个班级也可以有多个老师 add 添加关系 teachers=models.Teacher.obj ...

  3. 2.5:Python常用内置数据结构、多维数组ndarray、Series和DataFrame

    一.Python内置数据结构 1.赋值生成列表 la=[1,2,3,4] la 2.强制转换为列表 lb=list("Hello") lb 3.推导式生成列表 s="ab ...

  4. 论文解读(CDTrans)《CDTrans: Cross-domain Transformer for Unsupervised Domain Adaptation》

    论文信息 论文标题:CDTrans: Cross-domain Transformer for Unsupervised Domain Adaptation论文作者:Tongkun Xu, Weihu ...

  5. 日爬百万数据的域名限制、url的清洗和管理

    一.域名去重1.检测开头:link.startswith('http') txt = "Hello, welcome to my world." x = txt.startswit ...

  6. day35-JSON&Ajax03

    JSON&Ajax03 4.jQuery的Ajax请求 原生Ajax请求问题分析: 编写原生的Ajax要写很多的代码,还要考虑浏览器兼容问题,使用不方便 在实际工作中,一般使用JavaScri ...

  7. MSTN CE和MSTN SDK安装经验及技巧

    MSTN CE和MSTN SDK安装经验及技巧 本文介绍了MSTN CE及MSTN CE SDK安装的流程以及在安装时可能会遇到的问题 一.MSTN CE安装 1.MSTN CE即Microstati ...

  8. python前言

    目录 一.typora软件以及markdown语法介绍 1.输入标题的两种方法 2.无序列表 3.有序列表 4.在typora里插入多行代码块 5.制作表格 6.表情包 7.链接 8.Typora查看 ...

  9. Docker容器入门到精通

    Docker 容器 快速入门 第一章:Docker容器 第二章:Dockerfile指令与Docker-compose容器编排-搭建docker私有仓库 h1 { color: rgba(0, 60, ...

  10. 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?

    谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...