IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3  
 Ответить  Открыть новую тему 
> Нарисовать карту
сообщение
Сообщение #41


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Вообщем, дан на форма Image1 с загруженным туда рисунком в формате BMP или Icon,например,красная точка (уж не знаю, есть ли разница BMP, ICON?). Нужно, не создавая компоненты Image2,Imege3...Image23 на стадии контруировании формы, создать эти компоненты во время работы программы и скопировать туда этот рисунок из Image1,
затем вывести все эти рисунки на карту. Причем, каждый этот рисунок должен отобразиться в том месте, где находиться райцентр каждого района (ужимать ничего не надо, т.к.данный рисунок небольшой и в точности подходит к размерам нашего эллипса).В том примере, я пытался скопировать хотя бы в один рисунок, для общего слуачая понятно, что нужно будет array of TImage

Пересчитать обратно координаты так?
Код
for i:=0 to 23 do
   for j:=0 to length(Region[i].bounds)-1 do
      Region[i].bounds[j].X:=Round((bounds[j].X+dx)* m)


Цитата

1) Определяешь масштаб горизонтальный = размер региона по горизонтали / ширину формы;
2) Определяешь масштаб вертикальный = размер региона по вертикали / высоту формы;
3) Выбираешь из этих двух масштабов выбираешь максимальный.


Насчет масштаба, как определить размер всей карты? Я пытался подобрать,вроде так...
Код
if 1435/Form1.ClientWidth>854/Form1.ClientHeight then
   m:=1435/Form1.ClientWidth
else
  m:=854/Form1.ClientHeight;



--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Вместо
Canvas.Ellipse((Region[i].CenterX-x-th div 2 - 1)div m,(Region[i].CenterY-y-th div 2 - 1)div m,(Region[i].CenterX-x+ th div 2)div m,(Region[i].CenterY-y+ th div 2)div m);
напиши
Canvas.Draw((Region[i].CenterX-x) div m - Image1.Picture.Graphic.Width div 2,
(Region[i].CenterY-y) div m - Image1.Picture.Graphic.Height div 2,
Image1.Picture.Graphic.);
и не забудь поставить свойство Transparent=true у объекта Image1.

Цитата
Насчет масштаба, как определить размер всей карты? Я пытался подобрать,вроде так...
Ничего подбирать не нужно! nea.gif Я тебе говорил переделать код выделенный тобой как ненужный в посте 26! Тебе надо дополнительно выбрать максимальные значения. Имея также минимальные ... если подумать! ... то будешь знать размер твоей карты (в масштабе 1:1).


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата
Код
Canvas.Draw((Region[i].CenterX-x) div m - Image1.Picture.Graphic.Width div 2,
            (Region[i].CenterY-y) div m - Image1.Picture.Graphic.Height div 2,
            Image1.Picture.Graphic.);

для m:real; не подходит, а для целого в самый раз (гениальный вариант). Для вещественного никак нельзя?
А насчет пересчитывания координат из предыдущего поста, ничего не можете подсказать?


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Тьфу ты norespect.gif Для m - любого дошло до меня...А вот насчет персчитывания координат мыши в координаты карты? give_rose.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(}0pa @ 1.12.2006 1:08) *

Код
    { if i=1 then
     begin //относительное смещение координат карты и формы на экране
       dX:=Region[i].Rect.Left;
       dY:=Region[i].Rect.Top;
     end
     else
     begin //выбираем минимальные значения
       if dX>Region[i].Rect.Left then dX:=Region[i].Rect.Left;
       if dY>Region[i].Rect.Top then dY:=Region[i].Rect.Top;
     end;  }



Почему именно i:=1


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(NTL @ 11.12.2006 17:45) *

Почему именно i:=1

Если dX и dY не будут определены (как это делается на первом шаге), то не понятно к чему приведут сравнения dX>Region[i].Rect.Left и dY>Region[i].Rect.Top.
Цитата
А вот насчет персчитывания координат мыши в координаты карты?

Смотри снова пост 38. Что непонятного?

Сообщение отредактировано: hiv -


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата
Смотри снова пост 38. Что непонятного?

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

Цитата(hiv @ 12.12.2006 9:48) *

Если dX и dY не будут определены (как это делается на первом шаге), то не понятно к чему приведут сравнения dX>Region[i].Rect.Left и dY>Region[i].Rect.Top.


Но у нас же условие будет проверяться только один раз, когда :=1...Т.е. только один раз будет сравниваться


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


К райцентру я смог обратитьсяся, мб немного неоптимально, но собсвена вот//
Код
      
MasX[i]:= Round((Region[i].CenterX-dx) / m) - round((Image1.Picture.Graphic.Width) / 2);
MasY[i]:= Round((Region[i].CenterY-dy) / m) - Image1.Picture.Graphic.Height div 2;
Canvas.Draw(MasX[i],MasY[i],Image1.Picture.Graphic);
---------------------------------------------------------------
if (x>=MasX[i])and (x<=MasX[i]+image1.Picture.Width) and (y>=MasY[i])and(y<=MasY[i]+image1.Picture.height) then
      label2.caption:=Region[i].Name;

Осталось только к самому региону...Может подскажете? smile.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(NTL @ 12.12.2006 14:30) *

Но у нас же условие будет проверяться только один раз, когда :=1...Т.е. только один раз будет сравниваться

Вопрос снимается, дошло good.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #50


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Может быть, что-нибудь похожее...рез-ат этого почти правильный, но погрешносить все еще велика. Как бы ее свести к минимуму?
Код
    
if (x>=Round(Region[i].Rect.Left-dx)/m) and (x<=round(Region[i].Rect.Right-dx)/m) and
(y<=round(Region[i].Rect.Bottom-dy)/m) and (y<=round(Region[i].Rect.Top-dy)/m) then
  label1.Caption:=region[i].Center;

ЗЫ: Принадлежность точки к многоугольнику рассмотрел, но слишком это сложный вариант


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(NTL @ 12.12.2006 15:50) *
ЗЫ: Принадлежность точки к многоугольнику рассмотрел, но слишком это сложный вариант
Пилите Шура - пилите... (Ильф Петров)
По другому не получиться.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


При нажатии на райцентр - новая форма и рисование ТОЛЬКО одного соответствующего района cool.gif

Цитата(hiv @ 12.12.2006 16:34) *

Пилите Шура - пилите... (Ильф Петров)
По другому не получиться.

Не...Как бы обратиться к прямоугольнику этого района blink.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #53


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


С этой задачей справился, осталось немного- при нажатии на регион, создавалася новая форма и там вырисовывался этот регион только один smile.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #54


Гость






Цитата(NTL @ 14.12.2006 8:50) *

С этой задачей справился, осталось немного- при нажатии на регион, создавалася новая форма и там вырисовывался этот регион только один smile.gif

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

надеюсь не запутано объяснил =)
я кстате чутка переписал эту софтину, убрал мерцание при перерисовке
если надо вылажу код
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.09.2020 16:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name