Программизм |
|
|
|
Реализация алгоритмов БрезенхемаСложно сегодня найти человека, который бы не сталкивался с машинной
графикой в тех или иных проявлениях. Если человек начинает
интересоваться алгоритмами, лежащими в её основе, то одними из первых
будут алгоритмы Брезенхема. Беда лишь в том, что мне до сих пор не
попадалось простого и вразумительного описания этих алгоритмов, а уж тем
более — реализации. В этой статье я попытаюсь по возможности
просто рассказать о семействе алгоритмов Брезенхема, а также приведу
готовый к использованию код на JavaScript, который практически не
отличается от кода на Хотелось бы выразить свои глубокие и искренние чувства к разработчикам стандартов www и тем, кто их реализует. Вариант JavaScript-кода, работающий во всех доступных броузерах, т.е. IE 6.0, NN 7.0 и Opera 6.0x, не отличается красотой и изысканностью. Впрочем, «к науке, которую я в настоящий момент представляю, это отношения не имеет». Итак, назначение алгоритмов Брезенхема — нарисовать линию на растровом устройстве, как правило, на мониторе. Как можно видеть на рисунке 1, не все пиксели, входящие в изображение линии, лежат на этой линии, то есть задача алгоритма — найти наиболее близкие пиксели. Главное достоинство алгоритма Брезенхема в том, что в нём не используется в цикле дорогостоящая операция умножения. Алгоритм подходит для прямых или кривых второго порядка*. Существуют модификации алгоритма для четырёхсвязной (т.е. соседними считаются точки, отличающиеся на 1 по одной координате) и восьмисвязной (т.е. соседними считаются точки, обе координаты которых отличаются не больше, чем на 1) линий. Здесь приведён второй вариант — более сложный, но и дающий лучший результат.
Основная идея алгоритма в том, что линия, которую надо нарисовать, делит
плоскость на две части. Уравнение кривой записывается в виде
При одном из возможных шагов Z растёт, при другом — уменьшается. Каждый шаг выбирается с тем расчётом, чтобы значение Z для нового пикселя было как можно ближе к 0. Таким образом, мы будем двигаться вдоль линии, создавая её изображение. Рисование отрезкаСразу договоримся, что алгоритм для прямой не рисует горизонтальные и вертикальные линии. Это связано с тем, что рисование таких линий можно реализовать гораздо более простым способом, часто на уровне BIOS или драйвера. Оставшиеся отрезки делятся на две группы: горизонтальные и вертикальные.
Если представить уравнение прямой в виде Для горизонтальных отрезков каждый новый пиксель будет правее предыдущего на 1, при этом он
может также быть выше (ниже), т.е. возможны два шага — вправо и Если координаты концов отрезка Рисование окружностиАлгоритм рисования дуги останется за рамками статьи, а вот алгоритм для рисования окружности получился значительно проще, чем для прямой. Связано это со многими причинами. Во-первых, мы рисуем только одну восьмую часть окружности — от Во-вторых из-за симметрии отклонения линии от окружности не так заметны, как отклонения от прямой, поэтому Z можно сравнивать с нулём, не вычисляя максимально допустимого отклонения. Допустимые шаги — вправо и Вот, собственно, и всё. Ниже вы найдёте скрипт, демонстрирующий работу описанных алгоритмов, а для того, чтобы понять, как он работает, просто посмотрите исходный текст страницы. Удачи!
3.04.2003 * то есть эллипса (и окружности), гиперболы и параболы |
ПоискСм. такжеНадо запустить несколько процессов, дождаться их окончания и двигаться дальше... »»» я попытаюсь по возможности просто рассказать о семействе алгоритмов Брезенхема, а также приведу готовый к использованию код на JavaScript... »»» архив с драйвером занимает около Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |