Вхождение отрезка прямой в диапазон

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Вхождение отрезка прямой в диапазон

Сообщение oskolok_vatbI » 11.09.2016 (Вс) 18:20

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

У меня имеется два набора данных по глубине. Я зову их Section (где ищу) и Interval (что ищу).

Мне нужна ваша помощь с определением количества Section, в которые входит один или несколько Interval. Ниже есть рисунок, если не понятно написал.

Изображение

BottomSection(n) всегда равно TopSection(n+1). Т.е. конец одной секции - всегда начало следующей, конечно кроме последней.

Значения хранятся в массивах:

Код: Выделить всё
Dim TopSection() as Long
Dim BottomSection() as Long
Dim TopInterval() as Long
Dim BottomInterval() as Long


Пытаюсь в цикле перебрать все с учетом значения переменной FlagIsFirst - True или False:

Код: Выделить всё
            For i = LBound(TopSection) To UBound(TopSection) - 1
                For j = LBound(TopInterval) To UBound(TopInterval) - 1
                    If TopSection(i) <= TopInterval(j) And BottomSection(i) >= BottomInterval(j) And FlagIsFirst = True Then
                        Joints = Joints + 1
                        FlagIsFirst = False
                    End If
                Next
                FlagIsFirst = True
            Next


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

Заранее спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вхождение отрезка прямой в диапазон

Сообщение Хакер » 12.09.2016 (Пн) 5:01

Сначала ничего не мог понять, потом дошло, что тут замешан неправильный английский.

Должно быть BottomOfSection или SectionBottom, чтобы это был «низ секции». В противном случае это получается «нижняя секция». Аналогично с верхом.

С точки зрения хоть немного красивого программирования — это вообще дожны быть массивы UDT — массив секций и массив отрезков, а не 4 массива непонятных чисел.

С точки зрения изложения вопроса или задачи — описание мутное и расплывчивое, ибо непонятно:
  1. Считается ли секция обитаемой, если отрезок полностью лежит в её пределах?
  2. Считается ли секция обитаемой, если только один конец отрезка лежит в её пределах (а другой конец — в другой секции)?
  3. Считается ли секция обитаемой, если начало отрезка лежит до начала секции, а конец отрезка — после конца секции, иными словами, если точки отрезка не лежат внутри секции, но сам отрезок секцию пересекает?

Судя по коду, ответ на вопрос 1 — «да», а на вопросы 2 и 3 — «нет». Но тогда код содержит ошибку, потому что перед началом цикла не устанавливается флаг, и отрезки, лежащие в первой (по ходу цикла) секции не имеют шанса повлиять на счётчик. Или эта строчка просто не попала во фрагмент, который выложен здесь.

Да и вообще, флаг совсем не нужен: проверку флага, начальную установку, сброс при обнаружении вхождения и установку перед проверкой следующей секции можно выкинуть, а FlagIsFirst = False заменить на Exit For

Но если судить не по коду, а по рисунку, то ответы на вопросы 1 и 2 — «да», а на вопрос 3 понять из картинки ответо нельзя (видимо тоже «да»). Тогда код не соответствует картинке, и значит совершенно не соответствует задаче. Что ближе к истинной задаче — код или картинка — та ещё загадка.

Так что ответить тут что-то без уточнений и разъяснений сложно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Вхождение отрезка прямой в диапазон

Сообщение Sam777e » 12.09.2016 (Пн) 17:08

Написал действительно непонятно.

Для согласия с картинкой я бы написал:

... Секций, которые пересекаются с одним или более Интервалами.

Кроме того, если немного подумать, то ясно видна избыточность данных -
зачем для Секции нужны две границы ?

А делал бы так:
специальное слияние 3-х списков в один список событий вида
[ показываю блок информации, когда несколько координат совпадают -
в другом случае все вполне естественно. ]


Признак
...
конец_Интервала
конец_другого_Интервала
конец_третьего_Интервала
граница_Секции
начало_какого-то_Интервала
начало_какого-то_другого_Интервала
...
+ простой конечный автомат.
Здоровья и удачи

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Вхождение отрезка прямой в диапазон

Сообщение oskolok_vatbI » 14.09.2016 (Ср) 23:11

Хакер, Sam777e

Спасибо за советы и извините за неясное объяснение. Начав разбираться с пунктами, упомянутыми Хакером, нашел, что игнорируется/неверно обрабатывается множество событий. Так что вопрос пока замораживается. Возможно, решив предыдущие нестыковки, эта пройдет сама собой.

Еще раз, спасибо за участие.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList  
cron