Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Какой структурой представить полигон? / 14 сообщений из 14, страница 1 из 1
28.07.2013, 11:07
    #38346549
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
Доброго времени суток, интересует такой вопрос, как можно представить структуру полигона? Есть "классический" вариант с массивом точек, но с такой структурой будут получаться разве что ломано-резанные полигоны. А как быть, если требуются скажем "круглешки-завитушки", скажем полигон в форме клеверного листа?

Т.е вот классический вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Polygon {
public:
    Polygon();

    void AddVertex();
    void DeleteVertex()
    . . .
private:
    vector<Point> mVertex;
};


Все точки хранятся в векторе mVertex. тут все просто, в том числе и определение попадания точки в полигон.

Сейчас думаю сделать следующим образом, хранить в массиве не точки а сегменты. Сегмент, это отдельный класс, который представляет из себя, либо прямую, либо кривую(Безье). Как считаете, это нормальная структура для хранения, или есть подводные камни? Т.е получается что-то типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
class Segment {
public:
    Segment();
    . . .
private:
    Point P1;
    Point P2;
    Point P3;
    Point P4;
    // точки задают сегмент, используются P1и P2  если сегмент-линия, и все 4 точки если это кривая(кубическая кривая Безье) 
    // соответсвенно полигон соединяется из таких вот сегментов, точки привязки Р1 и Р2 если это линия и Р1 и Р4 если это кривая
};

class Polygon {
public:
    Polygon();

    void AddSegment();
    void DeleteSegment()
    bool Intersect(Point p); // определение попадания точки в полигон, одна из нужнейших функций, как её реализовать?
    . . .
private:
    vector<Segment> mSegments;
    vector<Polygon> mHoles;  // "дыры" в полигоне
};



С такой структуром, более-менее можно построить практически любой полигон, но тут остаётся главный для меня вопрос, как определять попадание точки в такой полигон? Кто что скажет? Я так думаю, такой вопрос нужно задавать тем кто программирует всякие GIS, они в этой тебе должны хорошо разбираться.
...
Рейтинг: 0 / 0
28.07.2013, 11:43
    #38346560
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
I dont knowскажем полигон в форме клеверного листа?
это не полигон, это путь (Path)
...
Рейтинг: 0 / 0
29.07.2013, 00:32
    #38346904
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
I dont knowДоброго времени суток, интересует такой вопрос, как можно представить структуру полигона? Есть "классический" вариант с массивом точек, но с такой структурой будут получаться разве что ломано-резанные полигоны. А как быть, если требуются скажем "круглешки-завитушки", скажем полигон в форме клеверного листа?
Возьми какую-нибудь навороченную графическую библиотеку и посмотри как там полигоны задаются.
Например cairo или Qt::Graphics.
...
Рейтинг: 0 / 0
29.07.2013, 00:33
    #38346906
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
В крайнем случае можно взять PGF/TiKZ и скопировать тамошний синтаксис (это если нужно текстом пути задавать).
...
Рейтинг: 0 / 0
29.07.2013, 01:56
    #38346928
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
I dont knowС такой структуром, более-менее можно построить практически любой полигон, но тут остаётся главный для меня вопрос, как определять попадание точки в такой полигон? Кто что скажет? Я так думаю, такой вопрос нужно задавать тем кто программирует всякие GIS, они в этой тебе должны хорошо разбираться.
Если полигон состоит из ломаной линии и выпуклый - то просто. Все его рёбра имеют
направление (возьмем по часовой стрелке). И решаем уравнение о нахождении точки
относительно прямой для каждого ребра. Там резалт - положительный - слева, отрицательный
- справ, если ноль - то точка попала точно на реброю (или наоборот знак). Это довольно быстрый алг. и у него
есть целочисленные оптимизации.

Если полигон - вогнутый тогда - сложнее.

Метод1.

Бъём его на объединение выпуклых полигонов (любым методом) и решаем задачу для каждого суб-полигона.

Метод2.

Бъём произвольный полигон на множество трапеций основания которых параллельны осям X или Y
системы координат. Проверка для трапеции - тривиальна. Это два линейных уравнения и две проверки.

Для полигона состоящего из сложных кривых можно придумать свои формулы аналогичные проверки
ориентации прямой и точки. А можно апроксимировать кривую сколь угодно близко разбиением ее
на тысячи линейных рёбер. В 3Д-средствах моделирования типа АвтоКад или 3Д-макс так и делают
отказываясь решать аналитику и переходя в плоскость решения тысячи атомарных но линейных
и хорошо парарлелящихся задачек.

