Оглавление
Введение________________________________________________________2
1.Теоретическая часть
1.1.Компьютерная графика______________________________________4
1.2. Растровая графика______________________________________5
1.3.Векторная графика _________________________________________ 8
1.4 Алгоритмывычерчивания отрезков____________________________ 9
2. Алгоритмы генерацииотрезков
2.1. ЦифровойДифференциальный анализатор_____________________ 11
2.2. АлгоритмБрезенхема_______________________________________13
3. Описаниепрограммы
3.1.Описание интерфейса_______________________________________ 16
3.2.Описание логической структуры______________________________ 17
Заключение______________________________________________________ 18
Литература______________________________________________________ 19
Приложение_____________________________________________________ 20
Введение
В современном миремашинная графика находит самое широкое применение в различных областях науки итехники, промышленности, в экономике, управлении, обучении. Выделим важнейшиеобласти применения машинной графики:
Автоматизацияпроектно-конструкторских работ (САПР). Это традиционная область применения, скоторой начиналось использование машинной графики.
Автоматизация научныхисследований (АСНИ).
Графические информационныепозволяют получать высококачественные тополого-геодезические, географическиекарта, карты для бурения, погодные карты и т.п.
Автоматизация процессов обучения.
Издательскаядеятельность, реклама, компьютерные игры, мультипликация.
В зависимости отвозможности изменения получаемого изображения машинная графика подразделяетсяна пассивную и активную. Под пассивной машинной графикой подразумевается способполучения изображения на каком-либо носителе без возможности его динамическогоизменения. Интерактивная машинная графика позволяет динамически управлятьсодержанием изображения, его формой, размерами и цветом с помощью интерактивныхустройств взаимодействия ( клавиатуры, мыши, джойстика и т.п. ). Интерактивнаямашинная графика стала стандартной формой связи человека и компьютера.
Объектом исследования в нашей работе будут являться методы генерации отрезков.
Цельнашей работы – рассмотреть методы генерации отрезков, выделить ихосновные характеристики, сделать вывод об их эффективности, быстродействии.
Для достижения поставленной цели определеныследующие задачи:
1. На основе анализа литературы рассмотреть алгоритмы генерации отрезков, выделить их достоинства инедостатки.
2. Разработать приложение, реализующее три метода генерации отрезкови создающее все условия для работы с данными алгоритмами
3.Продемонстрировать различные алгоритмы генерации отрезков.
4.Сравнить быстродействие используемых алгоритмов.
5. Сделать вывод об эффективностиразличных алгоритмов генерации отрезков.
Методыисследования: теоретический, экспериментальный.
В данной программе реализованнотри алгоритма вычерчивания отрезков: Цифровой дифференциальный анализатор(ЦДА), алгоритм Брезенхема и процедуру LineTo.
1. Теоретическая часть1.1. Компьютерная графика
Различают три видакомпьютерной графики: растровая графика, векторная графика и фрактальнаяграфика. Они отличаются принципами формирования изображения при отображении наэкране монитора или при печати на бумаге.
Растровую графику применяютпри разработке электронных (мультимедийных) и полиграфических изданий.Иллюстрации, выполненные средствами растровой графики, редко создают вручную спомощью компьютерных программ. Для этой цели сканируют иллюстрации,подготовленные художником на бумаге, или фотографии. В последнее время дляввода растровых изображений в компьютер нашли широкое применение цифровые фото-и видеокамеры. В Интернете пока применяются только растровые иллюстрации.
Программные средства дляработы с векторной графикой, наоборот, предназначены для создания иллюстраций ив меньшей степени для их обработки. Такие средства широко используют врекламных агентствах, дизайнерских бюро, редакциях и издательствах.Оформительские работы, основанные на применении шрифтов и простейшихгеометрических элементов, решаются средствами векторной графики проще. Имеютсяпримеры высокохудожественных произведений, созданных средствами векторнойграфики, но они скорее исключение, чем правило.
Программные средства дляработы с фрактальной графикой предназначены для автоматической генерацииизображений путем математических расчетов. Создание фрактальной художественнойкомпозиции состоит не в рисовании или оформлении, & в программировании.Фрактальную графику чаще используют в развлекательных программах.
1.2 Растровая графика
В растровой графикеосновным элементом является точка. При экранном изображение эта точканазывается пикселем.
Основная проблема инедостаток при использовании растровых изображений — это большие объемы данных.Для работ с большеразмерными иллюстрациями типа журнальной полосы требуютсякомпьютеры с большими размерами оперативной памяти (128 Мбайт и более). Такиекомпьютеры, естественно, должны при этом иметь и высокопроизводительныепроцессоры.
Вторым недостаткомрастровых изображений является невозможность их увеличения для рассмотрениядеталей. Так как изображение состоит из точек, то увеличение изображенияприводит только к тому, что эти точки становятся крупнее. Никакихдополнительных деталей при увеличении растрового изображения рассмотреть неудается. Само увеличение точек растра визуально искажает иллюстрацию и делаетее грубой. Этот эффект называется пикселизацией.
Любое изображение, в томчисле и трехмерное, состоит из графических примитивов, поэтому необходимо знатьспециальные методы генерации изображения, вычерчивание прямых и кривых линий,закраски многоугольников, создающей впечатление сплошных объектов. Рассмотримнекоторые из этих методов.
Алгоритмы вычерчиванияотрезков. Экран дисплея можно рассматривать как матрицу дискретных элементов(пикселей), каждый из которых может быть подсвечен. В связи с этим нельзянепосредственно провести отрезок из одной точки в другую. Процесс определенияпикселей, наилучшим образом аппроксимирующих заданный отрезок, называетсяразложением в растр. Для горизонтальных, вертикальных и наклоненных под углом45° отрезков выбор растровых элементов очевиден. При любой другой ориентациивыбрать нужные пиксели труднее. Существует несколько алгоритмов выполняющих этузадачу, например, цифровой дифференциальный анализатор и алгоритм Брезенхема.
Алгоритм Брезенхема длягенерации окружностей. В растр нужно разлагать не только линейные, но и другие,более сложные функции. Разложению конических сечений, т.е. окружностей,эллипсов, парабол, гипербол, посвящено значительное число работ. Наибольшеевнимание уделено окружности. Один из наиболее эффективных и простых дляпонимания алгоритмов генерации окружности принадлежит Брезенхему.
Вначале необходимосгенерировать только одну восьмую часть окружности. Остальные ее части могутбыть получены последовательными отражениями. Если сгенерирован первый октант(от 0° до 45° против часовой стрелки), то второй октант можно получитьзеркальным отражением относительно прямой у = х, что дает в совокупности первыйквадрант. Первый квадрант отражается относительно прямой х = 0 для получениясоответствующей части окружности во втором квадранте. Верхняя полуокружностьотражается относительно прямой у = О для завершения построения.
Растровая разверткасплошных областей. Возможность представления сплошных областей в растровомграфическом устройстве является его уникальной характеристикой. Генерациясплошных областей из простых описаний ребер или вершин называется растровойразверткой сплошных областей, заполнением многоугольников или заполнениемконтуров. Для этого можно использовать несколько методов, которые обычноделятся на две широкие категории: растровая развертка и затравочное заполнение.
В методах растровойразвертки пытаются определить в порядке сканирования строк, лежит ли точкавнутри многоугольника или контура. Эти алгоритмы обычно идут от«верха» многоугольника или контура к «низу».
В методах затравочногозаполнения предполагается, что известна некоторая точка (затравка) внутризамкнутого контура. В алгоритмах ищут точки, соседние с затравочной ирасположенные внутри контура. Если соседняя точка расположена не внутри,значит, обнаружена граница контура. Если же точка оказалась внутри контура, тоона становится новой затравочной точкой и поиск продолжается рекурсивно.
Растровая разверткамногоугольников. Можно разработать эффективный метод растровой разверткимногоугольников, если воспользоваться тем фактом, что соседние пиксели,вероятно, имеют одинаковые характеристики (кроме пикселов граничных ребер). Этосвойство называется пространственной когерентностью.
Алгоритм с упорядоченнымсписком ребер. Используя эти методы, можно разработать эффективные алгоритмырастровой развертки сплошных областей, называемые алгоритмами с упорядоченнымсписком ребер. Эффективность этих алгоритмов зависит от эффективностисортировки.
Алгоритм заполнения поребрам. Алгоритм, использующий список ребер и флаг, является двухшаговым.Первый шаг состоит в обрисовке контура, в результате чего на каждой сканирующейстроке образуются пары ограничивающих пикселов. Второй шаг состоит в заполнениипикселов, расположенных между ограничивающими.
Алгоритмы заполнения сзатравкой. В рассмотренных алгоритмах заполнение происходит в порядкесканирования. Иной подход используется в алгоритмах заполнения с затравкой. Вних предполагается, что известен хотя бы один пиксель из внутренней областимногоугольника. Алгоритм пытается найти и закрасить все другие пиксели,принадлежащие внутренней области. Области могут быть либо внутренние, либогранично-определенные. Если область относится к внутренне-определенным, то всепиксели, принадлежащие внутренней части, имеют один и тот же цвет илиинтенсивность, а все пиксели, внешние по отношению к области, имеют другойцвет. Если область относится к гранично-определенным, то все пиксели на границеобласти имеют выделенное значение или цвет. Алгоритмы, заполняющиевнутренне-определенные области, называются внутренне-за-полняющими, а алгоритмыдля гранично-определенных областей — гранично-заполняющими.
1.3 Векторная графика
Как в растровой графикеосновным элементом изображения является точка, так в векторной графике основнымэлементом изображения является линия, при этом не важно, прямая это линия иликривая.
В растровой графике тожесуществуют линии, но там они рассматриваются как комбинации точек. Для каждойточки линии в растровой графике отводится одна или несколько ячеек памяти (чембольше цветов могут иметь точки, тем больше ячеек им выделяется).Соответственно, чем длиннее растровая линия, тем больше памяти она занимает. Ввекторной графике объем памяти, занимаемый линией, не зависит от размеровлинии, поскольку линия представляется в виде формулы, а точнее говоря, в виденескольких параметров. Чтобы ни делали с этой линией, меняются только еепараметры, хранящиеся в ячейках памяти. Количество же ячеек остается неизменнымдля любой линии.
Линия — это элементарныйобъект векторной графики. Все, что есть в векторной иллюстрации, состоит излиний. Простейшие объекты объединяются в более сложные, например, объектчетырехугольник можно рассматривать как четыре связанные линии, а объект кубеще более сложен: его можно рассматривать либо как двенадцать связанных линий,либо как шесть связанных четырехугольников. Из-за такого подхода векторнуюграфику часто называют объектно-ориентированной графикой.
Объекты векторной графикихранятся в памяти в виде набора параметров, но надо помнить о том, что на экранвсе изображения все равно выводятся в виде точек. Перед выводом на экранкаждого объекта программа производит вычисления координат экранных точек визобра жении объекта, поэтому векторную графику иногда называют вычисляемойграфикой. Аналогичные вычисления производятся и при выводе объектов на принтер.
Как и все объекты, линииимеют свойства. К этим свойствам относятся: форма линии, ее толщина, цвет,характер линии (сплошная, пунктирная и т.п.). Замкнутые линии имеют свойствозаполнения. Внутренняя область замкнутого контура может быть заполнена цветом,текстурой, картой. Простейшая линия, если она не замкнута, имеет две вершины,которые называются узлами. Узлы тоже имеют свойства, от которых зависит, каквыглядит вершина линии и как две линии сопрягаются между собой.
1.4 Алгоритмы вычерчивания отрезков
Поскольку экранрастрового дисплея с электронно-лучевой трубкой (ЭЛТ) можно рассматривать какматрицу дискретных элементов (пикселов), каждый из которых может бытьподсвечен, нельзя непосредственно провести отрезок из одной точки в другую.Процесс определения пикселов, наилучшим образом аппроксимирующих заданныйотрезок, называется разложением в растр. В сочетании с процессом построчнойвизуализации изображения он известен как преобразование растровой развертки.Для горизонтальных, вертикальных и наклоненных под углом 45° отрезков выборрастровых элементов очевиден. При любой другой ориентации выбрать нужныепикселы труднее, что показано на рис. 1.1.
Рис. 1.1 Разложение в растр отрезков прямых
Прежде чем приступать кобсуждению конкретных алгоритмов рисования отрезков, полезно рассмотреть общиетребования к таким алгоритмам и определить желаемые характеристики изображения.Очевидно, что отрезки должны выглядеть прямыми, начинаться и заканчиваться взаданных точках. Яркость вдоль отрезка должна быть постоянной и не зависеть отдлины и наклона. Наконец, рисовать нужно быстро. Как это часто бывает, не всеиз перечисленных критериев могут быть полностью удовлетворены. Сама природарастрового дисплея исключает генерацию абсолютно прямых линий (кроме рядаспециальных случаев), равно как и точное совпадение начала и конца отрезка сзаданными точками. Тем не менее при достаточно высоком разрешении дисплея можнополучить приемлемое изображение.
Постоянная вдоль всегоотрезка яркость достигается лишь при проведении горизонтальных, вертикальных инаклоненных под углом 45 ° прямых. Для всех других ориентации разложение врастр приведет к неравномерной яркости, как это показано на рис. 2.1. Даже длячастных случаев яркость зависит от наклона: заметим, например, что расстояниемежду центрами соседних пикселов для отрезка под углом 45° больше, чем длявертикальных и горизонтальных прямых. Поэтому вертикальные и горизонтальныеотрезки будут выглядеть ярче, чем наклонные. Обеспечение одинаковой яркостивдоль отрезков разных длин и ориентации требует извлечения квадратного корня, аэто замедлит вычисления. Обычным компромиссом является нахождение приближеннойдлины отрезка, сведение вычислений к минимуму, предпочтительное использованиецелой арифметики, а также реализация алгоритмов на аппаратном или микропрограммномуровне.
2 Алгоритмы генерации отрезков
2.1 Цифровой Дифференциальный анализатор
Один из методовразложения отрезка в растр состоит в решении дифференциального уравнения,описывающего этот процесс. Для прямой линии имеем
Решение представляется ввиде
где x1, y1 и x2, y2 — концы разлагаемого отрезка и yi — начальное значение для очередного шага вдольотрезка. Фактически уравнение [1] представляет собой рекурентное соотношениедля последовательных значений y вдоль нужного отрезка. Этот метод, используемыйдля разложения в растр отрезков, называется цифровым дифференциальныманализатором (ЦДА). Впростом ЦДА либо Dx, либо Dy (большее из приращений)выбирается в качестве единицы растра. Ниже приводится простой алгоритм,работающий во всех квадрантах:
Процедура разложения в растр отрезка по методу цифрового дифференциальногоанализатора (ЦДА)
предполагается, что концыотрезка (x1, y1) и (x2, y2) не совпадают
Integer — функцияпреобразования вещественного числа в целое.
Sign — функция,возвращающая -1, 0, 1 для отрицательного, нулевого и положительного аргументасоответственно
аппроксимируем длинуотрезка
ifabs(x2 — x1) >= abs(y2 — y1) then
Длина= abs(x2 — x1) else
Длина= abs(y2 — y1) end
полагаем большееиз приращений x или y равными единице растра
x = (x2 — x1) // Длина
y = (y2 — y1) // Длина
округляемвеличины, а не отбрасываем дробную часть
использованиезнаковой функции делает алгоритм пригодным для всех квадрантов
x = x1 + 0.5 * Sign(x)
y = y1 + 0.5 * Sign(y)
начало основногоцикла
i =1
while (i
выводточкиPutPixel(Integer(x),Integer(y))
x = x + x
y = y + y
i = i + 1
end
2.2 Алгоритм Брезенхема
В 1965году Брезенхеймом был предложен простой целочисленный алгоритм для растровогопостроения отрезка. Алгоритмвыбирает оптимальные растровые координаты для представления отрезка. В процессеработы одна из координат — либо x, либо у (в зависимости от углового коэффициента) —изменяется на единицу. Изменение другой координаты (либо на нуль, либо наединицу) зависит от расстояния между действительным положением отрезка иближайшими координатами сетки. Такое расстояние мы назовем ошибкой.
Алгоритм построен так,что требуется проверять лишь знак этой ошибки. На рис. 1.2 это иллюстрируетсядля отрезка в первом октанте, т. е. для отрезка с угловым коэффициентом,лежащим в диапазоне от нуля до единицы. Из рисунка можно заметить, что еслиугловой коэффициент отрезка из точки (0, 0) больше чем 1/2, то его пересечениес прямой х = 1 будет расположено ближе кпрямой у = 1, чем к прямой у = 0. Следовательно, точка растра (1, 1) лучшеаппроксимирует ход отрезка, чем точка (1, 0). Если угловой коэффициент меньше1/2, то верно обратное. Для углового коэффициента,
Рис. 1.2 Основная идея алгоритма Брезенхема
равного 1/2, неткакого-либо предпочтительного выбора. В данном случае алгоритм выбирает точку(1, 1).
Рис. 1.3 График ошибки в алгоритме Брезенхема
Не все отрезки проходятчерез точки растра. Подобная ситуация иллюстрируется рис. 1.3, где отрезок стангенсом угла наклона 3/8 сначала проходит через точку растра (0, 0) ипоследовательно пересекает три пиксела. Также иллюстрируется вычисление ошибкипри представлении отрезка дискретными пикселами. Так как желательно проверятьтолько знак ошибки, то она первоначально устанавливается равной —1/2. Такимобразом, если угловой коэффициент отрезка больше или равен 1/2, то величинаошибки в следующей точке растра с координатами (1,0) может быть вычислена как
е = е + m
где m— угловой коэффициент. В нашемслучае при начальном значении ошибки —1/2
е = -1/2+ 3/8 = -1/8
Так как е отрицательно,отрезок пройдет ниже середины пиксела. Следовательно, пиксел на том же самомгоризонтальном уровне лучше аппроксимирует положение отрезка, поэтому у неувеличивается. Аналогично вычисляем ошибку
е = -1/8 + 3/8 = 1/4
в следующей точке растра(2, 0). Теперь е положительно, а значит, отрезок пройдет выше средней точки.Растровый элемент (2, 1) со следующей по величине координатой у лучшеаппроксимирует положение отрезка. Следовательно, у увеличивается на единицу. Преждечем рассматривать следующий пиксел, необходимо откорректировать ошибкувычитанием из нее единицы. Имеем
е = 1/4- 1 = -3/4
Заметим, что пересечениевертикальной прямой х = 2 с заданным отрезком лежит на 1/4 ниже прямой y= 1. Если же перенести отрезок 1/2вниз, мы получим как раз величину -3/4. Продолжение вычислений для следующегопиксела дает
e= — 3/4 + 3/8 =- 3/8
Так как eотрицательно, то.у неувеличивается. Из всего сказанного следует, что ошибка — это интервал,отсекаемый по оси у рассматриваемым отрезком в каждом растровом элементе(относительно —1/2).
3. Описание программы3.1.Описание интерфейса
Реализация каждого методагенерации отрезков проводилась в среде объектно-ориентированногопрограммирования Delphi7. Поставлена задача запрограммировать алгоритмы генерацииотрезков, создать форму для ввода данных и вывода результата.
Для каждого из трехалгоритмов создается окно приложения (рис. 1.4).
Рис. 1.4.Внешний вид окна приложения
В итоге создано приложениеWindows.
На форме расположены:
1. Триполя, на которых будет отображаться результат построения отрезков для каждогометода в отдельности.
2. Поле«Ввод количества линий» служит для ввода количества линий, которые будутсгенерированы генератором случайных чисел.
3. Триполя «время», на которых отображается время построения отрезков для каждогометода в отдельности.
Рис.3.2 Результат работыприложения3.2. Описание логической структуры
В проект добавлены компоненты Form1 – главная форма. На главной формеразмещаются компоненты: Image– окно для вывода линий, Panel– панель для вывода времени,затраченного на генерацию отрезков, Edit1 – окошечко для ввода количествалиний, которые будут сгенерированы генератором случайных чисел и Button– кнопка для подтверждения вводаколичества линий / для очистки компонента Imageи сброса всех настроек. Label– показывает числопостроенных линий
Заключение
Заканчивая наш обзорметодов генерации отрезков, попытаемся сравнить их эффективность.
1. Метод Брезенхема определеннонаихудший из всех сравниваемых, этот алгоритм обладает очень плохими временнымихарактеристиками. Он имеет только учебно-исторический интерес и не может бытьрекомендован для практического использования.
2. Алогритм Цифрового ДифференциальногоАнализатора в среднем (в зависимости от количества введенных линий) лучше, чемметод Брезенхема. По сравнению с методом Брезенхема метод ЦДА в большинствеслучаев может оказаться более быстрым.
3. Процедура LineToоказалась самой быстрой ирезультативной из всех трех алгоритмов
В данной работе рассмотренынекоторые простые и улучшенные методы генерации отрезков: Брезенхема, ЦифровогоДифференциального Анализатора и стандартной процедуры LineTo. Мы оценили сложность этих алгоритмовгенерации. Алгоритмы этих методов представлены в виде программ. Так же былапроанализирована скорость, эффективность использования того или иного видагенерации отрезков.
Целью данной курсовойработы было исследование и сравнение трех наиболее эффективных алгоритмов генерацииотрезков: Брезенхема, Цифрового Дифференциального Анализатора и стандартнойпроцедуры LineTo. Поставленная цель была достигнута.
Списоклитературы
1. П.В.Вельтмандер«Машинная графика» Издательский дом «Вильямс», 2000.
2. информация с сайта alglib.sources.ru
3. информация с сайта joinbiz.ru
4. информация с сайта kladovka.net.ru
5. информация с сайта Mini-Soft.ru
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils,Variants, Classes, Graphics, Controls, Forms,
Dialogs,Math, StdCtrls,ExtCtrls, Menus, ToolWin, ComCtrls, ExtDlgs,
ImgList;
type
TPointDrawer = procedure(X,Y: Integer) of object;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Image1: TImage;
Image2: TImage;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button4: TButton;
Button7: TButton;
Image3: TImage;
Button8: TButton;
Button9: TButton;
Label6: TLabel;
Label7: TLabel;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
procedureButton1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedureButton9Click(Sender: TObject);
private
s:string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
time,tm1,tm2:integer;
implementation
//функция вычисления модулячисла
function AbsInt(Value: Integer): Integer;
begin
ifValue >= 0 then
Result := Value
else
Result := — Value;
end;
//Цифровой Дифференциальныйанализатор
procedure DDA(x1,y1,x2,y2:integer);
var dx,dy,sx,sy,d,d1,d2,x,y,i:integer;
T:tColor;
begin
randomize;
t:=random($7FFFFFFF);
dx:=abs(x2-x1);
dy:=abs(y2-y1);
if x2>=x1 then sx:=1 else sx:=-1;
if y2>=y1 then sy:=1 else sy:=-1;
if dy
begin
d:=2*dy -dx;
d1:=2*dy;
d2:=2*(dy-dx);
Form1.Image3.Canvas.Pixels[x1,y1]:=t;
x:=x1+sx;
y:=y1;
for i:=1to dx do
begin
if d>0 then
begin
d:=d+d2;
y:=y+sy;
end else d:=d+d1;
Form1.Image3.Canvas.Pixels[x,y]:=t;
x:=x+sx;
end;
end else
begin
d:=2*dx-dy;
d1:=2*dx;
d2:=2*(dx-dy);
Form1.Image3.Canvas.Pixels[x1,y1]:=t;
x:=x1;
y:=y1+sy;
for i:=1 to dy do
begin
if d>0 then
begin
d:=d+d2;
x:=x+sx;
end else d:=d+d1;
Form1.Image3.Canvas.Pixels[x,y]:=t;
y:=y+sy;
end;
end;
end;
//описание метода Брезенхема
procedure Bresenham(x1:Integer;y1:Integer;x2:Integer;y2:Integer);
var
x,y,dx,dy,sx,sy,z,e,i:Integer;
Ch: Boolean;
T:tColor;
begin
randomize;
t:=random($7FFFFFFF);
x:=x1;
y:=y1;
dx:=AbsInt(x2-x1); //модуль числа dx
dy:=AbsInt(y2-y1); //модуль числа dy
sx:=Sign(x2-x1);
sy:=Sign(y2-y1);
if (dx=0) and (dy=0) then
begin
form1.image1.Canvas.Pixels[x1,y1]:=t; //вывод точки
Exit;
end;
if dy>dx then
begin
z:=dx; dx:=dy; dy:=z;ch:=True;
end
elsech:=False;
e:=2*dy-dx;
i:=1;
repeat
form1.image1.Canvas.Pixels[x,y]:=t; //вывод точки в цикле
whilee>=0 do
begin
if ch then x:=x+sx
elsey:=y+sy;
e:=e-2*dx;
end;
if ch then y:=y+sy
else x:=x+sx;
e:=e+2*dy;
i:=i+1;
until i>dx;
end;