这个多边形的面积是多少?


19

计算多边形的面积。

受此鞋带算法视频启发

任务

您的工作是创建一个程序或函数来计算多边形的面积。程序或函数是根据meta中的默认定义定义的。

输入项

您将收到多边形每个顶点的X和Y坐标。您可以将输入作为元组列表([[x1, y1], [x2, y2], etc]),矩阵或平面列表([x1, y1, x2, y2, etc])。也允许分别包含xy坐标的两个列表。顶点按逆时针编号,并且第一个顶点与提供的最后一个顶点相同,因此关闭了多边形。

如果需要,您可以输入没有最后一个顶点的输入(因此只接收一次每个坐标)。

您可以假定多边形的边缘不相交。您还可以假定所有顶点都具有整数坐标。

输出量

多边形的面积。允许所有标准输出方法。如果您的语言不允许进行浮点除法,并且解决方案不是整数,则可以返回分数。分数不必一定要简化,因此2/4将允许返回。

获奖标准

最短的代码胜出!

测试用例

[[4,4],[0,1],[-2,5],[-6,0],[-1,-4],[5,-2],[4,4]]
55

在此处输入图片说明

[[1,1],[0,1],[1,0],[1,1]]
0.5
1/2

在此处输入图片说明


输入是否被[x1, x2, x3], [y1, y2, y3]允许?
程序员

@ programmer5000和Martin Ender,是的,我将在:)中进行编辑
JAD

我同意,投票重新开放。
程序员

1
@flawr我做了这个骗子。这并不是其重复目标的真正重复,要递归地应用与此处相同的方法,将需要找到相交点的顶点,并且需要将生成的子集按逆时针方向排序-看起来要复杂得多。
乔纳森·艾伦,

Answers:


13

果冻 8  6 字节

感谢Emigna -1字节(冗余ÆḊ具有2的左深度)
感谢Emigna -1字节,再次感谢(一半H,,是浮点数,无需÷2

ṡ2ÆḊSH

单子链接,按照示例(带有一个重复)以逆时针方式获取一对坐标对列表,然后返回该区域。

在线尝试!

怎么样?

就像视频中所描述的那样,应用鞋带算法(前几天我也恰好也观看了!)

ṡ2ÆḊSH - Link: list of [x,y] coordinate pairs anticlockwise & wrapped, p
ṡ2     - all overlapping slices of length 2
  ÆḊ   - determinant (vectorises)
    S  - sum
     H - halve

第二个测试用例为我返回`-0.5`:o
JAD

哦,我得检查一下...
Jonathan Allan

这是因为作为[x,y]坐标,它们是顺时针而非逆时针给出的。输入[[1,1],[0,1],[1,0],[1,1]]会返回0.5
乔纳森·艾伦,

1
糟糕,我将编辑:D
JAD

1
此外,H代替÷2
Emigna



16

JavaScript(ES6),69 67 47字节

感谢@Rick指出,如果保证以逆时针顺序对顶点进行排序,则我们不需要绝对值,并且建议采用平面列表作为输入,从而节省了20个字节!

将输入作为平面的顶点列表,包括最后一个顶点。

f=([x,y,...a])=>1/a[0]?x*a[1]/2-y*a[0]/2+f(a):0

在线尝试!

怎么样?

n

area=|(x0y1y0x1)+(x1y2y1x2)++(xn1y0yn1x0)2|


非常令人印象深刻!您能解释一下它是如何工作的吗?
Rugnir

第二个测试用例中的顶点被错误地排序。绝对不需要。
瑞克(Rick)

您还可以保存7字节切换到平面列表:a=>(g=([x,y,...a])=>1-a?0:x*a[1]-y*a[0]+g(a))(a)/2
Rick

@Rick是正确的-不需要Abs。没有它,该公式将计算有符号区域,该区域为正,因为顶点是按逆时针顺序给出的。
昂斯(Angs)

@Rick谢谢!更新...大约10个月后:/
Arnauld

7

R,54 52字节

pryr::f({for(i in 2:nrow(x))F=F+det(x[i-1:0,]);F/2})

对函数求值:

function (x) 
{
    for (i in 2:nrow(x)) F = F + det(x[i - 1:0, ])
    F/2
}

利用预定义的F = FALSE = 0。在链接的视频中实现鞋带算法:)

-2个字节,感谢Giuseppe


-1字节i+-1:0作为行索引
Giuseppe

@朱塞佩尼斯。我也将删除+;)
JAD

6

Python 3中72 71个字节

from numpy import*
g=lambda x,y:(dot(x[:-1],y[1:])-dot(x[1:],y[:-1]))/2

接受两个列表,如评论所允许

x = [x0,x1,x2, ...]
y = [y0,y1,y2, ...] 

在线尝试!

这基本上只是鞋带公式的实现。我可以为您实际实现的高尔夫加分吗?:D

-1,后面不需要空格x,y:



现在的问题正文中还提到了两个清单:)
JAD

@JarkoDubbeldam嗯,我刚刚看到,它必须输出该区域。该解决方案当前仅返回该区域。是否也允许这样做,还是应该打印出来?
P. Siehr

返回值的函数计为输出:)
JAD

我认为使用python甚至不必命名函数,因此以开头lambda x,y:就可以了。
JAD

@JarkoDubbeldam每种语言都有规定吗?
P. Siehr '17


4

JS(ES6),98 95 94 93 88 86 82 81 77 73字节

(X,Y)=>{for(i in X){a+=(X[i]+X[i-1])*(Y[i]-Y[i-1]);if(!+i)a=0}return a/2}

接受类似的输入[x1, x2, x3], [y1, y2, y3],并跳过重复的坐标对。

-3个字节,感谢@JarkoDubbeldam

-4个字节,感谢@JarkoDubbeldam

-1字节感谢@ZacharyT

-4个字节,感谢@ZacharyT

-4个字节,感谢@Rick


3

J,12个字节

假设输入是2个元素列表的列表(即一个表)

-:+/-/ .*2[\
  • 2[\ -将其分解为鞋带Xs,即4个榆木的重叠正方形
  • -/ .* -每个的决定因素
  • +/ -总结一下
  • -: -除以2

如果我们将输入作为单个列表获取,则需要首先转换为表,从而得到20个字节:

-:+/-/ .*2[\ _2&(,\)

1
“假设输入是2个元素列表的列表(即一个表)”,这是允许的:)
JAD 2015年

3

MS-SQL,66个字节

SELECT geometry::STPolyFromText('POLYGON('+p+')',0).STArea()FROM g

MS SQL 2008和更高版本支持Open Geospatial Consortium(OGC)标准的空间数据/功能,在这里我将利用它。

根据我们的输入标准,输入数据存储在现有表g的字段p中。

输入是一个文本字段,具有以下格式的有序对: (4 4,0 1,-2 5,-6 0,-1 -4,5 -2,4 4)

现在只是为了好玩,如果您允许我的输入表保存Open Geospatial Consortium标准的几何对象(而不仅仅是文本数据),那么它几乎变得微不足道了:

--Create and populate input table, not counted in byte total
CREATE TABLE g (p geometry)
INSERT g VALUES (geometry::STPolyFromText('POLYGON((5 5, 10 5, 10 10, 5 5))', 0))

--23 bytes!
SELECT p.STArea()FROM g


0

Perl -pa 5,62个字节

map$\+=$F[$i]*($a[($i+1)%@a]-$a[$i++-1]),@a=eval<>}{$\=abs$\/2

在线尝试!

将输入作为第一行的X坐标列表,然后输入第二行的Y坐标列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.