Я думаю, что их техника сводится к использованию определителя для определения площади многоугольника http://mathworld.wolfram.com/PolygonArea.html
Но используя технику Futility Closet, я бы сначала закрыл полигон, добавив первую точку к концу.
y =: 2 7 9 5 6,.5 7 1 0 4
close=: (, {.)
close
- это крюк, который берет первую пару и добавляет ее в конец
Затем возьмите детерминанты по две точки за раз, что, по сути, они и делают со своими столбцами и вращениями
dets=: 2 (-/ . *)\ close
dets
принимает определитель каждой пары точек - результат отрицательный, если точки расположены по часовой стрелке
Затем возьмите эти значения и обработайте ответ.
clean=: |@:-:@:(+/)
clean
суммирует детерминанты, делит на 2 и возвращает абсолютное значение результата.
clean @: dets y
20
Чтобы увидеть результат в полной молчаливой форме, мы можем опираться на f.
наречие (Fix), чтобы сгладить наши определения.
clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))
Это просто другой взгляд на то, что они делают, но он позволяет J использовать соединение .
(Dot Product) и наречие \
(Infix) для обработки всех этих вращений с определителями.
Надеюсь, это поможет.