2014-02-12 4 views
0

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

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

У кого-нибудь есть подсказки?

+1

Вы ищете конкретное подразделение этого района или ЛЮБОЕ подразделение области, которая соответствует вашим критериям областей детали? Является ли контур ввода выпуклым? Должна ли быть подключена каждая результирующая часть? –

+0

любой вид хороший. да, вход выпуклый, и да, результирующая часть должна быть подключена – nkint

ответ

2

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

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

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

Триангуляция таким образом создаст раздел, который будет близок к тому, что вам нужно. Предположим, что входной многоугольник задан списком вершин poly = {v1, v2, v3, ..., vn}, где verts уникальны и три не являются колинейными (выпуклые поли).

Обратите внимание, что при заданном треугольнике этого поля, образованного словами (v2, v3, v4), мы можем вычислить его площадь A1. Теперь, если мы вырасти треугольник в poly, добавив один дополнительный vert к следующему, например v5, чтобы сформировать (v2, v3, v4, v5) площадь увеличена до A2 (сумма двух треугольников (v2, v3, v4) и (v2, v4, v5). Из-за линейности, если вы хотели вырастить оригинальный треугольник, чтобы сказать A2 ', где A1 < A2' < A2, вы можете интерполировать на сегменте линии (v4, v5), чтобы найти v4 ', который будет дайте вам нужную область A2 ', которая вам нужна.

Поскольку вы можете вычислить общую площадь исходного ввода poly, и вы знаете целевую область каждого подразделения, вы можете вырезать входной поли на части желаемой области, пока вы не Если вы хотите получить более приятный раздел, вы можете начать с центра многоугольника, т. е. сначала (семенной треугольник) будет (в центре, v1, v2). Затем сжимайте/увеличивайте его до нужной области, переходите к следующий треугольник, повтор.

Надеюсь, что имеет смысл: D

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