Здравствуйте, Гость
Вторник, 21.11.2017, 04:46
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: Admin 
Форум » Все о Delphi » Графика и игры » Графика 2D в Delphi
Графика 2D в Delphi
madinДата: Суббота, 04.07.2009, 23:40 | Сообщение # 1
Ранг 1
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Всем привет!
Необходимо разработать программу, в которой будет изображена карта города (дорожная сеть). По дорогам будут передвигаться автомобили. Карта должна масштабироваться, а также поддерживать полосу прокрутки. Автомобили должны двигаться с реальной скоростью.
Пробовал делать с помощью рисования графики на канве. Качество очень низкое + стандартный таймер работает с дикой задержкой, погрешность вычеслений недопустимая:(

Вопрос: с помощью каких технологий это можно реализовать в Delphi?

 
AdminДата: Воскресенье, 05.07.2009, 10:44 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Ну незнаю как уж вы там делали, я делал без всяких таймеров и точность у меня должна быть куда выше (чертеж). Перерисовывал только нужную мне видимую часть изображения, и только когда я изменял масштаб, или перемещался по чертежу. Использовал только LineTo(), MoveTo(), и рисование элипса. Рисовалось отлично, масштабировалось.
И еще вопрос, вы прямо сразу на канве которая отображается рисуете? Без использования буфера?

С масштабом все просто, заводим переменную вещественного типа, и просто все размеры домножаем на нее. (100% = 1, 50% = 0,5 и так далее).
Насчет движения автомобилей будет посложнее, ведь дороги могут быть под разными углами. Ну а реальную скорость нужно вычислить.


Не оказываю помощь через личные сообщения и ICQ
 
madinДата: Суббота, 11.07.2009, 18:22 | Сообщение # 3
Ранг 1
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
>>И еще вопрос, вы прямо сразу на канве которая отображается рисуете? Без использования буфера?
Да, без использования буфера. Чем предпочтительней использовать буфер? Можете дать ссылку на пример использования буфера?

Вот как построено рисование у меня.
На форму размешаю объект Image.
Создаю таймер, в коде которого прописываю:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Стирает
Image1.Canvas.Brush.Color :=clWhite;
Image1.Canvas.Rectangle(i-10,30,i+20,40);
// Рисует
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.Rectangle(i,30,i+20,40);
i:=i+3;
if i>500 then Timer1.Enabled:=false;
end;

Таким образом на экране прорисовывается прямоугольник размером 20х10 пикселей.
Прямоугольник двигается вперед, за счет срабатывания таймера.
Чтобы задать реальную скорость движения и реальные габариты автомобиля примем следующее:
1. 5 пикселей = 1 метру (если автомобиль 4х2 метра, то на экране это прямоугольник размером 20х10 пкс).
2. Чтобы автомобиль ехал со скоростью 10 м/с (36 км/ч), нужно ежесекундно сдвигать автомобиль на 50 пикселей, чтобы движение было плавным будем сдвигать каждые 1/10 секунды на 5 пикселей.
Чтобы отсчитывать интервалы равные 1/10 секунды можно применить Timer, для этого свойство Interval устанавливаем равным 100 миллисекундам.

Вроде бы все хорошо, НО таймер интервал отсчитывает НЕВЕРНО sad Когда в реальности проходит минута, таймер успевает отсчитать только 55 секунд. В итоге скорость движения автомобиля на экране не совпадает с тем что происходит в реальности.

Что предложите использовать вместо таймера, чтобы точность вычисления временных интервалов была высокой?

 
DigyДата: Суббота, 11.07.2009, 19:35 | Сообщение # 4
Ранг 3
Группа: Проверенные
Сообщений: 71
Награды: 0
Репутация: 1
Статус: Offline
таймер считает правильно, он считает время между срабатываниями, но не считает то время, которое тратится на выполнение процедуры "TForm1.Timer1Timer(Sender: TObject);". Чтобы точность была приемлимой, нужно: 1) создать переменную тима Tbitmap и рисовать на ней, а потом делать вывод на Image(если не хватает, есть более скоростные методы вавода); 2) уменьшить количество действий в прощедуре обработки таймера, или создать еще один таймер, для точного отсчета времени.

><))'>
 
madinДата: Воскресенье, 12.07.2009, 15:22 | Сообщение # 5
Ранг 1
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
>>если не хватает, есть более скоростные методы вавода

Подскажите, какие именно?

 
DigyДата: Понедельник, 13.07.2009, 14:07 | Сообщение # 6
Ранг 3
Группа: Проверенные
Сообщений: 71
Награды: 0
Репутация: 1
Статус: Offline
статья про рисование в оперативе тут, статья по DelphiX тут

><))'>
 
Форум » Все о Delphi » Графика и игры » Графика 2D в Delphi
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz