相关文章推荐
寂寞的灯泡  ·  python ...·  1 年前    · 
玩命的奔马  ·  Edge IE ...·  1 年前    · 

计算多边形面积的方法为将多边形分解成多个三角形,然后把这些三角形的面积相加。三角形面积为两边向量叉积除以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;
改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23065    Accepted Submission(s): 11944
三角形 面积 可以用 向量 积来 计算 :S = 1 / 2 * ab x ac =1 / 2 * |ab| * |ac| * sin @(x表示叉乘,@表示ab和ac两边之间的夹角) 为什么要乘1/2呢? 因为ab x ac 出来的是ab和ac为边的四边形的 面积 多边形 可以拆成多个三角形来 计算 面积 。假定有n个顶点,固定一个点就可以将它分为n-2个三角形。 S = A1 + A2 + A3 + A4 该图中固定的点为p1。n=6,分为4个部分。 A1 = 1/2 p1p2 x p1p3 A2 = 1/2
首先看一道hdoj的算 题:hdoj-2036-改革春风吹满地 该题题意就是逆时针给出点的坐标, 这个 多边形 面积 。下面就写一下如何用 向量 多边形 面积 向量 面积 double area(int ax,int ay,int bx,int by,int cx,int cy) return 0.5 * ((ax*by) + (bx*cy) + (cx*ay) - (cx*by) - (bx*ay)-(ax*cy)); 任意凸多边行 面积 划分三角形 任意凹 多边形 面积 右手定则 逆时针考虑 三个点的 面积 倆条边 逆时针...
全篇基于平面 多边形 先看http://www.cnblogs.com/TenosDoIt/p/4047211.html 本文主要目的是说明 多边形 顶点 的 顺时针 与 逆时针 方向 对 面积 的 便利性。 二维 向量 叉乘,得到的新的 向量 是长度为原来两 向量 的组成的平行四边形的 面积 ,方向为右手 则确定出来的方向。需要用三维中的行列式来 证二维 向量 如下:(可设j为(0,0,1),由a,b 出来的 向量 为(0...
一个可点击选择位置的以创建 多边形 的entities,并且对这个entities进行 面积 计算 。 提供Cesium的网址,以作参考:https://cesiumjs.org/ 具体如图: 下面是script部分的代码,细节有注释,html部分的自己发挥,viewer本文是在全局引入,根据自己情况设置 <script> export default { (1) 向量 向量 积 两个 向量 a和b的叉积( 向量 积)可以被定义为: 在这里θ表示两 向量 之间的角夹角(0° ≤ θ ≤ 180°),它位于这两个矢量 所定义的平面上。 向量 积的模(长度)可以解释成以a和b为邻边的平行四边形的 面积 三角形ABC的 面积 ,根据 向量 积的意义,得到:
题目链接:点击打开链接 题目大意:按逆时针给出n个坐标, 该n边形的 面积 。 题目思路:利用 向量 叉积 n边形 面积 每个三角形 面积 为(x1*y2-y1*x2)/2 本人第一次不是用 向量 来做,把直接n边形分成n-2个三角形,最终总是过不了,一查资料才知道, 多边形 分凹凸 多边形 ,凹 多边形 使用直接分割 ,不太好做。 下面先给大家分享错误代码:(只适用与凸 多边形 ) 把n边形分割成n-2个三
博主您好,您在第20行的理解似乎与我不同,首先题目的思路是大-小的思想,因此我认为第20行代码的作用是 计算 出整个大的平行四边形,然后再通过叉乘得到负的 面积 值,和sum内储存着的大的 面积 值相加,这样就能做到大-小了,最后再把sum/2,得到三角形的 面积 。 老规矩,先上题目链接???? 很简单,就一个,用 向量 叉积(叉乘) 计算 多边形 面积 ,有两种方 ,比较基础的:选取 多边形 的一个顶点,然后用其余的点和这个顶点相连,形成一个 向量 ,再将每个 向量 顺时针或逆时针相乘,这样就能得到整个 多边形 面积 。 另一种是基于
多边形 面积 : 先将点按照角度进行排序,然后在平面内任选一点O,依次连接 多边形 两点进行叉积并 和,最后取绝对值(凹 多边形 和凸 多边形 均适用,因为叉积有正负之分,相加的时候可以把多算的 面积 抵消) 问题描述: 在平面上给定一些点, 出能围住
点积的结果是一个数值; 叉积:a×b=(x1*y2 - x2*y1)=|a||b|·sinθ 叉积的结果也是一个 向量 ,是垂直于 向量 a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,上面结果是它的模。三角形的 面积 向量 a和 向量 b的叉积的绝对值表示 以 向量 a和 向量 b 为两边形成的平行四边形的 面积 .即:S=∣a×b