2017-02-20 19 views
0

У меня есть n точек в плоскости и целевой области P. Я пытаюсь найти четыре точки, которые имеют площадь, которая представляет собой углы четырехстороннего с самым близким значением области до P. Ниже приведен пример с п = 5 и P = 30:Площадь четырехугольника

  • 0, 0
  • 10, 0
  • 0, 10
  • 10, 10
  • 7, 3

Ответ должен быть 30,0 (самый близкий к P, в этом случай равен).

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

+0

Формула Херона работает над треугольниками, а ее естественное расширение на четырехугольник, называемое формулой Брахмагупта, применимо только к циклическим четырехугольникам, а не к общим четырехугольникам. – Charles

+0

Вы можете использовать формулу Бретшнайдера. Вам нужно будет использовать некоторые триггеры. – Charles

ответ

0

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

Но вы можете использовать ускорение: если у вас есть три точки, найдите область связанного треугольника, и если она больше, чем abs (целевая область - лучшая область до сих пор), вам не нужно попробовать какие-либо значения для четвертой точки.

Как мы уже упоминали в комментариях, вам нужны Bretschneider's formula для четырехсторонних областей, Херон - для треугольников.

+0

Ну, я знаю, что Херон для треугольника xd, я думал, что он рассчитал свою площадь как два треугольника. Но во всяком случае, я сделал брутфорс, с 4 для петель. Он отлично работал с тестируемыми ящиками, поэтому я надеюсь, что это тоже пройдет. Спасибо :) – user3751721

+0

@ user3751721 Да, вы можете это сделать. Очевидно ли, что они не пересекаются? – Charles

1

Вы можете

  1. взять блок/шаблон многоугольник с желаемым числом вершин и формы.
  2. добавить мультипликативный масштабный коэффициент t к нему, так что ее координаты выглядят как

    0, 0 
    10t, 0 
    0, 10t 
    10t, 10t 
    7t, 3t 
    
  3. Используйте shoelace formula, чтобы выяснить область, скажем f(t).

  4. Решить уравнение многочлена f(t) = 30.0 для масштабного коэффициента t и связанных с ним координат вашего многоугольника.

Это должно дать вам многоугольник области, которую вы хотели (30.0).

Кстати, я предполагаю, что вы знаете форму многоугольника, иначе будет (бесконечно) множество решений, которые могут соответствовать вашей целевой области.

Смежные вопросы