У меня есть объект комнаты, определенный набором циклических отрезков, для которого мне нужно вычислить площадь. Классы могут быть описаны следующим образом (в псевдокоде):
class Point {
float x;
float y;
...
float distanceFrom(Point p);
}
class Segment {
Point start;
Point end;
...
float length();
}
class Room {
List<Segment> walls;
...
float area();
}
Стены комнаты никогда не могут пересекаться нигде, кроме как в конечных точках сегментов, и любые созданные «подциклы» также будут разделены на новую комнату. Решение не обязательно должно быть идеально точным (допустимая погрешность 10%) и также не очень часто (<1 / с).
Room
содержать списокPoint
s, а затем получить сегменты, соединив каждую точку вместе, а затем вернув ее обратно. В противном случае, с вашей текущей настройкой, это очень восточно, чтобы получить неправильные значения (например, незакрытая комната, комната со стеной посередине и т. Д.). Это был бы лучший вариант.Room
s всегда было завершено, и это может быть не так, если у меня есть игрок, который собираетRoom
s, используяSegment
s. Кроме того, функцию закрытой комнаты легко определить (просто переберитеSegment
s и убедитесь, что они создают комнату).Ответы:
Вы можете использовать формулу шнурка Гаусса :
Вам нужно взять координату x каждой точки, умножить их на координату y следующей точки, затем вычесть координату y текущей точки, умноженную на координату x следующей точки, из результата и добавить их к общей площади. После того, как вы сделали это для каждой точки, разделите пополам общую площадь, чтобы получить фактическую площадь многоугольника. Если текущая точка является последней, то следующая является первой.
источник
A
отменяется. В зависимости от цели,A = |A|
может понадобиться. С помощью отрицательного кода области можно найти область на неправильном пончике, используя внутренний и внешний список точек (один в обратном порядке).Мы также могли бы использовать метод Монте-Карло.
Нарисуйте прямоугольник вокруг произвольной формы. Возьмите равномерно распределенный источник PRNG, например. Mersenne Twister, а затем ограничить выход по X, Y длины прямоугольника, используя функцию по модулю. Считайте нет. случайных точек, которые приземляются внутри вашей фигуры. Разделите на общее количество полученных баллов. Умножьте это отношение на площадь прямоугольника. С каждой итерацией вы будете сходиться к истинной области. Алгоритм смехотворно распараллеливается и может использоваться для вычисления произвольных размерных «объемов» фигуры, при условии, что вы можете определить, находится ли координата R ^ N в пределах границы R ^ N фигуры.,
источник
Другой подход: не надо.
Вместо:
В основном, отрежьте треугольник. Площадь треугольника проста, и при этом мы сократили количество сегментов остатка на единицу. Повторяйте до тех пор, пока не останется треугольник.
источник