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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2008, 20:07   #11
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Можно еще вариант предложить ? Даже два.

Простой. Все страны разного цвета. Берем пиксель под курсором мыши. Его цвет - номер страны. Думаю цветов хватит.

Усложненный. Для каждой страны строится регион. Например, так делаются формы в виде произвольной картинки. CreateRectRGN / CombineRgn. Попадание курсора мыши в регион легко проверяется - RectInRegion.
alexBlack вне форума Ответить с цитированием
Старый 10.04.2008, 20:10   #12
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Усложненный. Для каждой страны строится регион. Например, так делаются формы в виде произвольной картинки. CreateRectRGN / CombineRgn. Попадание курсора мыши в регион легко проверяется - RectInRegion.
С этого места, можно поподробней, как построить регион. (скажем есть карта россии)
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 10.04.2008, 20:18   #13
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вот пример (не мой)
Один цвет считается прозрачным. Из bmp строится регион, который включает все остальные цвета. Этот регион используется для создания формы.

Код:
 function TForm1.CreateRegion(Bmp: TBitmap): THandle;
 var
   X, Y, StartX: Integer;
   Excl: THandle;
   Row: PRGBArray;
   TransparentColor: TRGBTriple;
 begin
   Bmp.PixelFormat := pf24Bit;

   Result := CreateRectRGN(0, 0, Bmp.Width, Bmp.Height);

   for Y := 0 to Bmp.Height - 1 do
   begin
     Row := Bmp.Scanline[Y];

     StartX := -1;

     if Y = 0 then
       TransparentColor := Row[0];

     for X := 0 to Bmp.Width - 1 do
     begin
       if (Row[X].rgbtRed = TransparentColor.rgbtRed) and
         (Row[X].rgbtGreen = TransparentColor.rgbtGreen) and
         (Row[X].rgbtBlue = TransparentColor.rgbtBlue) then
       begin
         if StartX = -1 then StartX := X;
       end
       else
       begin
         if StartX > -1 then
         begin
           Excl := CreateRectRGN(StartX, Y, X + 1, Y + 1);
           try
             CombineRGN(Result, Result, Excl, RGN_DIFF);
             StartX := -1;
           finally
             DeleteObject(Excl);
           end;
         end;
       end;
     end;

     if StartX > -1 then
     begin
       Excl := CreateRectRGN(StartX, Y, Bmp.Width, Y + 1);
       try
         CombineRGN(Result, Result, Excl, RGN_DIFF);
       finally
         DeleteObject(Excl);
       end;
     end;
   end;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 var
   Bmp: TBitmap;
 begin
   Bmp := TBitmap.Create;
   try
     Bmp.LoadFromFile('C:\YourBitmap.bmp');
     FRegion := CreateRegion(Bmp);
     SetWindowRGN(Handle, FRegion, True);
   finally
     Bmp.Free;
   end;
 end;
alexBlack вне форума Ответить с цитированием
Старый 10.04.2008, 20:22   #14
WOLFak
Форумчанин
 
Аватар для WOLFak
 
Регистрация: 30.12.2007
Сообщений: 180
По умолчанию

1 вый вариант был моей идеей тока где найти такую карту?
2 ой вариант мне нрав хотя он ооочн замысловатый если строить регион для каждой страны....
их вроде ж больше 120 или 150 вроде бы
^_^

Последний раз редактировалось WOLFak; 10.04.2008 в 20:25.
WOLFak вне форума Ответить с цитированием
Старый 10.04.2008, 20:22   #15
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Не подскажете "PRGBArray" из какого модуля взять?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 10.04.2008, 20:26   #16
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от WOLFak Посмотреть сообщение
да нет на счет координат я понял ну есть у меня координаты далше то что?
А дальше в OnMouseMove нужно проверять с текушими координатами и если курсор находится в диаппазоне (скажем Китая),то по этим точкам прорисовываем линию, она и будет границей Китая.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 10.04.2008, 20:33   #17
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Не подскажете "PRGBArray" из какого модуля взять?
Понятия не имею. Но у автора используется простое описание для доступа к цветам пикселов. Можно описать это так:

type
TRGBArray = array[0..32767] of TColor;
PRGBArray = ^TRGBArray;

а TRGBTriple у него используется для деления на составляющие RGB
и используется только в одном месте. Это можно сделать и по другому.
Я как-то переделывал, но не пригодилось и сейчас не могу найти свой вариант. Air, если не получится, попробую восстановить.
alexBlack вне форума Ответить с цитированием
Старый 10.04.2008, 20:42   #18
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Цитата:
Сообщение от WOLFak Посмотреть сообщение
Привет всем
вы не знаете где можно скачать карту мира (в ней не должно быть никаких записей кроме столиц стран и у каждой страны должен быть свой цвет)
WorlPolMap.rar

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Можно еще вариант предложить ? Даже два.
Простой. Все страны разного цвета. Берем пиксель под курсором мыши. Его цвет - номер страны. Думаю цветов хватит.
Карту правишь под свои нужды Photoshop'ом. Берешь Простой метод (наиболее оптимальный) от alexBlack и получаешь нужный тебе результат
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 10.04.2008, 22:23   #19
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Да, метод с цветами действительно хитрый и простой. Можно сделать так что юзер и не заметит что цвета разные. Обычно ведь на картах используют до 10-ти цветов, на один два байта оттенок изменяешь и никто не заметит, визуально те же десять цветов.

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

А уже на основе этих массивов можно сделать общий, для ускорения поиска, на каждый пиксель назначить страну наподобии как мп3 теги жанры хранят, одного байта хватит.
Код:
const
 Genres : array[0..146] of string =
    ('Blues','Classic Rock','Country','Dance','Disco','Funk','Grunge',
    'Hip- Hop','Jazz','Metal','New Age','Oldies','Other','Pop','R&B',...
Принцип думаю ясен?
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; 10.04.2008 в 22:37.
mutabor вне форума Ответить с цитированием
Старый 10.04.2008, 22:34   #20
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А по мне, так вместо массивов проще маску сделать. Одну карту показываем пользователю (со всем рельефом). По второй карте определяем страну. Маска делается в Photoshope с реальной карты.
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь KpeHDeJIb Помощь студентам 4 04.07.2008 11:52
МНЕ НУЖНА ПОМОЩЬ Акашаев Нурлан Общие вопросы Delphi 4 29.06.2008 21:07
Нужна помощь londoner Общие вопросы Delphi 2 05.02.2007 14:23