Реферат: Сравнительные характеристики трёх наиболее эффективных алгоритмов рисования отрезка

Оглавление

Введение________________________________________________________2

1.Теоретическая часть

     1.1.Компьютерная графика______________________________________4

1.2. Растровая графика<span Arial",«sans-serif»">______________________________________5

     1.3.Векторная графика _________________________________________ 8

1.4 Алгоритмывычерчивания отрезков____________________________ 9<span Arial",«sans-serif»">

2. Алгоритмы генерацииотрезков

     2.1. ЦифровойДифференциальный анализатор_____________________ 11

     2.2. АлгоритмБрезенхема_______________________________________13

3. Описаниепрограммы

     3.1.Описание интерфейса_______________________________________      16

     3.2.Описание логической структуры______________________________      17

Заключение______________________________________________________    18

Литература______________________________________________________    19

Приложение_____________________________________________________     20

                                                

<span Times New Roman",«serif»;mso-fareast-font-family:«Times New Roman»; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">

<span Arial",«sans-serif»">Введение

В современном миремашинная графика находит самое широкое применение в различных областях науки итехники, промышленности, в экономике, управлении, обучении. Выделим важнейшиеобласти применения машинной графики:

Автоматизацияпроектно-конструкторских работ (САПР). Это традиционная область применения, скоторой начиналось использование машинной графики.

Автоматизация научныхисследований (АСНИ).

Графические информационныепозволяют получать высококачественные тополого-геодезические, географическиекарта, карты для бурения, погодные карты и т.п.

 Автоматизация процессов обучения.

Издательскаядеятельность, реклама, компьютерные игры, мультипликация.

В зависимости отвозможности изменения получаемого изображения машинная графика подразделяетсяна пассивную и активную. Под пассивной машинной графикой подразумевается способполучения изображения на каком-либо носителе без возможности его динамическогоизменения. Интерактивная машинная графика позволяет динамически управлятьсодержанием изображения, его формой, размерами и цветом с помощью интерактивныхустройств взаимодействия ( клавиатуры, мыши, джойстика и т.п. ). Интерактивнаямашинная графика стала стандартной формой связи человека и компьютера.

Объектом исследования в нашей работе будут являться методы генерации отрезков.

Цельнашей работы – рассмотреть методы генерации отрезков, выделить ихосновные характеристики, сделать вывод об их эффективности, быстродействии.

Для достижения поставленной цели определеныследующие задачи:

1. На основе анализа литературы рассмотреть алгоритмы генерации отрезков, выделить их достоинства инедостатки.

2. Разработать приложение, реализующее три метода генерации отрезкови создающее все условия для работы с данными алгоритмами

3.Продемонстрировать различные алгоритмы генерации отрезков.

4.Сравнить быстродействие используемых алгоритмов.

5. Сделать вывод об эффективностиразличных алгоритмов генерации отрезков.

Методыисследования: теоретический, экспериментальный.

В данной программе реализованнотри алгоритма вычерчивания отрезков: Цифровой дифференциальный анализатор(ЦДА), алгоритм Брезенхема и процедуру LineTo.

<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">

<span Arial",«sans-serif»">1. Теоретическая часть

1.1. Компьютерная графика

Различают три видакомпьютерной графики: растровая графика, векторная графика и фрактальнаяграфика. Они отличаются принципами формирования изображения при отображении наэкране монитора или при печати на бумаге.

Растровую графику применяютпри разработке электронных (мультимедийных) и полиграфических изданий.Иллюстрации, выполненные средствами растровой графики, редко создают вручную спомощью компьютерных программ. Для этой цели сканируют иллюстрации,подготовленные художником на бумаге, или фотографии. В последнее время дляввода растровых изображений в компьютер нашли широкое применение цифровые фото-и видеокамеры. В Интернете пока применяются только растровые иллюстрации.

Программные средства дляработы с векторной графикой, наоборот, предназначены для создания иллюстраций ив меньшей степени для их обработки. Такие средства широко используют врекламных агентствах, дизайнерских бюро, редакциях и издательствах.Оформительские работы, основанные на применении шрифтов и простейшихгеометрических элементов, решаются средствами векторной графики проще. Имеютсяпримеры высокохудожественных произведений, созданных средствами векторнойграфики, но они скорее исключение, чем правило.

