Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2008, 21:57   #11
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

А в матрице что собственно храниться будет? Насколько лёгким будет поиск по матрице нужного дома по адресу?

ЗЫ. с масштабированием кусков растра я бы не стал связываться. Как бы там картинка не "поплыла"
pu4koff вне форума Ответить с цитированием
Старый 17.08.2008, 22:05   #12
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
А в матрице что собственно храниться будет? Насколько лёгким будет поиск по матрице нужного дома по адресу?

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

Если масштабировать в минус, не поплывет )

p.s. Поиск будет сначала не в матрице а в массиве адресов, по индексу найденного адреса будем иметь значение ячейки к-рую искать.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 17.08.2008 в 22:11.
mutabor вне форума Ответить с цитированием
Старый 17.08.2008, 22:23   #13
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Я аж сам заинтерисовался как сделать лучше. Матрица мне не нравится тем, что для большой карты она будет много места занимать. Хотя в принципе можно матрицу меньше сделать, чтобы 1 элемент был на 4 точки карты. Всёравно пользователь с точностью до пикселя метиться не будет. Но в принципе этот вариант подойдёт и для "моих" картинок. В плане больших возможностей расширения я у матрицы ничего не вижу. так же идет 1 точка - 1 объект.
Для цветных картинок можно приплести БД с двумя таблицами:
1) Объекты (ID_объекта, Адрес,...)
2) КускиКартинок (ID_куска, цвет, ID_объекта)
Соответственно не так уже проблематично будет по адресу найти кусок, на котором изображен дом.
Ну Адреса можно вынести в некий КЛАДР. Да и картинки все при желании можно в БД засунуть, так что всю чёрную работу будет СУБД выполнять. Хотя хз как это будет в реальности работать
pu4koff вне форума Ответить с цитированием
Старый 18.08.2008, 01:12   #14
zzzzz
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 69
По умолчанию

а как можно реализовать эту матрицу? А то я с этим ещё не сталкивался, и чесно сказать теперь меня это зацепило!!!!))) Теперь полюбому нужно сделать эту карту, заодно и разберусь!!!

Вот нашёл статейку про GIS компоненты. Говорят, что разобраться сложно, но если разберёшься, то будет проще чем с image! Может кто слышал об этих компонентах? Или проще не заморачиваться и делать своими силами?

По поводу перетаскивания решил уже!!! Правда, нетрадиционным методом: В Panel поместил Image, и загружаю сразу всю картинку, а видно только то, на сколько позволят размер Panel!!! посмотрим как оно получиться. Осталось только с матрицей разобраться)))))
Help me!!!

Последний раз редактировалось Stilet; 15.06.2011 в 17:23.
zzzzz вне форума Ответить с цитированием
Старый 18.08.2008, 23:30   #15
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

zzzzz, не пости несколько сообщений подряд, пользуйся кнопкой "Правка"

По поводу программы. Хочу сразу заметить я не гуру в ГИС, просто я напишу как я бы решил такую задачу. Компоненты готовые можно конечно использовать, но так ничему не научишься.

Убирай все панели с имиджами, тебе для отображения понадобится один компонент - TPaintBox. Кинь его на форму, найди ему место и все, пока с ним больше ничего делать не надо.
Теперь с картой, каких она размеров? Справка: 1 пиксель несжатого растра в 24-х битном цвете занимает в памяти 3 байта. Если карта большая, подели ее на куски, а то памяти может и не хватить, да и грузить систему будет. К примеру 1600х1200 будет занимать 5,7 МБ, 2000х3000 уже 18МБ. Вобщем смотри сам, если не сильно большая можно не делить.
Или она у тебя векторная? Это многое меняет. Пока буду объяснять для растровой.

Матрица. Обычный двумерный массив, тип cardinal не самый экономный, но и домов в городе много.
Код:
map: array of array of cardinal;
С сеткой (это и есть матрица) также ты сам должен определиться. Можно погрубее сделать 4х4 (16) пикселей в ячейке, а можно и пиксель в пиксель, будет памяти больше занимать. В одной ячейке сетки будет содержаться данные (индекс в массиве адресов, о нем ниже) к какому дому принадлежит ячейка, если в ячейке ноль - ни к какому.

Кроме матрицы еще понадобится массив адресов, это одномерный массив строк. На время работы программы его лучше для удобства грузить в TStringList.
Вот его примерное содержание
Цитата:
{нулевой элемент массива должен быть пустым}
Лермонтова 1
Лермонтова 1а
Лермонтова 2
Лермонтова 2/1
...
Пушкинская 1
... и т.д.
Как видишь у каждого дома есть уникальный индекс в массиве. Этот индекс и будет храниться в ячейках матрицы. Нулевой элемент не заполняем, т.к. ноль в ячейке - это ячейка не ссылающаяся ни на какой дом. Если кол-во домов уместится в 65535 можно для экономии памяти использовать двухбайтный тип word в матрице вместо 4-х байтного cardinal.

Теперь вернемся к графике. Грузим карту в TBitmap будем считать что она не сильно большая и грузим целиком. Важный параметр - координаты верхего левого угла. Меняя его координаты (они почти всегда будут в минусе, т.е. меньше нуля) и будем делать перетаскивание.
Для перетаскивания нужно создать переменую
Код:
Down: boolean;
При обработке MouseMove в PaintBox, по этой переменной будем определять зажата кнопка мыши или нет (по событию MouseDown нужно присваивать ей true, а по MouseUp false). Если зажата - тащим (меняем координаты в.л. угла), отпущена - узнаем значение из матрицы, из той ячейки к-рая соотв. месту на карте (сдвиг карты нужно учитывать), и выводим на кран (в эдит например) строку (из массива с адресами) с индексом, к-рый мы взяли из матрицы.

Формула для перевода координат из пикселей в ячейки матрицы
cx:=(x + sx) div cell;
cy:=(y + sy) div cell;
где
cx, cy - координаты ячейки
x, y - координаты в пикселях полученные с PaintBox
sx, sy - сдвиг карты влево и вверх
cell - ширина ячейки

Чтобы в PaintBox картинка не пропадала, нужно перерисовывать его по его событию OnPaint. Это чтобы не пропала при сворачивании и т.п., а рисовать в нем нужно так:
Код:
PaintBox.Canvas.Draw(x,y,MapBM);
где
x,y - координаты л.в. угла
MapBM - TBitmap, содержащий карту.

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

Предварительное заполнение массивов - массива адресов и затем матрицы, самое трудоемкое из всей работы. Для матрицы неплохо бы редактор написать (как редактор карт в играх) упрощающий заполнение, кто любит работать руками, может вручную заполнять =)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.06.2011, 06:03   #16
РОма_римский
Новичок
Джуниор
 
Регистрация: 14.06.2011
Сообщений: 2
По умолчанию

Доброго всем времени суток, а как в коде это запечатлить? нужно очень ребят!
РОма_римский вне форума Ответить с цитированием
Старый 15.06.2011, 15:19   #17
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

zzzzz, вот это посмотрите, может , чего
полезного найдете.

http://www.delphisources.ru/pages/so...paint-box.html

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Карта города Vadimok Общие вопросы Delphi 4 26.08.2008 17:36
Звуковая карта SunKnight Win Api 3 23.12.2007 23:44
Карта области Dmitriy77 Общие вопросы Delphi 0 23.10.2007 18:46
Карта города 2 Archangel Помощь студентам 3 04.03.2007 05:19