LINUX.ORG.RU

Логическое представление замкнутой несамопересекающейся полилинии, разбитой на участки


0

1

Для моей программы нужно создать класс, представляющий собой замкнутую полилинию. Причём эта полилиния разбита на участки, имеющие разные цвета. Как-то так: http://rghost.ru/3353697/image.png

Нужно уметь давать какой-то цвет некоторому участку этой полилинии (при этом оно перераспределяется при необходимости): http://rghost.ru/3353832/image.png

Но совсем запутался в логике всей этой фигни.

Полилинию хранить как упорядоченный набор точек (QList<QPointF>)? Как набор линий (QList<QLineF>)? Как полигон (QPolygonF)?

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

Если мы выделяем участок большой полилинии от точки до точки, то как определить направление? Ведь линия замкнутая и идти можно в 2 стороны.

Пугает то, что очень много всяких вариантов в голову лезет, несколько путей решения, но все на поверку оказываются сложными в реализации.

Возможно, я заработался, может вы что-то придумаете?

Эта фигура будет класться в QGraphicsScene, но вопрос напрямую Qt не касается.

upd: ещё нужно уметь получать для произвольной точки, лежащей на этой полилинии, цвет.

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 2)

Можно хранить кольцевой (или некольцевой) список точек. Рядом хранить список начал отрезков и их цвет. Считать обход например всегда по часовой стрелке

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Звучит более менее хорошо, почему-то об обходе по часовой стрелке я не думал. А стоило бы.

Но. Чтобы рисовать это дело, я буду рисовать все участки. То есть из этой фигни нужно будет получать список участков (незамкнутых полилиний). Если бы участки разграничивались только узлами «большой» полилинии, то особо проблем бы не было, но они не обязательно привязаны к этим узлам (см. рисунок), так что если мы храним точку начала отрезка, то надо как-то заботиться о том, что найти, между какими узлами она лежит. Звучит немного пугающе.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> Имеется ввиду список индексов точек первого списка

Вот, поэтому и не годится. Участки не обязательно точками первого списка разграничены, это на картинке видно.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Но вариант посложнее - это хранить разграничители в виде Разделитель 3=(начало=(точка 5), расстояние 0.4 на отрезке от 5 до 6)

vertexua ★★★★★
()
Ответ на: комментарий от Obey-Kun

Ну типо есть настоящие точки, есть фиктивные. Но это неудачно, так как нет естественного контроля за нахождением фиктивных точек на отрезке. Решение далее

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

> Разделитель 3=(начало=(точка 5), расстояние 0.4 на отрезке от 5 до 6)

Я не понимаю эту форму записи.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Список пар точка-цвет. Если цвет не изменился, то точку не рисовать, то есть это продолжение ломаной одного цвета. Либо не рисовать точку и продолжать использовать тот же цвет, если цвет новой точки пустой (QColor::isValid() == false).
А так идея та же - обход в одном направлении со сменой цвета.

rival ★★
()

Хранить как список точек, т.е. и точки полилинии, и точки разбиения. Каждая точка может хранить цвет, который начинается от нее и до следующей точки. Точка которая меняет цвет - становится точкой разбиения. Точки должны быть всегда в одном направлении в списке.

smh ★★★
()
Ответ на: комментарий от rival

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

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Есть список точек. Есть список разделителей.

В списке разделителей указывают:

1. Номер точки, которая перед этим разделителем (или совпадает)

2. Расстояние (от 0 = совпадает, до 1 - следующая точка, пример - 0.4)

Короче «до заветного столба ехать от Бобруйска 100 км в сторону Киева»

vertexua ★★★★★
()
Ответ на: комментарий от smh

Да, видимо всё к тому и идёт. Но я забыл об одном нюансе. Нужно уметь получать для произвольной точки, лежащей на этой полилинии, цвет. Придётся каждый раз делать прогонку... или как?

Obey-Kun ★★★★★
() автор топика

всем большое спасибо за идеи, мне надо в оффлайн на несколько часов.

Obey-Kun ★★★★★
() автор топика

В порядке бреда

А как хранятся в памяти графы с направлениями и разными весами? По сути - это замкнутый граф, имеющий направление(сам подумай какое в каком случае) и вес отдельных участков(цвет). К сожалению реализацию этого я не знаю, но логически можно предположить что это может подойти. Еще одна реализация - двухмерные(или полилиния имеет в твоём случае три измерения?) вектора с прицепленным весом. Вектора хранятся как структура из 3(4) чисел, а вся линия - как список векторов.

TheKnight ★★★
()
Ответ на: комментарий от Obey-Kun

> Нужно уметь получать для произвольной точки, лежащей на этой полилинии, цвет.

В любом случае тебе придется ведь определить на каком сегменте эта произвольная точка лежит, узнав сегмент, просто можешь посмотреть цвет точки, которая является началом этого сегмента. Если я правильно понял :-)

smh ★★★
()
Ответ на: комментарий от smh

верно... а определять сегменты можно будет средствами Qt, если я сделаю ф-цию, возвращающую сегменты в виде незамкнутых полилиний!

всем спасибо, структура прояснилась

предстоит сделать логические операции сложения, вычитания и объединения таких полилиний, но всё это можно будет на стыке со стандартными методами Qt.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Да, так и сделал в результате. Только расстояния храню в единицах чертежа. Но сути это не меняет. Спасибо!

Obey-Kun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.