Программные средства дляработы с фрактальной графикой предназначены для автоматической генерацииизображений путем математических расчетов. Создание фрактальной художественнойкомпозиции состоит не в рисовании или оформлении, & в программировании.Фрактальную графику чаще используют в развлекательных программах.

<span Arial",«sans-serif»">

<span Arial",«sans-serif»">

<span Arial",«sans-serif»">1.2 Растровая графика

В растровой графикеосновным элементом является точка. При экранном изображение эта точканазывается пикселем.

Основная проблема инедостаток при использовании растровых изображений — это большие объемы данных.Для работ с большеразмерными иллюстрациями типа журнальной полосы требуютсякомпьютеры с большими размерами оперативной памяти (128 Мбайт и более). Такиекомпьютеры, естественно, должны при этом иметь и высокопроизводительныепроцессоры.

Вторым недостаткомрастровых изображений является невозможность их увеличения для рассмотрениядеталей. Так как изображение состоит из точек, то увеличение изображенияприводит только к тому, что эти точки становятся крупнее. Никакихдополнительных деталей при увеличении растрового изображения рассмотреть неудается. Само увеличение точек растра визуально искажает иллюстрацию и делаетее грубой. Этот эффект называется пикселизацией.

Любое изображение, в томчисле и трехмерное, состоит из графических примитивов, поэтому необходимо знатьспециальные методы генерации изображения, вычерчивание прямых и кривых линий,закраски многоугольников, создающей впечатление сплошных объектов. Рассмотримнекоторые из этих методов.

Алгоритмы вычерчиванияотрезков. Экран дисплея можно рассматривать как матрицу дискретных элементов(пикселей), каждый из которых может быть подсвечен. В связи с этим нельзянепосредственно провести отрезок из одной точки в другую. Процесс определенияпикселей, наилучшим образом аппроксимирующих заданный отрезок, называетсяразложением в растр. Для горизонтальных, вертикальных и наклоненных под углом45° отрезков выбор растровых элементов очевиден. При любой другой ориентациивыбрать нужные пиксели труднее. Существует несколько алгоритмов выполняющих этузадачу, например, цифровой дифференциальный анализатор и алгоритм Брезенхема.

Алгоритм Брезенхема длягенерации окружностей. В растр нужно разлагать не только линейные, но и другие,более сложные функции. Разложению конических сечений, т.е. окружностей,эллипсов, парабол, гипербол, посвящено значительное число работ. Наибольшеевнимание уделено окружности. Один из наиболее эффективных и простых дляпонимания алгоритмов генерации окружности принадлежит Брезенхему.

Вначале необходимосгенерировать только одну восьмую часть окружности. Остальные ее части могутбыть получены последовательными отражениями. Если сгенерирован первый октант(от 0° до 45° против часовой стрелки), то второй октант можно получитьзеркальным отражением относительно прямой у = х, что дает в совокупности первыйквадрант. Первый квадрант отражается относительно прямой х = 0 для получениясоответствующей части окружности во втором квадранте. Верхняя полуокружностьотражается относительно прямой у = О для завершения построения.

Растровая разверткасплошных областей. Возможность представления сплошных областей в растровомграфическом устройстве является его уникальной характеристикой. Генерациясплошных областей из простых описаний ребер или вершин называется растровойразверткой сплошных областей, заполнением многоугольников или заполнениемконтуров. Для этого можно использовать несколько методов, которые обычноделятся на две широкие категории: растровая развертка и затравочное заполнение.

В методах растровойразвертки пытаются определить в порядке сканирования строк, лежит ли точкавнутри многоугольника или контура. Эти алгоритмы обычно идут от«верха» многоугольника или контура к «низу».

В методах затравочногозаполнения предполагается, что известна некоторая точка (затравка) внутризамкнутого контура. В алгоритмах ищут точки, соседние с затравочной ирасположенные внутри контура. Если соседняя точка расположена не внутри,значит, обнаружена граница контура. Если же точка оказалась внутри контура, тоона становится новой затравочной точкой и поиск продолжается рекурсивно.

Растровая разверткамногоугольников. Можно разработать эффективный метод растровой разверткимногоугольников, если воспользоваться тем фактом, что соседние пиксели,вероятно, имеют одинаковые характеристики (кроме пикселов граничных ребер). Этосвойство называется пространственной когерентностью.

