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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2016, 22:22   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию GPS или Гео локация в делфи

Если честно не знаю даже как гуглить, делаю для игры GPS редактор.
Вопрос собственно как привязать координатную сетку к изображению реальному, кода пока нету, сделал только работу с базой.
Второй вопрос т.к. изображений много как устроить подгрузку изображения на краях\стыках.

Собственно спрашиваю только по тому что видел где-то (найти немогу) локацию для Google Maps на делфи, еще пока не приступал.
IvaniuS вне форума Ответить с цитированием
Старый 20.03.2016, 23:38   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

саспланета(http://sasgis.ru/sasplaneta/) на Delphi написана OpenSources.

Как привязаться. Хм. наверно через map файлы. Но честно не понял вопроса.

Цитата:
Второй вопрос т.к. изображений много как устроить подгрузку изображения на краях\стыках.
Кэшируй.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 22.03.2016, 00:51   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

В общем оказалось все попроще чем я думал..
Все что нужно уместилось в 1 строке кода
Код:
StretchBlt(imgmap.Canvas.Handle, dx, dy, trunc(1024 * curscale), trunc(1024 * curscale), buffers[0].Canvas.Handle, 0, 0, (buffers[0].Width), (buffers[0].Height), SRCCOPY);
//dx, dy - смещение по осям
//trunc(1024 * curscale), trunc(1024 * curscale) - задание маштаба
//Ну и правильно вычислить зависимость buffers от текущих РЕАЛЬНЫХ координат (широта\долгота)
И тут же столкунся с тем что:
1)StretchBlt при уменьшении делает изображение ужасным
2)StretchBlt Работает крайне медленно даже для 1024х1024

Т.к. я работал только с GLScene больше ничего не знаю, ни как реализовать на нативном OGL ни на GDI+
IvaniuS вне форума Ответить с цитированием
Старый 22.03.2016, 19:18   #4
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Дополню предыдущее сообщение, переписал отрисовку - теперь используется только BitBlt - и если разворачивать на весь экран - медленно, Быстрее только если переходить на OpenGL или DirectX, но тут я уже бессилен, по сути нужно только вывод изображения на форму.
IvaniuS вне форума Ответить с цитированием
Старый 22.03.2016, 20:13   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

BitBlt - рисует со скоростью 3 такта на пиксель. Если частоту процессора поделить на размеры картинки, то имеем
3 ГГц/(1280х1024х3 такта х 2 слоя)=381 FPS
На своем компе проверил даже в 2 разы быстрее.
Глазу хватит и десятой части 30 FPS.

Что я делаю не так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 22.03.2016 в 20:17.
Pavia вне форума Ответить с цитированием
Старый 23.03.2016, 10:36   #6
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Спасибо за информацию, я вроде бы максимально ускорил, функция отрисовки:
Код:
Procedure TMainForm.PaintMap;
var
  PrevStretchBltMode : Integer;
Begin
  imgmap.Picture.Graphic := nil;
  If oldscale <> curscale Then
  Begin
    //PrevStretchBltMode:=GetStretchBltMode(buffers[0].Canvas.Handle);
    //SetStretchBltMode(buffers[0].Canvas.Handle, STRETCH_HALFTONE);
    StretchBlt(buffers[0].Canvas.Handle, 0, 0, trunc(1024 * curscale), trunc(1024 * curscale), MapOrig[0].Canvas.Handle, 0, 0, MapOrig[0].Width, MapOrig[0].Height, SRCCOPY);
    //SetStretchBltMode(buffers[0].Canvas.Handle, PrevStretchBltMode);
    oldscale := curscale;
  End;
  BitBlt(imgmap.Canvas.Handle, dx, dy, imgmap.Width-dx, imgmap.Height-dy, buffers[0].Canvas.Handle, 0, 0, SRCCOPY);
  //dx, dy - смещение по осям
  //trunc(1024 * curscale), trunc(1024 * curscale) - задание маштаба
  //зависимость buffers от текущих РЕАЛЬНЫХ координат (широта\долгота)
