//计算三角形面积
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. Scrum 框架的四个会议还适用于哪些敏捷方法?

    敏捷转型需要深入理解概念和思维,团队才能更好的进行实践.本文将通过介绍Scrum框架的四个会议还适用于哪些敏捷方法,来让大家更直观的理解敏捷转型. 本文整理自:PingCode 敏捷大学,转载请注明链 ...

  2. 一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵

    作者:韩信子@ShowMeAI Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 计算机视觉实战系列:https://www.showmeai ...

  3. 在windows下导入react项目并且打包编译后部署到nginx上

    在windows下导入react项目并且打包编译后部署到nginx上 一.安装npm 二.创建react项目 三.安装nginx 四.总结 最近接手了公司的一个django项目,这是应该前后端分离的项 ...

  4. Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑

    引言 最近做边缘计算项目,因为没有基础,所以首先学习Kubernetes.感觉系统的中文入门资料比较少,只找到<Kubernetes权威指南>(龚正.吴治辉等著,下称<指南>) ...

  5. 《HTTP权威指南》 – 11.验证码和新鲜度

    服务器应当告知客户端能够将内容缓存多长时间,在这个时间内就是新鲜的.服务器可以用这两个首部之一来提供信息: Expires(过期) Cache - Control(缓存控制) Expires首部 规定 ...

  6. JavaScript:对象:如何创建对象?

    JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数. 如何去理解对象,什么是对象呢? 举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这里不去谈类是什么概 ...

  7. Apache Dubbo 官方正式发布 Spring 6 & Spring Boot 3 支持

    Dubbo 简介 Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java.Golang 等多语言 SDK 实现.使用 Dubbo 开发的 ...

  8. NSSCTF_HUBUCTF的web部分题解

    checkin 题目: 主要是php弱比较和序列化知识点考察 <?php $username = "this_is_secret"; $password = "th ...

  9. 9、手写一个starter

    一.starte详解: 1.starter场景启动器: SpringBoot-starter是一个集成接合器,主要完成两件事: (1).引入模块所需的相关jar包 (2).自动配置各自模块所需的属性 ...

  10. 【转载】SQL 2012以上版本分页查询更简单

    2012以上版本分页查询更简单 注意:以下都是先执行排序,再取行数据 select* from t_workers order by worker_id desc offset 3 rows   -- ...