计算多边形面积的方法为将多边形分解成多个三角形,然后把这些三角形的面积相加。三角形面积为两边向量叉积除以2。

  这是Java代码,目前是第3版 ,已经尽可能优化了,相比初版有25%的性能提升。

 /*** 平面多边形面积算法3,用原点为基点(不需要从图形边线上取点)<br/>* 多计算一条线段,但减少了每一步的两次减法(起于原点的向量等于节点的坐标),使误差减小,每一步的计算量减少。* * @return 正方向(x轴向y轴旋转方向)圈成的面积(如果有反方向的圈,则面积会被抵消,导致结果小于直观观测的面积或为负数)*/private static final double getPolygonAreaMethodC(double... points) {if (points.length < 6) {// 无法构成多边形return 0;}final int pointArrayLength = points.length & (~1);// final int pointCount = pointArrayLength / 2;double area = 0.0;double dx1, dy1;double dx2, dy2;// 从原点到该点的向量dx1 = points[pointArrayLength - 2];dy1 = points[pointArrayLength - 1];for (int i = 0; i < pointArrayLength;) {// 从原点到该点的向量dx2 = points[i++];dy2 = points[i++];// 三角形的面积2倍,平行四边形面积。为提高性能,不在循环中进行面积减半final double subArea = dx1 * dy2 - dx2 * dy1;// 由jvm进行智能内联,分出这一步不会影响性能area += subArea;// 向量传递dx1 = dx2;dy1 = dy2;}// 最后统一除以2,提高性能return area / 2;}

  除了可以用来计算面积,还可以进行分布式计算π。把半径R的圆分解成很多边的多边形,每台计算机只计算其中的一部分。然后将每台计算机算出的面积相加得到面积S。π=S/(R^2)。这只是一种用法,事实上并不建议用此方法计算π。最好的办法仍然是可迭代的,所以分布式计算π并没有优势。

  下面是C++的版本,也是初版,作为参考。

        /*** 平面多边形面积** @return*/
double getPolygonArea(double *points, int length) {if (length < 6) {// 无法构成多边形return 0;}double area = 0.0;double x0 = points[0], y0 = points[1];double dx1, dy1;double dx2, dy2;dx1 = points[2] - x0;dy1 = points[3] - y0;for (int i = 4; i < length - 1; i += 2) {dx2 = points[i] - x0;dy2 = points[i + 1] - y0;double subArea = (dx1 * dy2 - dx2 * dy1) / 2.0;area += subArea;dx1 = dx2;dy1 = dy2;}return area;
}

Java并发版本(有依赖项,不可直接使用)。

依赖项1:ParallelTask.parallelFor其实是线程池。第一个参数0代表WorkSteal线程池。第二个参数代表Lambda执行的次数,一般取CPU核心数。Lambda的参数threadOrder代表此Lambda所在线程启动的顺序。静态的方法parallelFor代表内部生成线程池,并在返回之前关闭和等待线程池任务结束。ParallelTask是一个实现了十几种动态与静态parallelFor的大文件,不方便上传。

依赖项2:StaticSystemUtils.getCPUCoreCount就是Runtime.avaliableProcesses()。StaticSystemUtils是一个获取系统信息的大文件,不方便上传。

依赖项3:StaticMathUtils.sum就是一个求和函数。StaticMathUtils是一个包含数十种算术方法,几千行的大文件,不方便上传。

 /*** 平面多边形面积算法3,用原点为基点(不需要从图形边线上取点)<br/>* 多计算一条线段,但减少了每一步的两次减法(起于原点的向量等于节点的坐标),使误差减小,每一步的计算量减少。* * @return 正方向(x轴向y轴旋转方向)圈成的面积(如果有反方向的圈,则面积会被抵消,导致结果小于直观观测的面积或为负数)*/public static final double getPolygonAreaParallel(double... points) {if (points.length < 6) {// 无法构成多边形return 0;}final int pointArrayLength = points.length & (~1);final int pointCount = pointArrayLength / 2;double area = 0.0;final int taskCount = Math.min(StaticSystemUtils.getCPUCoreCount(), pointCount);final double[] eachArea = new double[taskCount];ParallelTask.parallelFor(0, taskCount, threadOrder -> {final int from = (int) ((long) threadOrder * pointArrayLength / taskCount) & (~1);final int to = (int) ((long) (threadOrder + 1) * pointArrayLength / taskCount) & (~1);double threadArea = 0.0;double dx1, dy1;double dx2, dy2;// 从原点到该点的向量if (threadOrder == 0) {dx1 = points[pointArrayLength - 2];dy1 = points[pointArrayLength - 1];} else {dx1 = points[from - 2];dy1 = points[from - 1];}for (int i = from; i < to;) {// 从原点到该点的向量dx2 = points[i++];dy2 = points[i++];// 三角形的面积2倍,平行四边形面积。为提高性能,不在循环中进行面积减半final double subArea = dx1 * dy2 - dx2 * dy1;// 由jvm进行智能内联,分出这一步不会影响性能threadArea += subArea;// 向量传递dx1 = dx2;dy1 = dy2;}eachArea[threadOrder] = threadArea;});area = StaticMathUtils.sum(eachArea);// 最后统一除以2,提高性能return area / 2;}

向量法计算多边形面积相关推荐

  1. 通过坐标点位,计算多边形面积

    多边形面积 本文使用三角形面积累计法计算多边形面积,就是将多边形按照一个顶点,分割成多个三角形,计算三角形的面积,累加,得到多边形的面积. 当然,这个算法也有一些缺点,当这个多边形比较奇怪的时候,不能 ...

  2. 判断多边形的凹凸性和计算多边形面积:利用向量叉乘

    根据百度百科的讲解: 凸多边形 现在重点讲解顶点凹凸性法(最常用也是较为简单的方法):计算总结在最后. 利用向量叉乘的相关知识进行计算:假设当前连续的三个顶点分别是P1,P2,P3.计算向量P1P3, ...

  3. python计算多边形面积_Python求凸包及多边形面积教程

    一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham's scan),时间复杂度为O(nlgn):Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h ...

  4. 线段树辅助——扫描线法计算矩形面积并

    线段树辅助--扫描线法计算矩形面积并 本篇文章转自:传送门 分析: 1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度 ...

  5. Java 根据多边形坐标点 计算多边形面积

    请仔细阅读代码注释(有肯多坑,跟着注释走没问题) 亲测有效 /*** 计算多边形面积公式** @author Lion Li* @date 2020-05-19*/ public class Poly ...

  6. Kinect体感机器人(三)—— 空间向量法计算关节角度

    Kinect体感机器人(三)-- 空间向量法计算关节角度 By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) 终于写到体感机器人的核心代码了, ...

  7. python计算多边形面积

    本文提供一个简单的方法计算多边形面积,参考维基百科 实现代码: def polygon_area(polygon):"""compute polygon areapoly ...

  8. 5分钟理解外积计算多边形面积

    5分钟理解外积计算多边形面积 在矢量结构下,面状物体用其轮廓线构成的多边形表示,对于简单多边形,设有n个顶点,面积计算公式为: 公式如何得来的呢? 此公式涉及数学中的外积,外积即叉乘: "a ...

  9. matlab 二维凸包面积,PKU——3348——(凸包和计算多边形面积)

    //3348 Accepted 264K 0MS C++ 4016B//典型的凸包和计算多边形面积#include#include#include#include#include#includeusi ...

最新文章

  1. mfc e将控件置于窗口顶层_【创e分享】Word毕业论文排版全攻略
  2. 【推荐】LSI(latent semantic indexing) 完美教程
  3. ZZ flex preloader
  4. 小白2分钟学会Visual Studio将引用包打包到NuGet上
  5. chmod命令用法_关于chmod(变更用户对此文件的相关权限)超详细说明,小白秒懂
  6. 文献学习(part80-B)--Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?
  7. php asp.net core,asp.net core实例教程之配置
  8. 【python学习】——读取csv文件
  9. LeetCode 523. 连续的子数组和(求余 哈希)
  10. chrome切换前端模式_Chrome调试工具developer tool技巧 - 轩枫阁
  11. HTTP 请求之URLs 与 URNs
  12. Spark的event事件监听器LiveListenerBus和特质SparkListenerBus以及特质ListenerBus
  13. android快速点击分析
  14. 查询jdk支持的 tsl协议版本
  15. 百度指数邀请序列号_腾讯第8款社交AppHood 上线;抖音内测云游戏、直播回放等新功能;百度推出多人视频社交App一起吧| 产品挖掘机...
  16. Bolt界面引擎元对象(UIObject)的动态创建
  17. AD14如何设置指定线路与敷铜之间的安全距离
  18. linux飞行模式切换,光遇飞行的两种模式区别 飞行模式切换和区别分析
  19. html古诗竖版,古诗词竖版图片
  20. sel在c语言,iOS 你所不知道的SEL

热门文章

  1. 14.8 volatile关键字
  2. react使用antd-mobile做自定义替换头像功能
  3. 微信小程序怎么弄成链接_微信小程序怎么复制链接 技术方法帮你解决
  4. 为什么springboot项目的pom.xml引入依赖不需要加版本号
  5. GUVC-T10GD-L185 臭氧灯监控172nm和185nm紫外线灯监测高可靠性光电二极管杀菌灯监控
  6. google正在等待cnd.bootcss.com的响应
  7. [MySQL] 统计图数据查询 (MySQL查询时间范围内所有日期)
  8. 开源软件新时代:55个经典开源Windows工具
  9. Nginx+Tomcat服务器负载均衡实践方案
  10. idea 2020取消Import Maven projects automatically