End;
Вот когда вызываю ее чтобы можно было "двигать".
Код:
Procedure TMainForm.imgmapMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Begin
  If ssLeft In Shift Then
  Begin
    dx := x - bdx;
    dy := y - bdy;
    PaintMap;
  End;
End;

Procedure TMainForm.WMExitSizeMove(Var Message: TMessage);
Begin
  Inherited;
  PaintMap;
End;
И учитывая Вами сказанное мои 3.8 i5-4690k Должны запросто справляться с картинкой fullhd монитора.
Изучаю сейчас пример из FastDIB, который подходит.

Первая моя ошибка была в выборе компонента - image вместо PaintBox(TGraphicControl) или можно прямо на форме рисовать - никто не запрещает
(
Код:
      DC := GetDC(mainform.Handle);
      try
        IntersectClipRect(DC, Left, Top, Left + Width, Top + Height);
        Parent.PaintControls(DC, Self);
      finally
        ReleaseDC(mainform.Handle, DC);
      end;
).

Последний раз редактировалось IvaniuS; 23.03.2016 в 11:20.
IvaniuS вне форума Ответить с цитированием
Старый 23.03.2016, 20:30   #7
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Да не рисуйте никогда на image - вылезет боком))
9500 мкс получилось у меня на фулл скрине.

Теперь думаю что делать как подгружать и рисовать соседние и когда менять изображения.
Не хочу держать и грузить все 9 соседних изображения - подумал лишний раз и думаю только самые ближайшие (4) грузить в зависимости от квадранта (четверти)
Квадрант определил, отрисовку для I четверти сделал, а вот дальше делать через Case только наверное.
IvaniuS вне форума Ответить с цитированием
Старый 23.03.2016, 22:13   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Image хранит картинку. И время перерисовки падает в 2 раза. Не более.

Цитата:
е хочу держать и грузить все 9 соседних изображения - подумал лишний раз и думаю только самые ближайшие (4) грузить в зависимости от квадранта (четверти)
Квадрант определил, отрисовку для I четверти сделал, а вот дальше делать через Case только наверное.
Вот вам на подумать:
http://www.delphimaster.ru/cgi-bin/f...1455464929&n=7
А вот на подсмотреть, вы наверно и сами лучше напишите. См. вложение.
Вложения
Тип файла: zip WinAPI+Agg.zip (106.8 Кб, 25 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 23.03.2016, 23:10   #9
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Ну у меня более чем в 2 раза упало время, а тут я посмотрел почемубы и не хранить сразу все 9 картинок в JPEG (9*4к картинки ~ 100мб), а при необходимости передавать их уже в моих 4 битмапа (3,2 мб *4 = 13мб) - в общем будет не более 150мб точно, а сейчас даже на ноутбуке больше и некоторые страницы в браузере кушают больше.

Тогда будет на много проще, просто при смене квадранта, я буду уже подгружать бмр, а при смене 2х квадрантов буду подгружать новые jpeg.
нужно главное правильно отрисовку доделать

Последний раз редактировалось IvaniuS; 23.03.2016 в 23:18.
IvaniuS вне форума Ответить с цитированием
Старый 24.03.2016, 06:23   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
а тут я посмотрел почемубы и не хранить сразу все 9 картинок в JPEG (9*4к картинки ~ 100мб),
Дык тормоза будут на декодировании. Я в ссылке выше привел расчёты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление записи и локация предидущей. tarakan1983 БД в Delphi 5 20.09.2012 09:09
Делфи или паскаль МАРА90 Помощь студентам 1 09.12.2010 21:47
GPS zumm Компьютерное железо 0 01.11.2010 10:58
Делфи или Паскаль LLIypLLIyH Помощь студентам 9 28.05.2008 18:22