Алгоритм с упорядоченнымсписком ребер. Используя эти методы, можно разработать эффективные алгоритмырастровой развертки сплошных областей, называемые алгоритмами с упорядоченнымсписком ребер. Эффективность этих алгоритмов зависит от эффективностисортировки.

Алгоритм заполнения поребрам. Алгоритм, использующий список ребер и флаг, является двухшаговым.Первый шаг состоит в обрисовке контура, в результате чего на каждой сканирующейстроке образуются пары ограничивающих пикселов. Второй шаг состоит в заполнениипикселов, расположенных между ограничивающими.

Алгоритмы заполнения сзатравкой. В рассмотренных алгоритмах заполнение происходит в порядкесканирования. Иной подход используется в алгоритмах заполнения с затравкой. Вних предполагается, что известен хотя бы один пиксель из внутренней областимногоугольника. Алгоритм пытается найти и закрасить все другие пиксели,принадлежащие внутренней области. Области могут быть либо внутренние, либогранично-определенные. Если область относится к внутренне-определенным, то всепиксели, принадлежащие внутренней части, имеют один и тот же цвет илиинтенсивность, а все пиксели, внешние по отношению к области, имеют другойцвет. Если область относится к гранично-определенным, то все пиксели на границеобласти имеют выделенное значение или цвет. Алгоритмы, заполняющиевнутренне-определенные области, называются внутренне-за-полняющими, а алгоритмыдля гранично-определенных областей — гранично-заполняющими.

<span Arial",«sans-serif»">

<span Arial",«sans-serif»">1.3 Векторная графика

Как в растровой графикеосновным элементом изображения является точка, так в векторной графике основнымэлементом изображения является линия, при этом не важно, прямая это линия иликривая.

В растровой графике тожесуществуют линии, но там они рассматриваются как комбинации точек. Для каждойточки линии в растровой графике отводится одна или несколько ячеек памяти (чембольше цветов могут иметь точки, тем больше ячеек им выделяется).Соответственно, чем длиннее растровая линия, тем больше памяти она занимает. Ввекторной графике объем памяти, занимаемый линией, не зависит от размеровлинии, поскольку линия представляется в виде формулы, а точнее говоря, в виденескольких параметров. Чтобы ни делали с этой линией, меняются только еепараметры, хранящиеся в ячейках памяти. Количество же ячеек остается неизменнымдля любой линии.

Линия — это элементарныйобъект векторной графики. Все, что есть в векторной иллюстрации, состоит излиний. Простейшие объекты объединяются в более сложные, например, объектчетырехугольник можно рассматривать как четыре связанные линии, а объект кубеще более сложен: его можно рассматривать либо как двенадцать связанных линий,либо как шесть связанных четырехугольников. Из-за такого подхода векторнуюграфику часто называют объектно-ориентированной графикой.

Объекты векторной графикихранятся в памяти в виде набора параметров, но надо помнить о том, что на экранвсе изображения все равно выводятся в виде точек. Перед выводом на экранкаждого объекта программа производит вычисления координат экранных точек визобра жении объекта, поэтому векторную графику иногда называют вычисляемойграфикой. Аналогичные вычисления производятся и при выводе объектов на принтер.

Как и все объекты, линииимеют свойства. К этим свойствам относятся: форма линии, ее толщина, цвет,характер линии (сплошная, пунктирная и т.п.). Замкнутые линии имеют свойствозаполнения. Внутренняя область замкнутого контура может быть заполнена цветом,текстурой, картой. Простейшая линия, если она не замкнута, имеет две вершины,которые называются узлами. Узлы тоже имеют свойства, от которых зависит, каквыглядит вершина линии и как две линии сопрягаются между собой.

<span Arial",«sans-serif»">

<span Arial",«sans-serif»">1.4 Алгоритмы вычерчивания отрезков

Поскольку экранрастрового дисплея с электронно-лучевой трубкой (ЭЛТ) можно рассматривать какматрицу дискретных элементов (пикселов), каждый из которых может бытьподсвечен, нельзя непосредственно провести отрезок из одной точки в другую.Процесс определения пикселов, наилучшим образом аппроксимирующих заданныйотрезок, называется разложением в растр. В сочетании с процессом построчнойвизуализации изображения он известен как преобразование растровой развертки.Для горизонтальных, вертикальных и наклоненных под углом 45° отрезков выборрастровых элементов очевиден. При любой другой ориентации выбрать нужныепикселы труднее, что показано на рис. 1.1.

