
- •Содержание
- •Рекомендации к проведению лабораторных работ
- •Комментарии в тексте программы
- •Компиляция и запуск программы на выполнение
- •Переменные и константы
- •Операторы и выражения
- •Оператор присваивания
- •Арифметические операции
- •Логические операции
- •Составной оператор begin..end
- •Условный оператор if..then
- •Оператор-селектор case..of
- •Операторы обработки циклов
- •Цикл с параметром for .. do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Процедуры break и continue
- •Оператор with..do
- •Процедуры и функции
- •Процедуры
- •Функции
- •1. Фундаментальные структуры данных
- •Общее понятие типа данных
- •Простой тип
- •Перечислимые типы данных
- •Поддиапазонны
- •Строковый тип
- •Структурные типы
- •Массивы
- •Записи
- •Множества
- •Представление структур в памяти
- •Задание
- •2. Работа с последовательностями, файлы
- •Доступ к файлу
- •Операции над файлами
- •Окончание файла
- •Пример работы с файлом
- •Задание
- •3. Анализ алгоритмов
- •Рост функций
- •Задание
- •4. Простейшие методы сортировки массивов
- •Оценка алгоритмов сортировки
- •Шейкер-сортировка
- •Сортировка простыми вставками
- •Сортировка бинарными вставками
- •Задание
- •5. Улучшенные методы сортировки массивов
- •Сортировка с помощью включений с уменьшающимися расстояниями (сортировка Шелла)
- •Пирамидальная сортировка
- •Сортировка с разделением (быстрая сортировка)
- •Задание
- •6. Сортировка последовательных файлов
- •Сортировка простым слиянием
- •Естественное слияние
- •Задание
- •7. Рекурсивные алгоритмы
- •Сравнение рекурсии и итерации
- •Задание
- •8. Динамические структуры данных, связные списки
- •Списки
- •Пример создания и заполнения списка
- •Задание
- •9. Нелинейные структуры данных
- •Граф
- •Бинарное дерево
- •Задание
- •10. Алгоритмы на графах
- •Алгоритмы обхода в глубину и по уровням
- •Построение минимального остовного дерева
- •Поиск кратчайшего пути
- •Задание
- •11. Поиск данных
- •Двоичный (бинарный) поиск элемента в массиве
- •Интерполяционный поиск элемента в массиве
- •Алгоритм Бойера-Мура
- •Задание
- •12. Хеширование
- •Отечественный стандарт хеширования
- •Создание хеш-функции
- •Хеш-функции для строковых значений, алгоритм Гонера
- •Задание
- •13. Методы сжатия текстовых данных
- •Метод “Running”
- •Словарные методы сжатия
- •Алгоритм Хаффмана
- •Задание
- •14. Алгоритмы вывода графических примитивов
- •Рисование отрезка
- •Прямое вычисление координат
- •Инкрементный алгоритм Брезенхэма
- •Простейший алгоритм закрашивания замкнутой области
- •Задание
- •15. Псевдослучайные последовательности
- •Метод середин квадратов
- •Линейный конгруэнтный метод
- •Генератор псевдослучайных чисел, поставляемый с системой
- •Оценка качества генератора ПСП
- •Задание
- •16. Параллельные алгоритмы
- •Пример многопоточного приложения
- •Задание
- •Задание на СКР
- •Вариант 1. Клеточные автоматы
- •Вариант 2. Раскрашивание карты
- •Вариант 3. Крисс-кросс
- •Вариант 4. Лабиринт
- •Список использованной литературы
- •Приложение A. Справочник по функциям Delphi
- •Операции с порядковыми типами
- •Математические функции и процедуры
- •Генерация псевдослучайного числа
- •Преобразование типов данных
- •Работа с памятью
- •Приложение Б. Компонент-сетка TStringGrid
- •Приложение В. Компонент-диаграмма TChart
- •Приложение Д. Элементарный поток – класс TThread

69
критерий ошибки Брезенхема используется для принятия решения об изменении величины x. Выбор постоянно изменяющейся (на +1 или -1) координаты зависит от квадранта (см. рис. 14.6).
Y
Увеличение X на 1 Уменьшение X на 1 Увеличение Y на 1 Увеличение Y на 1
x = x −1 |
x = x +1 |
y = y +1 |
y = y +1 |
|
x = x −1 |
x = x +1 |
X |
|
|
||
|
y = y −1 |
y = y −1 |
|
Уменьшение X на 1 |
|
|
Увеличение X на 1 |
Уменьшение Y на 1 |
|
|
Уменьшение Y на 1 |
|
|
|
|
|
|
|
|
Рисунок 14.6. – Особенности обработки отрезков в разных квадрантах
Простейший алгоритм закрашивания замкнутой области
На лабораторной работе мы рассмотрим простейший алгоритм заливки замкнутой области, которая либо очерчена границей с кодом пикселя, отличающимся от кодов любых пикселей внутри области, либо закрашена пикселями с заданным кодом.
Рисунок 14.7. – Демонстрация алгоритма построчного заполнения |

70
В таком случае нам подойдёт алгоритм построчного заполнения. Идея основана на том, что соседние пиксели в строке скорее всего одинаковы и меняются только там где строка пересекается с ребром многоугольника.
Алгоритм представляет собой цикл вдоль оси Y, в ходе цикла выполняется поиск точек пересечения линии контура с соответствующими горизонталями (см. рис. 14.7):
1.Найти самую нижнюю и самую верхнюю вершины.
2.Выполнить цикл от Y=Y min до Y max:
a.Нахождение точек xi пересечения всех отрезков контура с горизонталью. Координаты этих точек занести в массив.
b.Сортировка массива точек по возрастанию x.
c.Вывод горизонтальных отрезков с координатами (x0 , y)−(x1 , y).
Задание
1.Разработайте функцию позволяющую чертить произвольный отрезок на основе прямого вычисления координат.
2.Разработайте функцию позволяющую чертить произвольный отрезок на основе инкрементного алгоритма Брезенхэма.
3.Разработайте функцию позволяющую закрашивать произвольную замкнутую область.
Для рисования замкнутой области можно воспользоваться методами Delphi. Прямоугольник выводит процедура:
procedure Rectangle(Left, Top ,Right ,Bottom: Integer);
Эллипс чертит процедура:
procedure Ellipse(Left, Top ,Right ,Bottom: Integer);
Произвольный многоугольник с любым числом вершин:
procedure Polygon(Points: array of TPoint);
Например, многоугольник с пятью вершинами можно нарисовать с помощью следующего кода:
var Arr : array [0..4] of TPoint; begin
Arr[0]:=Point(10,10); Arr[1]:=Point(20,10); Arr[2]:=Point(120,45); Arr[3]:=Point(120,200); Arr[4]:=Point(45,50); Form1.Canvas.Polygon(Arr);
end;