首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用numpy计算二维闭合多边形的面积

使用numpy计算二维闭合多边形的面积
EN

Stack Overflow用户
提问于 2021-05-12 15:55:28
回答 3查看 92关注 0票数 1

我有一个二维numpy数组,我想计算一下下面的等式。有没有一种类似numpy (矢量化)的方法来实现这种评估,而不只是迭代这些值?

额外的问题,有没有一种方法(再次矢量化)将乘积的每个结果保存在一个新的一维numpy数组中?提前感谢

顺便说一句,这个公式是从这个网站找到的:https://www.seas.upenn.edu/~ese502/lab-content/extra_materials/Polygon%20Area%20and%20Centroid.pdf

EN

回答 3

Stack Overflow用户

发布于 2021-05-12 16:09:26

您可以按如下方式使用numpy.roll

代码语言:javascript
复制
import numpy as np

N = 5
a = np.random.rand(N, 2)
x, y = a[:,0], a[:,1]

area = 1/2 * np.sum(x*np.roll(y, 1) - y*np.roll(x, 1))
票数 1
EN

Stack Overflow用户

发布于 2021-05-12 16:06:13

下面是SQF语言的一个实现:

代码语言:javascript
复制
private _n0 = count(_polygon);
private _surface = 0;

for "_i0" from 0 to (_n0 - 1) do {
    private _p1 = _polygon select _i0;
    private _p2 = _polygon select ((_i0 + 1) % _n0);
    private _p1x = _p1 select 0;
    private _p1y = _p1 select 1;
    private _p2x = _p2 select 0;
    private _p2y = _p2 select 1;
    _surface = _surface + ((_p1x * _p2y) - (_p2x * _p1y)) / 2;

你只需要把它翻译成python即可。

票数 0
EN

Stack Overflow用户

发布于 2021-05-14 09:32:57

einsum可以方便地实现鞋带公式

代码语言:javascript
复制
A  # --- sample array representing a polygon ordered clockwise
array([[  0.00,   0.00],
       [  0.00,  10.00],
       [ 10.00,  10.00],
       [ 10.00,   0.00],
       [  0.00,   0.00]])

# --- can be implemented in a list comprehension of for loop

def _bit_area_(a):
    """Mini e_area, used by `areas` and `centroids`."""
    x0, y1 = (a.T)[:, 1:]
    x1, y0 = (a.T)[:, :-1]
    e0 = np.einsum('...i,...i->...i', x0, y0)
    e1 = np.einsum('...i,...i->...i', x1, y1)
    return np.sum((e0 - e1) * 0.5)
    

_bit_area_(A)
100.0  # --- result for a 10 x 10 unit square,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67499435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档