<img src="/cache/referats/27091/image002.jpg" v:shapes="_x0000_i1025">

Рис. 1.1 Разложение в растр отрезков прямых

Прежде чем приступать кобсуждению конкретных алгоритмов рисования отрезков, полезно рассмотреть общиетребования к таким алгоритмам и определить желаемые характеристики изображения.Очевидно, что отрезки должны выглядеть прямыми, начинаться и заканчиваться взаданных точках. Яркость вдоль отрезка должна быть постоянной и не зависеть отдлины и наклона. Наконец, рисовать нужно быстро. Как это часто бывает, не всеиз перечисленных критериев могут быть полностью удовлетворены. Сама природарастрового дисплея исключает генерацию абсолютно прямых линий (кроме рядаспециальных случаев), равно как и точное совпадение начала и конца отрезка сзаданными точками. Тем не менее при достаточно высоком разрешении дисплея можнополучить приемлемое  изображение.

Постоянная вдоль всегоотрезка яркость достигается лишь при проведении горизонтальных, вертикальных инаклоненных под углом 45 ° прямых. Для всех других ориентации разложение врастр приведет к неравномерной яркости, как это показано на рис. 2.1. Даже длячастных случаев яркость зависит от наклона: заметим, например, что расстояниемежду центрами соседних пикселов для отрезка под углом 45° больше, чем длявертикальных и горизонтальных прямых. Поэтому вертикальные и горизонтальныеотрезки будут выглядеть ярче, чем наклонные. Обеспечение одинаковой яркостивдоль отрезков разных длин и ориентации требует извлечения квадратного корня, аэто замедлит вычисления. Обычным компромиссом является нахождение приближеннойдлины отрезка, сведение вычислений к минимуму, предпочтительное использованиецелой арифметики, а также реализация алгоритмов на аппаратном или микропрограммномуровне.

<span Times New Roman",«serif»;mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA">

<span Arial",«sans-serif»">2 Алгоритмы генерации отрезков

<span Arial",«sans-serif»">2.1 Цифровой Дифференциальный анализатор

Один из методовразложения отрезка в растр состоит в решении дифференциального уравнения,описывающего этот процесс. Для прямой линии имеем

<img src="/cache/referats/27091/image004.jpg" v:shapes="_x0000_i1026">

Решение представляется ввиде

<img src="/cache/referats/27091/image006.jpg" v:shapes="_x0000_i1027">

где 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

<span Times New Roman";mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA">

<span Arial",«sans-serif»">2.2

<span Arial",«sans-serif»">Алгоритм Брезенхема

В 1965году Брезенхеймом был предложен простой целочисленный алгоритм для растровогопостроения отрезка. Алгоритмвыбирает оптимальные растровые координаты для представления отрезка. В процессеработы одна из координат — либо x, либо у (в зависимости от углового коэффициента) —изменяется на единицу. Изменение другой координаты (либо на нуль, либо наединицу) зависит от расстояния между действительным положением отрезка иближайшими координатами сетки. Такое расстояние мы назовем ошибкой.

Алгоритм построен так,что требуется проверять лишь знак этой ошибки. На рис. 1.2 это иллюстрируетсядля отрезка в первом октанте, т. е. для отрезка с угловым коэффициентом,лежащим в диапазоне от нуля до единицы. Из рисунка можно заметить, что еслиугловой коэффициент отрезка из точки (0, 0) больше чем 1/2, то его пересечениес прямой  х = 1 будет расположено ближе кпрямой у = 1, чем к прямой у = 0. Следовательно, точка растра (1, 1) лучшеаппроксимирует ход отрезка, чем точка (1, 0). Если угловой коэффициент меньше1/2, то верно обратное. Для углового коэффициента,

<img src="/cache/referats/27091/image008.jpg" v:shapes="_x0000_i1028">

Рис. 1.2 Основная идея алгоритма Брезенхема

равного 1/2, неткакого-либо предпочтительного выбора. В данном случае алгоритм выбирает точку(1, 1).

