Rasterizace úsečky pomocí Bresenhamova algoritmu – applet

Při rasterizaci rozhodujeme, který pixel nejblíže ležící teoretické úsečce vybereme, abychom dostali co možná nejlepší vizuální výsledek. Protože nejmenším bodem v bitmapové počítačové grafice na daném zobrazovacím zařízení je pixel, výstupem z algoritmu by měly být celočíselné souřadnice vybraných pixelů. Jednoduchý algoritmus kreslící body nejbližší úsečce se nazývá DDA (Digital Differential Analyzer). J. E. Bresenham vyvinul algoritmus, který dává shodný výsledek, ale narozdíl od DDA používá celočíselné aritmetiky, čímž dosahuje vyšší efektivity. Rychlost vykreslení úsečky je přitom klíčová, protože v praxi nahrazujeme složitější útvary sérií úseček.

Either scripts and active content are not permitted to run or Adobe Flash Player version 11.1.0 or greater is not installed.

Get Adobe Flash Player

Teorie k Bresenhamovu algoritmu

Vyjdeme z obecné rovnice přímky

rovnice 1

kde m je směrnice a b posun na ose y. Jinak psáno

rovnice 2

kde [x1, y1] a [x2, y2] jsou koncové body úsečky (předpokládáme je celočíselné).
Předpokládejme, že je již nakreslen bod o souřadnicích [xi, yi]. Dále uvažujme, že tzv. řídicí osa je x, tedy úsečka má směrnici odpovídající úhlu 0 až 45 stupňů. V dalším kroku n + 1 máme na výběr ze dvou souřadnic, a to [xi + 1, yi] nebo [xi + 1, yi + 1]. Definujeme si dvě proměnné d1 a d2, což jsou vertikální vzdálenosti teoretického bodu na přímce od celočíselných souřadnic.

rovnice 3

Rozdílem vzdáleností d1 a d2 získáme rozhodovací prvek algoritmu:

rovnice 4

Nyní jsme schopni rozhodnout, který z možných pixelů leží blíže y-ové souřadnici skutečného bodu. Nezáleží nám přitom na velikosti delta d, ale pouze na jejím znaménku. Je-li hodnota delta d záporná, leží blíž pixel se souřadnicí yi, kladná hodnota značí, že blíž leží pixel o souřadnici yi + 1. Tento postup je výhodný pro převod výpočtu do celočíslené aritmetiky.

Ovládání appletu

Applet je rozdělen na kreslící plochu a ovládací panel ve spodu. Tlačítky plus a minus, případně posuvníkem, můžeme měnit měřítko velikosti pixelu, a to jak před, tak i po zadání řídicích bodů. Pokud jsme již zadali body a rozhodneme se měřítko změnit, automaticky se provede restart, a my tak můžeme kreslit znovu v novém měřítku. Zbývá tlačítko reset, které nám umožní zvolit nové dva koncové body pro vykreslení jiné úsečky. Nemusíme však body vždy znovu zadávat, můžeme editovat jejich polohu kliknutím na daný bod a tažením myši. Při puštění levého tlačítka myši bod umístíme. Rasterizace probíhá v reálném čase při každé změně bodů.

Zaškrtávacím políčkem zobrazit teoretickou čáru volíme zobrazení červené, teoretické úsečky, která začíná a končí na celočíselných souřadnicích. Políčko Zobrazit spojnici nám modře propojí body, které jsme zadali myší. Applet tedy zároveň ukazuje chybu, která nastává díky zaokrouhlení koncových bodů.


(c) 2012, Jakub Malina, Pavel Rajmic, Ústav telekomunikací, FEKT, VUT v Brně