Нарисовать карту |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Нарисовать карту |
}0pa |
17.11.2006 16:37
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Проблема такова: В прикрепленном файле находятся файлы KRD-карты районов. Каждый из них содержит название района, координаты точек, макс. и мин. значения "х" и "у". Помогите вывести на экран хотя бы одну карту
Код interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; x,y,h:real; I1,I2,J1,J2:integer; x1,x2,y1,y2:real; implementation {$R *.dfm} {------------------------------------------------------------------------------} function II(x:real):Integer; begin II:=I1 + Trunc ((x-x1)*(I2-I1)/(x2-x1)) end; {------------------------------------------------------------------------------} function JJ(y:real):Integer; begin JJ:=J1 + Trunc ((y-y1)*(J2-J1)/(y2-y1)) end; {------------------------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); begin with Image1 end; end. Прикрепленные файлы KRD.rar ( 17.13 килобайт ) Кол-во скачиваний: 179 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
}0pa |
19.11.2006 10:25
Сообщение
#2
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Смотрю по коду, вроде должно работать, но все равно карту не рисует из файла:
1.Название района 2.Название райцентра 3.Координаты 4.,5.Макс по Х и мин по Х, соотевтсвенно макс по у и мин по у... Остальные просто координаты! В качестве примера взял один файл с название "район1" Код var Form1: TForm1; x1,y1,x2,y2,h:real; x,y,col:integer; I1,J1,I2,J2,n,j,k:integer; s1,s2:string; f:TextFile; implementation {$R *.dfm} {------------------------------------------------------------------------------} function II(x:real):integer; begin II:=I1+Trunc((x-x1)*(I2-I1)/(x2-x1)) end; {------------------------------------------------------------------------------} function JJ(x:real):integer; begin JJ:=J1+Trunc((y-y1)*(J2-J1)/(y2-y1)) end; {------------------------------------------------------------------------------} procedure DrawGraphic; begin reset(f); k:=0; with Form1.Image1,Form1.Image1.Canvas do begin x:=1413;y:=1294; MoveTo(II(x),JJ(-y)); while not eof(f) do begin k:=k+1; while not eoln(f) do begin Rectangle(0,0,Width,Height); if (k=1)or(k=2) then read(f,s1) else if k=4 then read(f,n) else if k=7 then read(f,col) else begin read(f,x,y); LineTo(II(x),JJ(-y)) end end; readln(f) end; close(f); end; end; {------------------------------------------------------------------------------} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(f, 'D:\Documents and Settings\Administrator\My Documents\Delfi_files\Map\RAION1.KRD'); n:=200; x1:=-6; y1:=-6; x2:=6;y2:=6; I1:=0;J1:=0; I2:=Image1.Width;J2:=Image1.Height; DrawGraphic; end; Сообщение отредактировано: }0pa - 19.11.2006 10:30 Прикрепленные файлы RAION1.rar ( 603 байт ) Кол-во скачиваний: 147 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
мисс_граффити |
19.11.2006 12:09
Сообщение
#3
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Что значит вывести?
Что должно получиться на экране? Название района и куча точек? -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
}0pa |
19.11.2006 17:24
Сообщение
#4
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Да, куча точек - карта района с его названием и названиеи райцентра!
-------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
21.11.2006 11:12
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Что означает 7 в 7-ой строке файла данных о районе?
-------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
hiv |
21.11.2006 12:19
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Вроде что-то получилось
Region.rar ( 6.81 килобайт ) Кол-во скачиваний: 347 Вот как выглядит: ЗЫ: Если хочешь несколько районов, то используй массив из TRegion. Но не забудь, что пересчитывать Delta (относительное смещение координат карты и формы на экране) придется для каждого региона по другому. -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
22.11.2006 1:50
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Большой респект. Нашел свои ошибки!!!Спасибо!
-------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
}0pa |
22.11.2006 18:29
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Цитата Если хочешь несколько районов, то используй массив из TRegion Не мог ты написать пример хотя бы для 2 карт. -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
}0pa |
23.11.2006 2:30
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Код Canvas.Ellipse(Region.CenterX-Region.Delta.X-th div 2 - 1,Region.CenterY-Region.Delta.Y-th div 2 - 1,Region.CenterX-Region.Delta.X+ th div 2,Region.CenterY-Region.Delta.Y+ th div 2); Помогите разобраться в строчке Понятно,что это эллипс, но каким же образом мы выбираем эти коордниты? -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
23.11.2006 9:14
Сообщение
#10
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Понятно,что это эллипс, но каким же образом мы выбираем эти коордниты? (Region.CenterX,Region.CenterY) - центр окружности th - ее диаметр (берется размером с высоту шрифта которым подписывать будем) th div 2 - ее радиус (деление нацело) Region.Delta - смещение координат по X и Y Геометрию то помнишь? Вместо Region :TRegion; пишешь Region :array of TRegion; Перед добавлением региона не забывай увеличить размер динамического массива: setlength(Region,length(Region)+1); Сообщение отредактировано: hiv - 23.11.2006 9:17 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
23.11.2006 12:37
Сообщение
#11
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Но не забудь, что пересчитывать Delta (относительное смещение координат карты и формы на экране) придется для каждого региона по другому. 1.Наверное, придется заносить сещение в массив? 2.К тому же, нужно нарисовать карту региона,т.е.этот район не обязательно должен находиться в левом углу формы? 3.А нельзя ли не изменять в файле имя района и райцентра, вывести на экран при считывания из файла, эти имена в норм. "русской форме"? -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
23.11.2006 16:05
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
1.Наверное, придется заносить сещение в массив? 2.К тому же, нужно нарисовать карту региона,т.е.этот район не обязательно должен находиться в левом углу формы? 3.А нельзя ли не изменять в файле имя района и райцентра, вывести на экран при считывания из файла, эти имена в норм. "русской форме"? 1. Смещение находится в объекте, поэтому заносить его в массив не надо, т.к. сами объекты уже в массиве. Возможно нужно убрать смещение из регионов, если они у тебя относительно друг друга правильно расположены, и ввести общее смещение. Его вычислять как минимальное значение из Region[i].Rect.Left по X и минимальное значение из Region[i].Rect.Top по Y. 2. см. ответ на вопрос 1. 3. Можно, тогда ищи функцию перекодировки cp866 в кодировку cp1251. На форуме точно есть. Начни с FAQ -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
26.11.2006 17:57
Сообщение
#13
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Масштаб не получается реализовать, т.е. на форме вся карта не умещаетя...Смещение для каждого района убрал и поставил для всей карты
-------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
}0pa |
27.11.2006 0:07
Сообщение
#14
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Вот этот проэкт. Вся карта не помещается на форму. Помогите организовать масштаб
Прикрепленные файлы Region.rar ( 184.18 килобайт ) Кол-во скачиваний: 158 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
27.11.2006 10:39
Сообщение
#15
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Вот этот проэкт. Вся карта не помещается на форму. Помогите организовать масштаб Добавил масштаб (чего нет проще - подели итоговые координаты на масштаб и все!) Исправил кучу нелепостей особенно с OnPaint (он должен быть связан с формой) и поиском файлов. region.rar ( 24.88 килобайт ) Кол-во скачиваний: 340 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
27.11.2006 13:54
Сообщение
#16
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
С маштабом я потом сам догадался, вспомнив про сжатие и растяжение. А вот, конечно, за поиск очередного файла с раширение КРД и за оптимизацию событийных процедур огромное спасибо!
Р.С. Помнится, вы спрашивали про 7 строчку в файле: это есть не что иное, как цвет района Region.Cvet - содержит цвет, но при его подстановки в Код Canvas.Brush.Color:=clWhite; (Canvas.Brush.Color:=Region[i].cvet;) Происходит неурядица. И вот насчет кодировки у меня ничего в голову не лезет Сообщение отредактировано: }0pa - 27.11.2006 13:55 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
27.11.2006 14:16
Сообщение
#17
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Посмотри описание объекта TColor;
Из него можно создать палитру (массив цветов), номер в которой и будет твоим номером цвета. -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
27.11.2006 14:41
Сообщение
#18
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Sorry, сам разобрался...
Код Function MyColor(c:integer):TColor; begin case c of 0:MyColor:=clBlack; 1:MyColor:=clBlue; 2:MyColor:=clGreen; 3:MyColor:=clLime; 4:MyColor:=clRed; 5:MyColor:=clSilver; 6:MyColor:=clMaroon; 7:MyColor:=clOlive; 8:MyColor:=clNavy; 9:MyColor:=clAqua; 10:MyColor:=clYellow; 11:MyColor:=clPurple; 12:MyColor:=clTeal; 13:MyColor:=clWhite; end; end; Может, немного нерациорально, но тем не менее... Тогда еще последний вопрос остается: Кодировка - считывание из файла и вывод на экран русских букв без изменения самого файла... Сообщение отредактировано: }0pa - 27.11.2006 14:43 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
hiv |
27.11.2006 14:53
Сообщение
#19
|
Профи Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: 11 |
Может, немного нерациорально, но тем не менее... Не менее, надо делать так: const MyColor:array[0..13] of TColor = (clBlack, clBlue, clGreen, clLime, Тогда еще последний вопрос остается: Кодировка - считывание из файла и вывод на экран русских букв без изменения самого файла... Это уж сам в инете найдешь - вещь распространенная. Но я бы просто все файлы данных перекодировал, чтоб не заниматься постоянной перекодировкой при их чтении, тем более что cp1251 стандартная кодировка windows с 1995 года. ЗЫ: Можно заменить номер цвета в файле данных на сам цвет в формате RGB (красный синий голубой), а потом определяй цвет для каждого региона так Region[i].color:=RGB(r,g,b); Компоненты цвета r,b,b - байты (0..255). Сообщение отредактировано: hiv - 27.11.2006 15:03 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
}0pa |
27.11.2006 20:00
Сообщение
#20
|
Пионер Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: 0 |
Не могу найти в инете ничего стоящего, Возможно это АПИ фукнции, а с ними я еще не сталкивался...
Код CharToOEM/OEMToChar Может что-нибудь это? Тогда что за тим PAnsiChar??? -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
Текстовая версия | 26.04.2024 6:40 |