<img src="/cache/referats/27091/image010.jpg" v:shapes="_x0000_i1029">

Рис. 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).

<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">

<span Arial",«sans-serif»">3. Описание программы

3.1.Описание интерфейса

Реализация каждого методагенерации отрезков проводилась в среде объектно-ориентированногопрограммирования Delphi7. Поставлена задача запрограммировать алгоритмы генерацииотрезков, создать форму для ввода данных и вывода результата.

Для каждого из трехалгоритмов создается окно приложения (рис. 1.4).

<img src="/cache/referats/27091/image012.jpg" v:shapes="_x0000_i1030">

Рис. 1.4.Внешний вид окна приложения

В итоге создано приложениеWindows.

На форме расположены:

1.<span Times New Roman"">         

Триполя, на которых будет отображаться результат построения отрезков для каждогометода в отдельности.

2.<span Times New Roman"">          

Поле«Ввод количества линий» служит для ввода количества линий, которые будутсгенерированы генератором случайных чисел.

3.<span Times New Roman"">          

Триполя «время», на которых отображается время построения отрезков для каждогометода в отдельности.

<img src="/cache/referats/27091/image014.jpg" v:shapes="_x0000_i1031">

 Рис.3.2 Результат работыприложения

3.2. Описание логической структуры

В проект добавлены компоненты Form1 – главная форма. На главной формеразмещаются компоненты: Image– окно для вывода линий, Panel– панель для вывода времени,затраченного на генерацию отрезков, Edit1 – окошечко для ввода количествалиний, которые будут сгенерированы генератором случайных чисел и Button– кнопка для подтверждения вводаколичества линий / для очистки компонента Imageи сброса всех настроек. Label– показывает числопостроенных линий

<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language: RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">
Заключение

Заканчивая наш обзорметодов генерации отрезков, попытаемся сравнить их эффективность.

1.<span Times New Roman"">    

Метод Брезенхема определеннонаихудший из всех сравниваемых, этот алгоритм обладает очень плохими временнымихарактеристиками. Он имеет только учебно-исторический интерес и не может бытьрекомендован для практического использования.

2.<span Times New Roman"">    

Алогритм Цифрового ДифференциальногоАнализатора в среднем (в зависимости от количества введенных линий) лучше, чемметод Брезенхема. По сравнению с методом Брезенхема метод ЦДА в большинствеслучаев может оказаться более быстрым.

3.<span Times New Roman"">    

Процедура LineToоказалась самой быстрой ирезультативной из всех трех алгоритмов

В данной работе рассмотренынекоторые простые и улучшенные методы генерации отрезков: Брезенхема, ЦифровогоДифференциального Анализатора и стандартной процедуры LineTo. Мы оценили сложность этих алгоритмовгенерации. Алгоритмы этих методов представлены в виде программ. Так же былапроанализирована скорость, эффективность использования того или иного видагенерации отрезков.

Целью данной курсовойработы было исследование и сравнение трех наиболее эффективных алгоритмов генерацииотрезков: Брезенхема, Цифрового Дифференциального Анализатора и стандартнойпроцедуры LineTo. Поставленная цель была достигнута.

<span Times New Roman",«serif»;mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA">

<span Arial",«sans-serif»">Списоклитературы

1.<span Times New Roman"">    

П.В.Вельтмандер«Машинная графика» Издательский дом «Вильямс», 2000.

2.<span Times New Roman"">    

информация с сайта alglib.sources.ru

3.<span Times New Roman"">    

информация с сайта joinbiz.ru

4.<span Times New Roman"">    

информация с сайта kladovka.net.ru

5.<span Times New Roman"">    

информация с сайта Mini-Soft.ru<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language: RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">
Приложение

<span Courier New";mso-ansi-language:EN-US">unit

<span Courier New"; mso-ansi-language:EN-US"> Unit1;

<span Courier New";mso-ansi-language:EN-US">interface

<span Courier New";mso-ansi-language:EN-US">uses

<span Courier New";mso-ansi-language: EN-US">  Windows, Messages, SysUtils,Variants, Classes, Graphics, Controls, Forms,

<span Courier New";mso-ansi-language: EN-US">  Dialogs,Math, StdCtrls,ExtCtrls, Menus, ToolWin, ComCtrls, ExtDlgs,

