计算多边形面积的方法为将多边形分解成多个三角形,然后把这些三角形的面积相加。三角形面积为两边向量叉积除以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