|
Старые проекты от автора
Содержание
Азы фрактального сжатия
Приложение выполняет фрактальное сжатие / распаковку изображений с помощью
классического алгоритма. Основой приложения является компонент TFractal. Скачать исходники
программы вместе с запускаемым модулем вы можете здесь (600 Кбайт).
А здесь (900 Кбайт) вы
найдете методические узакания по фрактальному сжатию, и сможете глубоко вникнуть в
суть работы алгоритма. Также здесь приведены масса иллюстраций, демонстрирующих
возможности фрактального сжатия.
Следопыт
Приложение находит кратчайший путь в любом лабиринте. Для поиска используется
метод, придуманный и реализованный лично мною.
Отличительные особенности метода:
- Высокая скорость поиска. Его можно использовать в компьютерных играх
в режиме реального времени.
- В отличие от большинства других методов, которые просто определяют наличие
пути, данный метод почти всегда отыскивает кратчайший путь.
Описание метода:
С помощью модуля FindPath.pas вы можете найти кратчайший путь между двумя точками на карте. Алгоритм, используемый в данном модуле, предполагает, что на карте (игровой карте) существуют проходимые и непроходимые зоны. Карта - матрица любых размеров. Элементы матрицы - зоны или области (проходимые или непроходимые). Кратчайший путь между заданными точками - сформированный программой список координат проходимых областей.
Весь алгоритм находится в классе TFindPath. Класс абсолютно независимый от основной программы, поэтому систему поиска пути можно подключить к любому проекту.
Матрица карты содержит элементы Boolean, хотя она имеет формат массива Matrix (эта возможность появляется благодаря использованию свойств в классе). Проходимые зоны имеют значение False, а непроходимые - True.
Используемый алгоритм работает очень быстро и успешно справляется с картами, имеющими миллионы элементов. В случае, если карта имеет размер порядка 10000 элементов, время поиска кратчайшего пути составляет всего несколько миллисекунд.
Алгоритм поиска работает следующим образом: сначала вызывается функция поиска прямолинейного пути, которая в одно мгновение определяет, есть ли такой путь или нет. Если прямолинейного пути нет, то запускается алгоритм поиска ключевой точки: в цикле просматриваются все точки, прилегающие к начальной и конечной точке, после просмотра они помечаются и просматриваются все точки, прилегающие к этим помеченным точкам. Все точки, прилегающие к начальной точке (а также все точки, прилегающие к ним), помечаются одним числом, а для конечной точки используется другое число. Благодаря такой разметке, как только мы обнаруживаем точку, помеченную противоположным число, считаем ее ключевой. При следующей итерации эта ключевая точка будет считаться начальной (или конечной). Все ключевые точки включаются в состав кратчайшего пути. В самом конце происходит оптимизация найденного пути, благодаря которой исключаются лишние элементы пути.
Для использования алгоритма поиска пути вы должны выполнить следующие шаги:
- Объявить переменную типа TFindPath (var FP: TFindPath);
- Инициализировать объект FP (FP := TFindPath.Create(100, 50)). При создании объекта автоматически создается матрица карты указанных размеров. Она имеет только нулевые элементы.
- Скопировать карту в матрицу. В вашей программе карта может храниться в каком угодно формате. Допустим карта храниться в массиве, объявленном следующим образом:
var
MapArray: array[1..100, 1..50] of Record
Color: TColor; // Цвет области
Heigth: Single; // Высота
..............
Wall: Boolean; // Препятствие
end;
В этой записи нас интересует только переменная Wall, указывающая на наличие препятствия. Скопировать карту в матрицу можно следующим образом:
for i := 1 to 100 do
for j := 1 to 50 do
FP.Map[i, j] := MapArray[i, j].Wall;
- Выполнить поиск пути (if FP.Find(1, 1, 50, 50) then ShowMessage('Путь найден')). Функция Find() является основной в классе TFindPath. В случае, если путь найден, функция вернет True.
- Считать точки найденного пути из списка PathList. Необходимо учитывать, что в этом списке присутствуют начальная и конечная точки, которые мы передали в функцию Find(). Кроме того, вы можете узнать время поиска. Для этого нужно считать значение переменной SearchTime.
Вы можете хранить карты в файлах, а также загружать их из файлов. Для этого используются соответственно функции SaveMapToFile() и LoadMapFromFile().
Примечание: В алгоритме поиска задействован класс TList для хранения указателей на структуры TPoint. Для оптимизации можете разработать свой собственный список. Для компиляции необходим дополнительный модуль matrix.pas
|
Конвертер кода Delphi в HTML
Полезная программка для тех, кто программирует в Delphi и хочет опубликовать
свои исходники в формате HTML
А вот пример кода, форматированного с помощью этой утилиты (тэги смотрите на рисунке):
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
|
Утилита разработана на основе модуля DelphiToHTML.pas, включенного
в архив. Она может выделять различным шрифтом следующие сущности:
- Числа
- Строки
- Зарезервированные слова
- Комментарии
- Директивы компилятора
В окне настроек вы можете вручную установить открывающие и закрывающие теги
для каждой из сущностей.
Примечание: утилита не выполняет грамматический анализ кода программы,
поэтому одно и то же слово в любом месте программы будет интерпретироваться одинаково.
Например, директива write жирным шрифтом выделена никогда не будет.
В отличие от многих других программ подобного рода, данная утилита генерирует готовый
html-код, который сразу можно включить в любое место HTML-страницы.
MenuReader
Приложение демонстрирует возможности модуля для динамического формирования
пунктов меню MenuReader.pas. Пункты меню описываются в xml-файле и считываются
с помощью механизма, реализованного в стандартной библиотеке msxml.dll.
Формат xml очень удобен и нагляден, поэтому он и был выбран в целях описания пунктов меню.
Вот пример такого файла:
<?xml version="1.0" encoding="Windows-1251"?>
<menuitems>
<item caption="Администрирование Windows">
<item caption="Утилита администрирования">
<command>Calc</command>
</item>
<item caption="Дефрагментация">
<command>dfrg.msc</command>
</item>
<item caption="Спящий режим">
<command>rundll32.exe</command>
<params>powrprof.dll,SetSuspendState</params>
</item>
<item caption="Перезагрузка">
<command>shutdown</command>
<params>-r -t 0</params>
</item>
<item caption="Залочить Windows">
<command>rundll32.exe</command>
<params>user32.dll,LockWorkStation</params>
</item>
</item> <!-- Администрирование Windows -->
</menuitems>
|
Каждый пункт меню может описываться с помощью следующих данных
- Название пункта меню;
- Имя запускаемого файла или команды;
- Имя файла с иконкой (*.exe, *.dll, *.ico) и индекс иконки;
- Набор параметров, передаваемых по умолчанию, и индекс набора;
Величина вложенности пунктов меню не ограничивается. Вы можете назначать собственные обработчики выбора пунктов меню (по умолчанию выполняется подпрограмма ShellExecute()).
Информацию по описанию пунктов меню смотрите в файле MenuEx.xml.
Пример работы с модулем:
AddItemsToMenu(MainMenu1.Items, 'MainMenu.xml');
AddItemsToMenu(PopupMenu1.Items, 'PopupMenu.xml');
AddItemsToMenu(MainMenu1.Items.Find('Файл'), 'FileMenu.xml');
|
Редактор двоичных файлов
Данное приложение, помимо того, что позволяет изменить значение любого байта
в двоичном файле, обладает возможностью поиска заданной информации (текстовой или
шестнадцатиричной). Программа писалась давно, поэтому за качество кода прошу не пинать :)
|