<span Courier New";mso-ansi-language: EN-US">  ImgList;

<span Courier New";mso-ansi-language:EN-US">type

<span Courier New";mso-ansi-language: EN-US">TPointDrawer = procedure(X,Y: Integer) of object;

<span Courier New";mso-ansi-language: EN-US">  TForm1 = class(TForm)

<span Courier New";mso-ansi-language: EN-US">

<span Courier New";mso-ansi-language: EN-US">    Button1: TButton;

<span Courier New";mso-ansi-language: EN-US">    Button2: TButton;

<span Courier New";mso-ansi-language: EN-US">    Button3: TButton;

<span Courier New";mso-ansi-language: EN-US">    Image1: TImage;

<span Courier New";mso-ansi-language: EN-US">    Image2: TImage;

<span Courier New";mso-ansi-language: EN-US">    Edit1: TEdit;

<span Courier New";mso-ansi-language: EN-US">    Label1: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label2: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label3: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label4: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label5: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Button4: TButton;

<span Courier New";mso-ansi-language: EN-US">    Button7: TButton;

<span Courier New";mso-ansi-language: EN-US">    Image3: TImage;

<span Courier New";mso-ansi-language: EN-US">    Button8: TButton;

<span Courier New";mso-ansi-language: EN-US">    Button9: TButton;

<span Courier New";mso-ansi-language: EN-US">    Label6: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label7: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Panel1: TPanel;

<span Courier New";mso-ansi-language: EN-US">    Panel2: TPanel;

<span Courier New";mso-ansi-language: EN-US">    Panel3: TPanel;

<span Courier New";mso-ansi-language: EN-US">    Label8: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label9: TLabel;

<span Courier New";mso-ansi-language: EN-US">    Label10: TLabel;

<span Courier New";mso-ansi-language: EN-US"> 

