Какой хороший алгоритм для расчета площади четырехугольника? - PullRequest
3 голосов
/ 25 августа 2009

Я вижу, что уже есть хороший вопрос для общих полигонов здесь . Существуют ли более простые или более эффективные алгоритмы, характерные для четырехугольников?

Ответы [ 4 ]

12 голосов
/ 25 августа 2009

Для (выпуклого) четырехугольника часто быстрее просто разделить четырехугольник на два треугольника и вычислить площадь двух треугольников.

Если четырехугольник не гарантированно выпуклый, замкнутый полигональный подход по-прежнему является моим предпочтением, поскольку обычно он быстрее, чем проверки, чтобы выяснить, как правильно разделить квад.


Редактировать из комментариев:

Как указывает Уолт В., два подхода теоретически идентичны с точки зрения производительности. Второй вариант более гибкий, поскольку не требует выпуклых квадратов, но первый (расщепление треугольников) проще в реализации и понимании, поэтому потенциально более удобен в обслуживании.

7 голосов
/ 25 августа 2009

Неа. Я бы использовал формулу в сообщении, которое вы упомянули.

редактирует:

Чтобы уточнить это, метод, представленный в сообщении, которое вы упомянули (названный «Подход с замкнутым многоугольником» в ответе Рида Копси), в конечном итоге разбивает список точек на треугольники и вычисляет их площади, используя перекрестные произведения. Он избегает триангуляции, используя преимущества как положительных, так и отрицательных областей, в соответствии с упорядочением (намоткой) точек, которые описывают многоугольник. Поскольку он использует преимущества как положительных, так и отрицательных областей, этот подход не требует каких-либо вычислений для линий, составляющих каждый треугольник в четырехугольнике, и не имеет значения, является ли четырехугольник выпуклым или нет.

Тем не менее, концептуально легче понять разбиение четырехугольника на два непересекающихся треугольника и независимый расчет площади каждого треугольника. Такой подход всегда даст правильный результат. Сложность для этого подхода заключается в решении, какая пара противоположных вершин должна указывать разрыв между двумя треугольниками. Если у вас невыпуклый четырехугольник и вы выбрали неправильную триангуляцию, то вы получите перекрывающиеся треугольники, которые (если не учтены) искажают результат области. Если при расчете площадей этих треугольников будет предпринята некоторая осторожность, вы обнаружите, что (в случае, в частности, четырехугольника) один треугольник всегда будет содержаться в другом. С некоторой сообразительностью вы можете заставить область содержащегося треугольника иметь противоположный знак области содержащего треугольника, что затем снова даст правильный результат.

По сути, эти два алгоритма одинаковы. Там нет разницы в производительности; Предположим, что четверка определяется как 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 операций. Точно такое же количество операций.

Итак, самое большое отличие состоит в том, что триангуляцию, за которой следует расчет площади между продуктами, легче понять, поскольку она очень проста, в то время как подход с замкнутым многоугольником на самом деле является тем же алгоритмом, но оптимизирован и поэтому представлен в по-другому.

В заключение, да, формула в сообщении, которое вы упоминаете, является самой эффективной из всех, которые вы получили, и в то же время является самым простым алгоритмом, если представить его по-другому.

0 голосов
/ 25 августа 2009

Разбейте четырехугольник на два треугольника и вычислите площадь обоих.

Если у вас есть два треугольника, Формула Герона хорошо работает в компьютерной программе.

Для треугольника со сторонами a, b и c площадь равна

double area = Math.Sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)/16);

Этот метод работает с любым четырехугольником, будь то прямоугольник, квадрат, ромб или трапеция.

0 голосов
/ 25 августа 2009

На странице mathworld перечислены несколько формул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...