Доброго времени суток, интересует такой вопрос, как можно представить структуру полигона? Есть «классический» вариант с массивом точек, но с такой структурой будут получаться разве что ломано-резанные полигоны. А как быть, если требуются скажем «круглешки-завитушки», скажем полигон в форме клеверного листа?
Т.е вот классический вид:
class Polygon {
public:
Polygon();
void AddVertex();
void DeleteVertex()
. . .
private:
vector<Point> mVertex;
};
Все точки хранятся в векторе mVertex. тут все просто, в том числе и определение попадания точки в полигон.
Сейчас думаю сделать следующим образом, хранить в массиве не точки а сегменты. Сегмент, это отдельный класс, который представляет из себя, либо прямую, либо кривую(Безье). Как считаете, это нормальная структура для хранения, есть ли подводные камни? Т.е получается что-то типа такого:
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, они в этой тебе должны хорошо разбираться.