<span Courier New";mso-ansi-language: EN-US">    procedureButton1Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure Button2Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure FormCreate(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure Button3Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure Button4Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure Button7Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedure Button8Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">    procedureButton9Click(Sender: TObject);

<span Courier New";mso-ansi-language: EN-US">   private

<span Courier New";mso-ansi-language: EN-US">   s:string;

<span Courier New";mso-ansi-language: EN-US">    { Private declarations }

<span Courier New";mso-ansi-language: EN-US">

<span Courier New";mso-ansi-language: EN-US">  public

<span Courier New";mso-ansi-language: EN-US">    { Public declarations }

<span Courier New";mso-ansi-language:EN-US">  end

<span Courier New";mso-ansi-language:EN-US">;

<span Courier New";mso-ansi-language: EN-US">

<span Courier New";mso-ansi-language:EN-US">var

<span Courier New";mso-ansi-language: EN-US">  Form1: TForm1;

<span Courier New";mso-ansi-language: EN-US">  time,tm1,tm2:integer;

<span Courier New";mso-ansi-language:EN-US">implementation

<span Courier New"">

<span Courier New"">//функция вычисления модулячисла

<span Courier New";mso-ansi-language:EN-US">function

<span Courier New";mso-ansi-language: EN-US"> AbsInt(Value: Integer): Integer;

<span Courier New";mso-ansi-language:EN-US">begin

<span Courier New";mso-ansi-language:EN-US">  if

<span Courier New";mso-ansi-language:EN-US">Value >= 0 then

<span Courier New";mso-ansi-language: EN-US">    Result := Value

<span Courier New";mso-ansi-language: EN-US">  else

<span Courier New";mso-ansi-language: EN-US">    Result := — Value;

<span Courier New";mso-ansi-language:EN-US">end

<span Courier New";mso-ansi-language: EN-US">;

<span Courier New"">

<span Courier New"">//Цифровой Дифференциальныйанализатор

<span Courier New";mso-ansi-language:EN-US">procedure

<span Courier New""> <span Courier New";mso-ansi-language:EN-US">DDA<span Courier New"">(<span Courier New";mso-ansi-language:EN-US">x<span Courier New"">1,<span Courier New";mso-ansi-language:EN-US">y<span Courier New"">1,<span Courier New";mso-ansi-language:EN-US">x<span Courier New"">2,<span Courier New";mso-ansi-language:EN-US">y<span Courier New"">2:<span Courier New";mso-ansi-language:EN-US">integer<span Courier New"">);

<span Courier New";mso-ansi-language:EN-US">var

<span Courier New";mso-ansi-language: EN-US"> dx,dy,sx,sy,d,d1,d2,x,y,i:integer;

<span Courier New";mso-ansi-language: EN-US">T:tColor;

<span Courier New";mso-ansi-language:EN-US">begin

<span Courier New";mso-ansi-language: EN-US">randomize;

<span Courier New";mso-ansi-language: EN-US">  t:=random($7FFFFFFF);

<span Courier New";mso-ansi-language: EN-US">  dx:=abs(x2-x1);

<span Courier New";mso-ansi-language: EN-US">  dy:=abs(y2-y1);

<span Courier New";mso-ansi-language: EN-US">  if x2>=x1 then sx:=1 else sx:=-1;

<span Courier New";mso-ansi-language: EN-US">  if y2>=y1 then sy:=1 else sy:=-1;

<span Courier New";mso-ansi-language: EN-US">  if dy<=dx then

<span Courier New";mso-ansi-language: EN-US">  begin

<span Courier New";mso-ansi-language: EN-US">    d:=2*dy -dx;

<span Courier New";mso-ansi-language: EN-US">    d1:=2*dy;

<span Courier New";mso-ansi-language: EN-US">    d2:=2*(dy-dx);

<span Courier New";mso-ansi-language: EN-US">   Form1.Image3.Canvas.Pixels[x1,y1]:=t;

<span Courier New";mso-ansi-language: EN-US">    x:=x1+sx;

<span Courier New";mso-ansi-language: EN-US">    y:=y1;

<span Courier New";mso-ansi-language:EN-US">    for

<span Courier New";mso-ansi-language:EN-US"> i:=1to dx do

<span Courier New";mso-ansi-language:EN-US">    begin

<span Courier New";mso-ansi-language: EN-US">      if d>0 then

<span Courier New";mso-ansi-language: EN-US">      begin

<span Courier New";mso-ansi-language: EN-US">        d:=d+d2;

<span Courier New";mso-ansi-language: EN-US">        y:=y+sy;

<span Courier New";mso-ansi-language: EN-US">      end else d:=d+d1;

<span Courier New";mso-ansi-language: EN-US">     Form1.Image3.Canvas.Pixels[x,y]:=t;

<span Courier New";mso-ansi-language: EN-US">      x:=x+sx;

<span Courier New";mso-ansi-language: EN-US">    end;

<span Courier New";mso-ansi-language: EN-US">  end else

<span Courier New";mso-ansi-language:EN-US">  begin

<span Courier New";mso-ansi-language: EN-US">    d:=2*dx-dy;

<span Courier New";mso-ansi-language: EN-US">    d1:=2*dx;

<span Courier New";mso-ansi-language: EN-US">    d2:=2*(dx-dy);

<span Courier New";mso-ansi-language: EN-US">   Form1.Image3.Canvas.Pixels[x1,y1]:=t;

<span Courier New";mso-ansi-language: EN-US">    x:=x1;

<span Courier New";mso-ansi-language: EN-US">    y:=y1+sy;

<span Courier New";mso-ansi-language: EN-US">    for i:=1 to dy do

<span Courier New";mso-ansi-language: EN-US">    begin

<span Courier New";mso-ansi-language: EN-US">      if d>0 then

<span Courier New";mso-ansi-language: EN-US">      begin

<span Courier New";mso-ansi-language: EN-US">        d:=d+d2;

<span Courier New";mso-ansi-language: EN-US">        x:=x+sx;

<span Courier New";mso-ansi-language: EN-US">      end else d:=d+d1;

<span Courier New";mso-ansi-language: EN-US">     Form1.Image3.Canvas.Pixels[x,y]:=t;

<span Courier New";mso-ansi-language: EN-US">      y:=y+sy;

<span Courier New";mso-ansi-language: EN-US">    end;

<span Courier New";mso-ansi-language:EN-US">  end;

<span Courier New";mso-ansi-language:EN-US">end;

<span Courier New";mso-ansi-language: EN-US">

<span Courier New";mso-ansi-language: EN-US">//описание метода Брезенхема

<span Courier New";mso-ansi-language:EN-US">procedure

<span Courier New";mso-ansi-language: EN-US"> Bresenham(x1:Integer;y1:Integer;x2:Integer;y2:Integer);

<span Courier New";mso-ansi-language:EN-US">var

<span Courier New";mso-ansi-language: EN-US">    x,y,dx,dy,sx,sy,z,e,i:Integer;

<span Courier New";mso-ansi-language: EN-US">    Ch: Boolean;

<span Courier New";mso-ansi-language: EN-US">    T:tColor;

<span Courier New";mso-ansi-language:EN-US">begin

<span Courier New";mso-ansi-language: EN-US">randomize;

<span Courier New";mso-ansi-language: EN-US">  t:=random($7FFFFFFF);

<span Courier New";mso-ansi-language: EN-US">    x:=x1;

<span Courier New";mso-ansi-language: EN-US">    y

<span Courier New"">:=<span Courier New";mso-ansi-language:EN-US">y<span Courier New"">1;

<span Courier New"">   

<span Courier New";mso-ansi-language:EN-US">dx<span Courier New"">:=<span Courier New";mso-ansi-language:EN-US">AbsInt<span Courier New"">(<span Courier New";mso-ansi-language:EN-US">x<span Courier New"">2-<span Courier New";mso-ansi-language:EN-US">x<span Courier New"">1); //модуль числа <span Courier New";mso-ansi-language: EN-US">dx<span Courier New"">

<span Courier New"">   

<span Courier New";mso-ansi-language:EN-US">dy<span Courier New"">:=<span Courier New";mso-ansi-language:EN-US">AbsInt<span Courier New"">(<span Courier New";mso-ansi-language:EN-US">y<span Courier New"">2-<span Courier New";mso-ansi-language:EN-US">y<span Courier New"">1); //модуль числа <span Courier New";mso-ansi-language: EN-US">dy<span Courier New"">

<span Courier New"">   

<span Courier New";mso-ansi-language:EN-US">sx:=Sign(x2-x1);

<span Courier New";mso-ansi-language: EN-US">    sy:=Sign(y2-y1);

<span Courier New";mso-ansi-language: EN-US">    if (dx=0) and (dy=0) then

<span Courier New";mso-ansi-language: EN-US">    begin

<span Courier New";mso-ansi-language: EN-US">       form1.image1.Canvas.Pixels[x1,y1]:=t; //вывод точки

<span Courier New";mso-ansi-language: EN-US">        Exit;

<span Courier New";mso-ansi-language:EN-US">    end;

<span Courier New";mso-ansi-language: EN-US">    if dy>dx then

<span Courier New";mso-ansi-language:EN-US">    begin

<span Courier New";mso-ansi-language: EN-US">        z:=dx; dx:=dy; dy:=z;ch:=True;

<span Courier New";mso-ansi-language: EN-US">    end

<span Courier New";mso-ansi-language:EN-US">    else

<span Courier New";mso-ansi-language:EN-US">ch:=False;

<span Courier New";mso-ansi-language: EN-US">    e:=2*dy-dx;

<span Courier New";mso-ansi-language: EN-US">    i:=1;

<span Courier New";mso-ansi-language:EN-US">    repeat

<span Courier New";mso-ansi-language: EN-US">       form1.image1.Canvas.Pixels[x,y]:=t;  //вывод точки в цикле

<span Courier New";mso-ansi-language:EN-US">        while

<span Courier New";mso-ansi-language:EN-US">e>=0 do

<span Courier New";mso-ansi-language: EN-US">        begin

<span Courier New";mso-ansi-language: EN-US">            if ch then x:=x+sx

<span Courier New";mso-ansi-language: EN-US">            elsey:=y+sy;

<span Courier New";mso-ansi-language: EN-US">            e:=e-2*dx;

<span Courier New";mso-ansi-language: EN-US">        end;

<span Courier New";mso-ansi-language: EN-US">        if ch then y:=y+sy

<span Courier New";mso-ansi-language: EN-US">        else x:=x+sx;

<span Courier New";mso-ansi-language: EN-US">        e:=e+2*dy;

<span Courier New";mso-ansi-language: EN-US">        i:=i+1;

<span Courier New";mso-ansi-language: EN-US">    until i>dx;

<span Courier New";mso-ansi-language: EN-US">    end;

<span Courier New";mso-ansi-la

еще рефераты
Еще работы по программированию, базе данных