Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизДайет совет!! Найти похожие ветки
← →
Frozzen (2004-11-17 08:12) [0]Господа
ситуация такая: построил изолинии, сейчас необходимо раскрасить облости между ними. Я думаю нужно получить полигоны, а затем их раскрашивать. Дак вот, не могу придумать алгоритм построения полигонов по имеющимся линиям.
Подскажите чего-нибуть!
← →
Frozzen (2004-11-17 08:21) [1]описался в названии темы
сори
← →
Unknown (2004-11-17 08:52) [2]Что-что ты сделал, не могу врубить?
Может тебе нужен FloodFill
← →
kostan © (2004-11-17 08:52) [3]не совсем понятно как выглядят полигоны ("открытые" что то типа pipe или "закрытые" типа многоугольника)
если не требуется быстрота сканирую всю область (через canvas)
на предмет наличия цвета(ов) изолинии
сначала сверху-вниз
если надо то и слева-направо
(заполняй условия ) и по условиям запускай процедуру закраски
← →
Frozzen (2004-11-17 08:56) [4]изолиния - это список точек с координатами
← →
Frozzen (2004-11-17 08:56) [5]в обще опишу задачу полностью
← →
Frozzen (2004-11-17 09:00) [6]Нужно раскрасить площадно карту(как в прогнозе погоды)
Дано: Точки с определенным значение на карте(показатели мееостанций)
Я накладываю на карту регулярную сетку
получаю значение в каждом узле сетки интерполяцией заданнных точек(метео станций)
по этой сетке строю изолинии(изолиния - списк точек)
теперь стает задача раскраски пространства между изолиниями
← →
Frozzen (2004-11-17 09:03) [7]необходимо выделить полигоны
а затем их закрасить
← →
Гаврила © (2004-11-17 09:03) [8]Создать регион(а не полигон), потом его залить.
создание региона по массиву точек выполняется одной функцией, заливка второй функцией
Подробности в MSDN
← →
Frozzen (2004-11-17 09:04) [9]предпологается использование векторного движка, а не канваса
но сейчас это все на канвасе
← →
Frozzen (2004-11-17 09:05) [10]дык вот
загвоздка в алгоритме получения точек для создания региона
← →
Гаврила © (2004-11-17 09:09) [11]У тебя же уже есть точки, по которым построены изолинии
← →
Frozzen (2004-11-17 09:11) [12]-------------------------------
1 | 2 |
| |
---+ | | 5
| | +--+ |
4 | | | 3 | |
----+ | +---+ |
| |
| |
| |
--------------------------------
вот примерная картинка, нужно выделить регионы 1,2,3,4,5
← →
Frozzen (2004-11-17 09:12) [13]картинка не получилась
← →
Дмитрий В. Белькевич (2004-11-17 09:16) [14]Ощи алгоритмы оконтуривания (contouring). В инете их есть. По градиентам всё достаточно просто ищется.
← →
Frozzen (2004-11-17 09:20) [15]точки то есть
а че с ними делать не ясно
вот например берем начало изолинии (на горе картинке верхняя точка между регионами 1 и 2) начинаем обход по границе карты в лево. Потом вниз. Встречаем регион 4 огибаем его по изолинии и т.д. пока не вернемся в начальную точку.
Затем берем начальную точку линии между регионами 4 и 1. И куда начинать обход по изолинии, тогда можно уйти дальше и незамкнуть 4.
← →
Frozzen (2004-11-17 09:21) [16]ща попытаюсь поискать
← →
REA (2004-11-17 10:11) [17]BeginPath, EndPath еще посмотри
← →
Frozzen (2004-11-17 10:11) [18]непонял
← →
Frozzen (2004-11-17 10:18) [19]не мне нужно это все в своей структуре хранить, т. к. потом это все векторно отображаться будет
← →
PVOzerski © (2004-11-17 10:43) [20]>не мне нужно это все в своей структуре хранить,
Конечно, для этого используются файлы и оперативная память, а не программисты :^)
> т. к. потом это все векторно отображаться будет
А что, бывают особые "векторные" мониторы?
Теперь серьезнее. Есть 2 аспекта проблемы: 1) в каком виде хранить; 2) какими средствами сохраненное потом отображать на экране. Не надо это смешивать. Никто не заставляет сохранять в файле цвет каждого пикселя, но на этапе рисования тем или иным способом будет краситься именно каждый пиксель (пусть даже код, используемый для этого, "зарыт" в системе, а то и в "железе").
Непонятно из изложенного: а что, исходное (незакрашенное) изображение уже растровое, координаты точек, образующих изолинии, надо восстанавливать? Мне почему-то показалось, что они всё-таки известны. Тогда все советы уже даны.
← →
Rem © (2004-11-17 10:49) [21]TCanvas.Polygon(Points: array of TPoint);
Use Polygon to draw a closed, many-sided shape on the canvas, using the value of Pen. After drawing the complete shape, Polygon fills the shape using the value of Brush.
← →
Rem © (2004-11-17 10:54) [22]>>А что, бывают особые "векторные" мониторы?
В свое время были такие. Вымерли, правда, давно, как динозавры. Но кое-где еще можно найти таких рептилий...
Кстати, лазерные проекционные установки (на концертах такие используют) используют как раз векторный принцип построения изображения. Так что, весьма возможно, что обговариваемое здесь решение будет использоваться как раз для таких целей.
;)
← →
Frozzen (2004-11-17 11:05) [23]Задача и стоит получить точки, принадлежащие i-му контуру, т.е. выделить из точек, образующих границы карты и изолинии - точки, пренадлежащие конкретному контуру
← →
PVOzerski © (2004-11-17 11:14) [24]Ну, и бегай по границе цветов... Крутись, скажем, по часовой стрелке: уперся вверх - пробуем вверх-вправо и т. д. Я когда-то такое писал, жаль, не сохранил исходники, а то бы поделился...
← →
Frozzen (2004-11-17 11:14) [25]а уж как нарисовать контур эт второе дело
← →
PVOzerski © (2004-11-17 11:18) [26]Ну, для моих задач идеально Polygon подходил. Думаю, кстати, что при разумном порядке раскраски и здесь подойти может.
← →
Frozzen (2004-11-17 11:23) [27]отображать не моя задача
моя задача из массива точек изолиний получить массив точек региона
ну я тоже думал так: берем первую изолинию и начинаем обход по часовой стрелке с ее первой точки, доходим до границы(либо приходим в начальную точку) и стает задача поиска точки следующей изолинии из имеющихся
кароче че то все не тревиально выходит
← →
PVOzerski © (2004-11-17 11:38) [28]В принципе, у меня именно при решении проблемы по такому пути всё получалось. Важно было только правильно задать начальное направление "тыканья" для самой первой точки. И "щупать" не 4 направления, а все 8.
Кстати, уверен, что и ты сейчас, и я несколько лет назад занимались изобретением велосипеда, наверняка эти алгоритмы хорошо разработаны и где-нибудь в сети валяются.
← →
Frozzen (2004-11-17 11:44) [29]уверен
← →
Frozzen (2004-11-17 11:48) [30]не у меня все проще получается
ходиш либо по изолинии
либо по границе карты
основная сложность когда выходиш на границу найти точку следующей изолинии
← →
PVOzerski © (2004-11-17 12:17) [31]Проверяй точку на вхождение в уже созданные спски точек. Не входит - значит, новая.
← →
Frozzen (2004-11-17 12:19) [32]не, проблема выбрать именно ту точку, которая действительно является следующей
← →
Frozzen (2004-11-17 12:20) [33]на границе точек нет
← →
Frozzen (2004-11-17 12:28) [34]все вроди встало все на свои места
← →
Frozzen (2004-11-17 14:16) [35]стала проблема избежания двойного построения региона
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.054 c