Неа. Я бы использовал формулу в сообщении, которое вы упомянули.
редактирует:
Чтобы уточнить это, метод, представленный в сообщении, которое вы упомянули (названный «Подход с замкнутым многоугольником» в ответе Рида Копси), в конечном итоге разбивает список точек на треугольники и вычисляет их площади, используя перекрестные произведения. Он избегает триангуляции, используя преимущества как положительных, так и отрицательных областей, в соответствии с упорядочением (намоткой) точек, которые описывают многоугольник. Поскольку он использует преимущества как положительных, так и отрицательных областей, этот подход не требует каких-либо вычислений для линий, составляющих каждый треугольник в четырехугольнике, и не имеет значения, является ли четырехугольник выпуклым или нет.
Тем не менее, концептуально легче понять разбиение четырехугольника на два непересекающихся треугольника и независимый расчет площади каждого треугольника. Такой подход всегда даст правильный результат. Сложность для этого подхода заключается в решении, какая пара противоположных вершин должна указывать разрыв между двумя треугольниками. Если у вас невыпуклый четырехугольник и вы выбрали неправильную триангуляцию, то вы получите перекрывающиеся треугольники, которые (если не учтены) искажают результат области. Если при расчете площадей этих треугольников будет предпринята некоторая осторожность, вы обнаружите, что (в случае, в частности, четырехугольника) один треугольник всегда будет содержаться в другом. С некоторой сообразительностью вы можете заставить область содержащегося треугольника иметь противоположный знак области содержащего треугольника, что затем снова даст правильный результат.
По сути, эти два алгоритма одинаковы. Там нет разницы в производительности; Предположим, что четверка определяется как x0, y0, x1, y1, x2, y2, x3 и y3. Тогда подход замкнутого многоугольника имеет следующие операции:
area = 0.5 * abs( x0 * y1 - x1 * y0 + x1 * y2 - x2 * y1 +
x2 * y3 - x3 * y2 + x3 * y0 - x0 * y3 )
Что может быть упрощено как:
area = 0.5 * abs( x0 * (y1 - y3) + x1 * (y2 - y0) + x2 * (y3 + y1) +
x3 * (y0 - y2) )
Который работает (подсчитывает * и +) всего 12 операций. Другой подход, нахождение каждого отдельного треугольника и получение перекрестного произведения, работает следующим образом:
x2_line = x2 - x0
y2_line = y2 - y0
area = 0.5 * abs( (x1 - x0) * y2_line + (y1 - y0) * x2_line +
x2_line * (y3 - y0) + y2_line * (x3 - x0) )
Что может быть снова упрощено до:
x2_line = x2 - x0
y2_line = y2 - y0
area = 0.5 * abs( y2_line * (x1 - x0 + x3 - x0) + x2_line * (y1 - y0 + y3 - y0) )
Который также работает до 12 операций. Точно такое же количество операций.
Итак, самое большое отличие состоит в том, что триангуляцию, за которой следует расчет площади между продуктами, легче понять, поскольку она очень проста, в то время как подход с замкнутым многоугольником на самом деле является тем же алгоритмом, но оптимизирован и поэтому представлен в по-другому.
В заключение, да, формула в сообщении, которое вы упоминаете, является самой эффективной из всех, которые вы получили, и в то же время является самым простым алгоритмом, если представить его по-другому.