C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Линии уровня, Как рисовать лини уровня?
tsl
Отправлено: 28.08.2005, 05:58


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Почему-то казался избитым вопрос. Но по поиску на форуме "линии уровня" не нашел. Очень не хочется изобретать велосипед.

Подскажите, как мне найти готовый код, dll, алгоритм... для рисования линий уровня?
Halfdead
Отправлено: 29.08.2005, 08:04


Не зарегистрирован







Ээээ...а что такое, собственно, "линии уровня"?
tsl
Отправлено: 29.08.2005, 14:07


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Линии уровня рисуются для отображения на плоском рисунке трехмерного изображения. Например, когда есть функция двух переменных, то ее часто изображают в виде линий уровня. Линия уровня есть линия в которой функция двух переменных имеет постоянное значение. Таким образом, если для нескольких значений функции нарисовать соответствующие им линии уровня так что они заполнили некоторую область, то можно понять как функция меняется в этой области. Еще пример, линии уровня для температуры на плосткой поверхности будут называться изотермами.
olegenty
Отправлено: 29.08.2005, 15:22


Ветеран

Группа: Модератор
Сообщений: 2412



ну не совсем так. по определению функции (насколько я помню школьную программу), одному значению аргумента может соответствовать одно и только одно значение функции. так что круг может и функция, но только в полярных координатах smile.gif
vvoid
Отправлено: 29.08.2005, 16:19


Машинист паровоза

Группа: Участник
Сообщений: 171



QUOTE
ну не совсем так. по определению функции (насколько я помню школьную программу), одному значению аргумента может соответствовать одно и только одно значение функции. так что круг может и функция, но только в полярных координатах

Причём тут это? Человек не про функцию одного аргумента спрашивает, а про функцию двух аргументов (о чём чётко написано), а это значит, что к примеру f(0,1) = f(4,3) = ... = 1 и т.д.

Но тут речь не о том. К сожалению так навскидку не могу предложить качественный алгоритм построения этих линий.

Как говорится полный перебор никто не отменял :-) Можно попробовать для каждой пары чисел (фактически координаты х, у на плоскости) считать значение необходимой функции и соединять те точки для которых значение расчитываемой функции одинаковые.
Но тут возникает проблема пересчёта значений для одних и тех же точек при построении разных линий. Что бы не пересчитывать можно держать в памяти массив, который сначала полностью расчитывается а потом по его значениям строистя линия. Но ведь точек может быть очень много.
Кстати, какого порядка количество "точек" у вас?
tsl
Отправлено: 30.08.2005, 03:01


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Исходя из того что мне нужно прямо сейчас, так количество точек можно взять совпадающим с количеством пикселов на видимой картинке.

Пролема одновременно сложная и старая. Я видел алгоритм реально работающей программы. Источник датировался началом семидесятых годов. Несмотря на продвинутость алгоритма, программа в некоторых случаях проглючивала. Работала она под графопостроитель на ЕС ЭВМ. Вход в графопостроитель был через бумажную перфорированную ленточку. Можно сказать музейный экспонат. В данный момент графопостроителя, а главное документации к программному обеспечению к нему, возможно физически не существует. Но в литературе линии уровня встречаются очень часто в самых последних публикациях. Известный пакет "Математика" поддерживает рисование линий уровня.

Но мне нужно нарисовать линии уровня в Canvas.
tsl
Отправлено: 30.08.2005, 03:18


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Об одной сложности проблемы. Реально провести линию уровня нельзя поскольку функция гладкая, а поле пикселов дискретное. Поэтому линия должна проходить приближенно. И здесь сложность в том, что надо уберечься от зацикливаний и переходов с одной линии на другую. Ведь каждая линия должна быть либо замкнутой, либо заканчиваться на границах области.

Отредактировано tsl — 30/08/2005, 03:20
Halfdead
Отправлено: 30.08.2005, 03:52


Не зарегистрирован







Алгоритмы построения линий уровня. Там же про реализацию на дискретном поле.
http://aszkenazy.narod.ru/isoline_h.htm
Rius
Отправлено: 30.08.2005, 04:13


Мастер участка

Группа: Участник
Сообщений: 321



и реализовано уже давно в TeeChart 6 и 7
tsl
Отправлено: 30.08.2005, 18:34


Дежурный стрелочник

Группа: Участник
Сообщений: 65



QUOTE (Rius @ 30/08/2005, 04:13)
и реализовано уже давно в TeeChart 6 и 7

Пользовался этим средством. Посмотрел, на всякий случай, еще раз. Линий уровня нигде не заметил.

Может чего то не замечаю? Если не замечаю, хотелось бы знать.

Отредактировано tsl — 30/08/2005, 18:35
tsl
Отправлено: 03.09.2005, 06:42


Дежурный стрелочник

Группа: Участник
Сообщений: 65



QUOTE (Halfdead @ 30/08/2005, 03:52)
Алгоритмы построения линий уровня. Там же про реализацию на дискретном поле.
http://aszkenazy.narod.ru/isoline_h.htm

Спасибо. Какое-то время ссылка была не доступна. Только сегодня я ее получил.

Готово продукта в обозримое время мне, я думаю, не получится найти.
Поэтому, приступаю к разработке объекта рисования изолиний. Думаю, какой-то простенький вариант у меня займет не много времени. Потом постараюсь сделать что-то приличное. Если кто-то хочет принять участие в разработке или тесте, сообщите.

Отредактировано tsl — 03/09/2005, 06:42

Вернуться в Вопросы программирования в C++Builder