Вообще эта задача имеет мат. формулировку. Гугли по ключевым, словам Интегральная Формула Коши.
Она решает любые кривые даже сложнее эллиптических. Другое дело что в реальной жизни мало таких
криволинейных полигонов да и задавать их будет еще сложнее.
...
Рейтинг: 0 / 0
29.07.2013, 20:14
    #38347881
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
mayton,

Чтобы упросить себе задачу, решил полигон(путь) строить из сегменов, где сегмент, двух видов: линия и arc(арка). С помощью арки можно задавать ломаные кривые ребра полигона. Теперь осталось узнать, как определить, попадает ли точка на этот arc? с линие всё просто, там просто текущая точка подставляется в уравнение прямой, если обе части уравнения равны, то точка на прямой, а как быть с аркой?
...
Рейтинг: 0 / 0
29.07.2013, 20:17
    #38347884
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
I dont knowmayton,

Чтобы упросить себе задачу, решил полигон(путь) строить из сегменов, где сегмент, двух видов: линия и arc(арка). С помощью арки можно задавать ломаные кривые ребра полигона. Теперь осталось узнать, как определить, попадает ли точка на этот arc? с линие всё просто, там просто текущая точка подставляется в уравнение прямой, если обе части уравнения равны, то точка на прямой, а как быть с аркой?Если дугу представлять как уравнение круга (с парой углов для обозначения концов арки), то точно так же как и с линией.
...
Рейтинг: 0 / 0
29.07.2013, 22:40
    #38347972
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
I dont knowmayton,

Чтобы упросить себе задачу, решил полигон(путь) строить из сегменов, где сегмент, двух видов: линия и arc(арка). С помощью арки можно задавать ломаные кривые ребра полигона. Теперь осталось узнать, как определить, попадает ли точка на этот arc? с линие всё просто, там просто текущая точка подставляется в уравнение прямой, если обе части уравнения равны, то точка на прямой, а как быть с аркой?
Тебе обязательно потребуется делать "сопряжение" дуг и отрезков. Без этого
трудно задать гладкую кривую. Развивая эту идею ты придёшь Кривым Бежье
как к более удачному способу описания кривых линий. Кстати они прекрасно
апроксимируют арки поэтому проблема арок сама отпадёт.

http://ru.wikipedia.org/wiki/Кривая_Безье
...
Рейтинг: 0 / 0
30.07.2013, 07:21
    #38348081
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
mayton,

Я изначально хотел их использовать, но почему-то мне думается, что их будет сложнее использовать, в плане определения попадания точки на 1. саму кривую и 2. часть полигона обрамлённую этой кривой(или в целом задача определения попадания точки в полигон, где сторона не линия или арка, а кривая Безье). Плюс к этому, думаю будут сложности с определением пересечения полигонов, т.е найти полигон, образованный в результате пересечения двух других полигонов(в данном случае путей, т.к стороны такой фигуры будут состоять из линий и кривых). Или как искать пересечение линии и такого полигона ?
...
Рейтинг: 0 / 0
30.07.2013, 10:32
    #38348210
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
Ну... если посмотреть на процесс начертания квадратичной кривой то можно заметить что
зелёный отрезок который вычерчивает саму кривую всегда находится по одну сторону
области ограниченной кривой.


Для кубических кривых - не знаю пока. Там сложнее.
...
Рейтинг: 0 / 0
30.07.2013, 10:33
    #38348211
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
...
Рейтинг: 0 / 0
30.07.2013, 11:13
    #38348267
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
Без сомнения, представление через прямые линии + кривые Безье, используется очень часто.
1. Postscript & bezier
2. CorelDraw & Bezier curve
то есть, по существу это входит в стандарт описания векторных форматов, и неплохо бы просто взять за основу некое подмножество этого стандарта, того же постскрипта - так можно фигуру отображать в готовом продукте, пока свой не сделан.
Ну и гугол на тему "пересечение точки и кривой безье" дает немало ссылок, так что наверное и это решаемо.
...
Рейтинг: 0 / 0
30.07.2013, 11:14
    #38348273
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
"пересечение отрезка и кривой безье", конечно.
...
Рейтинг: 0 / 0
30.07.2013, 12:16
    #38348418
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой структурой представить полигон?
S.G.,

Буду пробовать, спасибо )
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Какой структурой представить полигон? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]