|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Здравствуйте! На холсте есть совокупность отрезков (серые линии). Нужно определить, если ли набор пересекающихся отрезков, которые образуют замкнутую фигуру (синие линии). Нужно разобраться, как написать такой алгоритм. С алгоритмом пересечения отрезков я разобрался. Дальше разобраться как искать эту фигуру из пересекающихся точек, потом замкнута ли она. Какие варианты замкнутости присутствуют на холсте. Подскажите, какой раздел из теории надо изучать, чтобы написать такой алгоритм. Реализую на C#. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 11:46 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Строим граф, где вершины - отрезки, а ребра - точки пересечения, и ищем в нем циклы. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 11:52 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Из простых: 1) найти все точки пересечения 2) Просматривать "в глубину" (на деле что-то вроде комивояжера): идти от первой точки по отрезку до следующей. Дальше, перейдя с точки на отрезок, который ее породил - пройтись по всем точкам этого отрезка, и так далее до тех пор, пока не вернешься в исходную точку. Вопрос лишь в другом. Если пересечений будет много, то сложнее будет найти самую крупную фигуру... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 11:52 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
ferzmikk, покажи как ты разобрался с пересечением отрезков. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:15 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Красишь все белые точки холста от любой белой точки его границы. Замкнутые области останутся белыми... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:29 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Ничего не сказано о возможном пересечении фигур из отрезков - нет такого или есть пересечения. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:44 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
В задаче еще не сказано о перекручненных фигурах (образуют восьмёрку). Как с ними быть? Считать из замкнутыми? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:01 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonВ задаче еще не сказано о перекручненных фигурах (образуют восьмёрку). Как с ними быть? Считать из замкнутыми? А это разве не две соседних фигуры, пусть и имеющих общую точку? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:21 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Может так. Это надо оговорить в условии. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:28 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonferzmikk, покажи как ты разобрался с пересечением отрезков.Общая логика такова: Отрезок это часть прямой. Уравнение прямой: A * x + b = y C двумя прямыми получаем систему уравнений: A1 * x + b1 = y A2 * x + b2 = y Находим A1, A2, b1 и b2. Потом получаем точки пересечения x и y. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:45 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Gennadiy UsovНичего не сказано о возможном пересечении фигур из отрезков - нет такого или есть пересечения.На данный момент в условии задачи пересечении фигур - нет. Но потом думаю возможно будет, когда задача будет усложняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:55 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonВ задаче еще не сказано о перекручненных фигурах (образуют восьмёрку). Как с ними быть? Считать из замкнутыми?Нет перекрученных фигур. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 13:56 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Определение последовательности отрезков (пути по отрезкам) похоже на работу навигатора по улицам - как лучше проехать, и где проехать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 14:00 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
ferzmikkmaytonferzmikk, покажи как ты разобрался с пересечением отрезков.Общая логика такова: Отрезок это часть прямой. Уравнение прямой: A * x + b = y C двумя прямыми получаем систему уравнений: A1 * x + b1 = y A2 * x + b2 = y Находим A1, A2, b1 и b2. Потом получаем точки пересечения x и y. А числа у тебя целые или вещественные? Я почему это спрашиваю. Инженерная графика - хитрая наука. И было-бы неплохо не выдавливать из тебя информацию по крошкам. А получить сразу твой сорц на сишарпе. И вместо доделать. Это будет в духе sql.ru. Ты согласен? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 14:06 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonА числа у тебя целые или вещественные?В начале задавал int, потом double. Я почему это спрашиваю. Инженерная графика - хитрая наука.Изучаю C# и геометрическую графику. Читаю Шилдта. Экспериментирую пока. До самой инженерной графики не доходил еще. Но чую с графикой не так все просто. И было-бы неплохоне выдавливать из тебя информацию по крошкам. А получить сразу твой сорц на сишарпе. И вместо доделать. Это будет в духе sql.ru. Ты согласен?Именно по пересечению отрезков? Пока написал для двух отрезков. Если находил, то закрашивал эту точку. Экспериментировал пока так. Часть кода для определения точки пересечении брал отсюда . Там в основном как функция, которая определяет пересекаются ли два отрезка или нет. А также дополнил код, что определяет точки пересечения, если пересекаются. Дополнил код для разных случаев: - Если два отрезка вертикальные, лежат на одном X, пересекаются - возвращает вертикальное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. - Если оба отрезка горизонтальные. - Если два отрезка горизонтальные, лежат на одном Y, пересекаются - возвращает вертикальное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. - Если оба отрезка диагональные, но параллельные, пересекаются - возвращает диагональное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. Под свои задачи добавил: - Sctruct, где присутствует вся информация об двух отрезках: не только точки пересечения, но и характер пересечении. - Вывод на Panel. Рисуются два отрезка и если есть точка пересечения, то закрашивает эту точку. - Для проверки расчетных точек пересечения использовал метод panel1_MouseMove. - Начало координат идет слева сверху, а надо с учетом слева снизу. Пока еще все сыро, экспериментирую. Возможно что то лишнее есть, а что то надо добавить. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 15:42 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Gennadiy UsovОпределение последовательности отрезков (пути по отрезкам) похоже на работу навигатора по улицам - как лучше проехать, и где проехать.Теория графов? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 15:44 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
ferzmikk Дополнил код для разных случаев: Какие случаи?ferzmikkC двумя прямыми получаем систему уравнений: A1 * x + b1 = y A2 * x + b2 = y Находим A1, A2, b1 и b2. Потом получаем точки пересечения x и y.Имея решение пересечения, необходимо сравнить это решение на попадание координат решения в диапазон по Х и в диапазон по Y обоих отрезков. И всё... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 15:57 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
ferzmikk, Для проверки на пересечение двух отрезков: A1 - A2, B1 - B2, достаточно чтобы точки A1 и A2 лежали по разную от отрезка b, а точки B1 и B2 по разную сторону отрезка a. По разную сторону, это значит определитель соотвествующий матрицы дает разные знаки. Наверно раздел который нужно смотреть построение выпуклых оболочек, возможно построение триангуляций из курса машинной графики. ЗЫ Это все что вспомнил из университетского курса 15 летней давности. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 22:18 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Шилдта не читай. Он не в теме. Читай Шикин и Боресков - Комьютерная графика. Читай Computer Graphics - Donald Hearn автор Код: sql 1.
Это школьное уравнение прямой описывает зависимости y=f(x) но не может описать прямую параллельную оси OY. Для этого нужно оперировать бесконечностями или переворачивать формулу. Когда будешь писать код - переворачивать формулу - означает реализовывать 2 разных алгоритма. Для геометрии на плоскости используются следующие формы задания прямой. 1. В векторном виде. (x-x1) / (x2 -x1) = (y-y1) / (y2-y1) 2. Каноническое Ax + By + C = 0 3. Полярные координаты. xcos(fi) + ysin(fi) - p = 0 (в полярных греческое "ро" есть расстояние от перпендикуляра прямой к центру координат и угол фи - соотв. угол вращения прямой вокруг системы). И есть способы перехода от одной формы к другой. Все три формы используются в зависимости от удобства или ситуации. В твоей задаче надо проверить на параллельность прямых. Это равенство угловых коэффициентов. И решить что делать с наложением двух отрезков. Или принять решение о том что пересечения нет. +Задача упрощается построением выпуклого boundinx box вокруг четырех точек. Это упрощает поиск и не надо искать его на бесконечно больших числах. По поводу целых и вещественнх я не просто так спрашивал. Там есть нюансы. Для вещественных надо задаваться критерием близости угловых коэффициентов. Слишком мелкие не учитывать. Для целых там возможно переполнение разрядной сетки и прочие дефекты целочисленных расчетов. Вообще. Для всех серъезных приложений инженерной графики проверка на совпадение вещественных координат - это почти всегда попадение в выпуклую облочку размера эпсилон по отношению с другому объекту. Например - точка попадает в окружность (другую точку). Или точка попадает в овал (окрестность вокруг отрезка). Игры с погрешностями и окрестности - это основная сложность подобных алгоритмов если решать их в вещественных числах. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 23:08 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Gennadiy Usovferzmikk Дополнил код для разных случаев: Какие случаи?ferzmikkДополнил код для разных случаев: - Если два отрезка вертикальные, лежат на одном X, пересекаются - возвращает вертикальное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. - Если оба отрезка горизонтальные. - Если два отрезка горизонтальные, лежат на одном Y, пересекаются - возвращает вертикальное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. - Если оба отрезка диагональные, но параллельные, пересекаются - возвращает диагональное пересечение. Нужно еще добавить, чтобы возвращал начала и конец пересечения. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 08:17 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonШилдта не читай. Он не в теме.Шилдта читаю не для графики, а для изучения C#. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 08:20 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
vas0ferzmikk, Для проверки на пересечение двух отрезков: A1 - A2, B1 - B2, достаточно чтобы точки A1 и A2 лежали по разную от отрезка b, а точки B1 и B2 по разную сторону отрезка a. По разную сторону, это значит определитель соотвествующий матрицы дает разные знаки.Не проще ли проверить так: найденные параметры А1 и B1, а также А2 и В2 подставить рассчитанный х и сравнить полученный Y для обоих уравнений? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 16:25 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
maytonЧитай Шикин и Боресков - Комьютерная графика.Это же для 3D Studio Max. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 16:42 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
ferzmikkmaytonЧитай Шикин и Боресков - Комьютерная графика.Это же для 3D Studio Max. Зачем выдумки выдумывать? Почитай сначала. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2019, 16:54 |
|
Вопрос по поводу алгоритма
|
|||
---|---|---|---|
#18+
Берешь любую линию (которые у тебя в массиве), ищешь, что с ней пересеклось. Так же делаешь для второй (т.е. ищешь какую то третью, которая пересеклась со второй). Запоминаешь эти линии, которые в твоей цепочке. Для каждой последующей , исключая предыдущую (не ПЕРВУЮ а предыдущую) смотришь не пересеклась ли она с чем-то уже пройденным начиная от первой. Раз пересеклась - имеешь замкнутую фигуру. Алгоритм гоняешь с самого начала для уже next from list = дабы найти все замкнутые фигуры. Там еще граничные всякие случаи погонять надо (как тут остроумно заметили - перекрученную а так же варианты пересечения двух "многоугольников"), но тупой перебор спасет отца российской алгоритмистики. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2019, 20:50 |
|
|
start [/forum/topic.php?fid=16&msg=39848200&tid=1339914]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 235ms |
total: | 387ms |
0 / 0 |