Jump to content

Shoelace formula for polygonal area: Difference between revisions

→‎{{header|Python}}: Added a variant in terms of reduce and cycle
(→‎=={{header|PowerBASIC}}==: added PowerBASIC code)
(→‎{{header|Python}}: Added a variant in terms of reduce and cycle)
Line 910:
30.0
>>> </lang>
 
Or, defined in terms of '''reduce''' and '''cycle''':
{{Trans|Haskell}}
{{Works with|Python|3}}
<lang python>'''Shoelace formula for polygonal area'''
 
from itertools import (cycle, islice)
from functools import (reduce)
 
 
# shoelaceArea :: [(Float, Float)] -> Float
def shoelaceArea(xys):
'''Area of polygon with vertices
at (x, y) points in xys.'''
def go(a, tpl):
(x, y), (dx, dy) = tpl
l, r = a
return (l + x * dy, r + dx * y)
(nl, nr) = reduce(
go,
zip(xys, tail(cycle(xys))),
(0, 0)
)
return abs(nl - nr) / 2
 
 
# TEST -------------------------------------------------
# main :: IO()
def main():
'''Test'''
 
print(
shoelaceArea(
[(3, 4), (5, 11), (12, 8), (9, 5), (5, 6)]
)
)
 
# GENERIC -------------------------------------------------
 
 
# tail :: [a] -> [a]
# tail :: Gen [a] -> [a]
def tail(xs):
'''The elements following the head of a
(non-empty) list or generator stream.'''
if isinstance(xs, list):
return xs[1:]
else:
list(islice(xs, 1)) # First item dropped.
return xs
 
 
if __name__ == '__main__':
main()</lang>
{{Out}}
<pre>30.0</pre>
 
=={{header|Racket}}==
9,659

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.