У комп'ютерній графіці, алгоритм середини кола — це алгоритм, який використовується для визначення точок, необхідних для растеризації кола. Алгоритм кола [en] є похідним від алгоритму середньої точки окружності. Алгоритм може бути узагальнений до конічних перетинів.
Алгоритм відноситься до роботи Pitteway і Van Aken.
Короткий виклад
Цей алгоритм відображає всі вісім октантів одночасно, починаючи з кожного напряму (0°, 90°, 180°, 270°) і проходить в обох напрямках, щоб дістатися до найближчого кратного 45° (45°, 135°, 225°, 315° ). Алгоритм може визначити, де зупинитися, тому що, коли у = х, це означає, що кут становить 45 °. Причина використання цих кутів показано на малюнку: В той час, як змінна у зростає, вона не пропускає жодного повтору значення у до досягнення 45 °. Таким чином, під час циклу, у збільшується на 1 кожної ітерації і х зменшується на 1, також х ніколи не перевищує 1 в одній ітерації. Це призводить до зміни під кутом 45 °, тому що це точка, в якій тангенс зростання = обертанню.
Друга частина проблеми - це визначник, він є набагато складнішим. Він визначає, коли потрібно зменшувати х. Це зазвичай відбувається після того, як були намальовані пікселі, так як він ніколи не опускається нижче радіусу на першому пікселі. Тому що в безперервній функції, функція для сфери є функцією для кола з радіусом, що залежить від z (або незалежно від третьої змінної), само собою зрозуміло, що алгоритм для дискретної (voxel) сфери буде також спиратися на цей алгоритм окружності середньої точки. Але при погляді на сферу, може здатися, що цілочисельний радіус деяких сусідніх кіл однаковий, але вона не буде мати точно таке ж коло, що примикає до себе, в тому числі півкулі. Замість цього, для кола того ж радіуса потрібен інший визначник, щоб крива могла прийти трохи ближче до центру, або сягати далі. Розглянуті кругові діаграми, що відносяться до Minecraft, як визначник, перераховані нижче, враховують тільки одну можливість.
Алгоритм
Мета алгоритму полягає в знаходженні шляху через піксельну сітку, використовуючи пікселі, які якомога ближче до вірного рішення . На кожному кроці, шлях розширено шляхом вибору суміжних пікселів, які задовольняють ,але максимізує . Так як запропоновані пікселі є суміжними, арифметично обчислити останній вираз стає легше, тому що необхідні тільки бітові зрушення і доповнення.
Цей алгоритм починається з рівнянням кола. Для простоти припустимо, що центр кола знаходиться в . Розглянемо спочатку тільки перший октант і накреслити криву, яка починається в точці і малюється проти годинникової стрілки, досягаючи кута 45.
Швидкий напрямок (базисний вектор з великим збільшенням значення) є напрямком змінної . Алгоритм завжди робить крок в позитивному напрямі(вгору) , а іноді робить крок в повільному напрямі (від'ємний напрямок).
З рівняння кола виходить перетворене рівняння , де обчислюється тільки один раз під час ініціалізації.
Нехай точки на колі - це послідовність координат вектора в точці (в звичайному базисі). Точки пронумеровані відповідно до порядку, в якому точка креслиться з і присвоюється першій точці .
Для кожної точки, має місце наступне:
Це може бути змінено таким чином:
А також для наступної точки:
Оскільки наступна точка завжди буде принаймні на один піксель вище, ніж в минулому, це правда, що:
Таким чином, переробки наступної точки-рівняння рекурсивним шляхом заміни одного :
Через властивість безперервності кола і тому, що максимуми по обох осях однакові, очевидно, що коло не буде пропускати х точок,так як алгоритм просувається в послідовності. Зазвичай він залишається на тих же координати х, а іноді і випереджає на один.
Остаточні координати рахуються шляхом додавання середньої точки координат. Ці цілочисленні доповнення не обмежують [en], так як ці квадратні (корінь) обчисленняв, свою чергу, можуть бути позбавлені у внутрішньому циклі. Знову ж, нуль в перетвореному рівнянні кола замінюється терміном помилки.
Ініціалізація терміна помилки виводяться з зміщення ½ пікселя на старті. До перетину з перпендикулярною лінією, це не призводить до накопиченого значенням в термінах помилки, так що це значення використовується для ініціалізації.
Часті обчислення квадратів в рівнянні кола, тригонометричних виразів і квадратних коренів, знову можна уникнути шляхом розбиття всього на окремі кроки і за допомогою рекурсивного обчислення квадратичного члена від попередніх ітерацій.
Варіант з цілочисельною основою арифметики
Так само, як і алгоритм Брезенхейма, цей алгоритм може бути оптимізований для цілих чисел на основі математики. Шляхом симетріъ, якщо алгоритм обчислить пікселі для одного октанта, вони можуть бути відображені симметрично, щоб отримати весь круг.
Ми почнемо з визначення похибки радіуса, яка складає різницю між точним уявленням окружності і центральною точкою кожного пікселя (або будь-яка інша довільна математична точка на пікселі). Для кожного пікселя з центром в точці , похибка радіусу визначається як:
Для ясності, ця формула для окружності отримується для початку координат, але алгоритм може бути змінений для будь-якого місця. Буде корректно почати з точки на позитивній осі Х. Оскільки радіус буде цілим числом пікселів, очевидно, похибка радіусу буде дорівнювати нулю:
Через те, що вона починається в першому позитивному Октанті, це буде крок у напрямку найбільшої, так сказати, подорожі, у напрямку Y, таким чином, зрозуміло, що . Окрім того, оскільки це стосується тільки цього Октанту, значення X має тільки два варіанти: залишитися таким же, як раніше ітерувати(збільшити), або зменшити на 1. Змінна рішення може бути створена, шляхом визначення, чи буде справедливо наступне:
Якщо ця нерівність виконана, то виконується така дія ; якщо ні, то . Отже, як визначити, чи є це нерівність? Почнемо з визначення похибки радіуса:
Абсолютне значення функції не допомагає, тому піднесемо до квадрату з обох сторін, так як квадрат будь-якого числа завжди позитивний:
SТак як х > 0, термін , таким чином під час ділення ми отримуємо:
Таким чином, критерій рішення змінюється від використання операцій з плаваючою комою, до простого цілочисельного додавання, віднімання, і біту зсуву (для операції множення на 2 ). Якщо , то ми зменшуємо значення X. Якщо , то зберігаємо таке ж значення X. Знову ж, відображаємо ці точки на всіх октантах, отримуючи повне коло результатів.
Приклад на С
Вищезгаданий алгоритм реалізований на мові програмування C, і показаний нижче. Починаючи з точки , він перераховує точки в порядку проти годинникової стрілки для першого октанта, одночасно відображаючи точки до інших октантів.
void drawcircle(int x0, int y0, int radius) { int x = radius; int y = 0; int err = 0; while (x >= y) { putpixel(x0 + x, y0 + y); putpixel(x0 + y, y0 + x); putpixel(x0 - y, y0 + x); putpixel(x0 - x, y0 + y); putpixel(x0 - x, y0 - y); putpixel(x0 - y, y0 - x); putpixel(x0 + y, y0 - x); putpixel(x0 + x, y0 - y); if (err <= 0) { y += 1; err += 2*y + 1; } if (err > 0) { x -= 1; err -= 2*x + 1; } } }
Приклад на JavaScript
Реалізація, яка малює коло на сторінці HTML5 (тільки для освітніх цілей, є кращі способи малювати кола на сторінках).
const CHANNELS_PER_PIXEL = 4; //rgba function drawCircle (x0, y0, radius, canvas) { var x = radius; var y = 0; var decisionOver2 = 1 - x; // Decision criterion divided by 2 evaluated at x=r, y=0 var imageWidth = canvas.width; var imageHeight = canvas.height; var context = canvas.getContext('2d'); var imageData = context.getImageData(0, 0, imageWidth, imageHeight); var pixelData = imageData.data; var makePixelIndexer = function (width) { return function (i, j) { var index = CHANNELS_PER_PIXEL * (j * width + i); //index points to the Red channel of pixel //at column i and row j calculated from top left return index; }; }; var pixelIndexer = makePixelIndexer(imageWidth); var drawPixel = function (x, y) { var idx = pixelIndexer(x,y); pixelData[idx] = 255;//red pixelData[idx + 1] = 0;//green pixelData[idx + 2] = 255;//blue pixelData[idx + 3] = 255;//alpha }; while (x >= y) { drawPixel(x + x0, y + y0); drawPixel(y + x0, x + y0); drawPixel(-x + x0, y + y0); drawPixel(-y + x0, x + y0); drawPixel(-x + x0, -y + y0); drawPixel(-y + x0, -x + y0); drawPixel(x + x0, -y + y0); drawPixel(y + x0, -x + y0); y++; if (decisionOver2 <= 0) { decisionOver2 += 2 * y + 1; // Change in decision criterion for y -> y+1 } else { x--; decisionOver2 += 2 * (y - x) + 1; // Change for y -> y+1, x -> x-1 } } context.putImageData(imageData, 0, 0); }
Малювання неповних октантів
Наведені вище реалізації завжди малюють тільки повні октанти або кола. Щоб намалювати тільки певну дугу від кута до , алгоритму необхідно спочатку обчислити координати і цих кінцевих точок, де необхідно вдатися до обчислень тригонометричного або квадратного кореня (див. Квадратний корінь). Потім алгоритм Бресенхейма виконується по всьому Октанту або по колу і встановлює пікселі тільки в тому випадку, якщо вони потрапляють в потрібний інтервал. Після закінчення цієї дуги, алгоритм може бути припинений достроково.
Якщо кути задані як схили, то немає необхідності в тригонометрії або квадратних коренях: просто перевірте, що , знаходиться між бажаними нахилами.
Узагальнення
Також можна використовувати ту ж саму концепцію для растеризації параболи, еліпса, або будь-якої іншої двовимірної кривої.
References
- Donald Hearn; M. Pauline Baker. . Prentice-Hall. ISBN . Архів оригіналу за 7 липня 2014. Процитовано 25 квітня 2017.
- Pitteway, M.L.V., «Алгоритм для креслення еліпса або гіперболи з цифровими плоттерами», Computer J., 10(3) November 1967, pp 282—289
- Van Aken, J.R., «Ефективний алгоритм для креслення еліпса», CG&A, 4(9), September 1984, pp 24-35
- . Архів оригіналу за 30 квітня 2017. Процитовано 25 квітня 2017.
Зовнішні посилання
- - Стаття про малювання кіл, яка походить від простої схеми до ефективної
- Алгоритм окружності в деяких мовах програмування [ 5 травня 2017 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U komp yuternij grafici algoritm seredini kola ce algoritm yakij vikoristovuyetsya dlya viznachennya tochok neobhidnih dlya rasterizaciyi kola Algoritm kola en ye pohidnim vid algoritmu serednoyi tochki okruzhnosti Algoritm mozhe buti uzagalnenij do konichnih peretiniv Rasterizaciya kola za algoritmom Bresenham Algoritm vidnositsya do roboti Pitteway i Van Aken Korotkij vikladCej algoritm vidobrazhaye vsi visim oktantiv odnochasno pochinayuchi z kozhnogo napryamu 0 90 180 270 i prohodit v oboh napryamkah shob distatisya do najblizhchogo kratnogo 45 45 135 225 315 Algoritm mozhe viznachiti de zupinitisya tomu sho koli u h ce oznachaye sho kut stanovit 45 Prichina vikoristannya cih kutiv pokazano na malyunku V toj chas yak zminna u zrostaye vona ne propuskaye zhodnogo povtoru znachennya u do dosyagnennya 45 Takim chinom pid chas ciklu u zbilshuyetsya na 1 kozhnoyi iteraciyi i h zmenshuyetsya na 1 takozh h nikoli ne perevishuye 1 v odnij iteraciyi Ce prizvodit do zmini pid kutom 45 tomu sho ce tochka v yakij tangens zrostannya obertannyu Druga chastina problemi ce viznachnik vin ye nabagato skladnishim Vin viznachaye koli potribno zmenshuvati h Ce zazvichaj vidbuvayetsya pislya togo yak buli namalovani pikseli tak yak vin nikoli ne opuskayetsya nizhche radiusu na pershomu pikseli Tomu sho v bezperervnij funkciyi funkciya dlya sferi ye funkciyeyu dlya kola z radiusom sho zalezhit vid z abo nezalezhno vid tretoyi zminnoyi samo soboyu zrozumilo sho algoritm dlya diskretnoyi voxel sferi bude takozh spiratisya na cej algoritm okruzhnosti serednoyi tochki Ale pri poglyadi na sferu mozhe zdatisya sho cilochiselnij radius deyakih susidnih kil odnakovij ale vona ne bude mati tochno take zh kolo sho primikaye do sebe v tomu chisli pivkuli Zamist cogo dlya kola togo zh radiusa potriben inshij viznachnik shob kriva mogla prijti trohi blizhche do centru abo syagati dali Rozglyanuti krugovi diagrami sho vidnosyatsya do Minecraft yak viznachnik pererahovani nizhche vrahovuyut tilki odnu mozhlivist AlgoritmMeta algoritmu polyagaye v znahodzhenni shlyahu cherez pikselnu sitku vikoristovuyuchi pikseli yaki yakomoga blizhche do virnogo rishennya x 2 y 2 r 2 displaystyle x 2 y 2 r 2 Na kozhnomu kroci shlyah rozshireno shlyahom viboru sumizhnih pikseliv yaki zadovolnyayut x 2 y 2 lt r 2 displaystyle x 2 y 2 lt r 2 ale maksimizuye x 2 y 2 displaystyle x 2 y 2 Tak yak zaproponovani pikseli ye sumizhnimi arifmetichno obchisliti ostannij viraz staye legshe tomu sho neobhidni tilki bitovi zrushennya i dopovnennya Cej algoritm pochinayetsya z rivnyannyam kola Dlya prostoti pripustimo sho centr kola znahoditsya v 0 0 displaystyle 0 0 Rozglyanemo spochatku tilki pershij oktant i nakresliti krivu yaka pochinayetsya v tochci r 0 displaystyle r 0 i malyuyetsya proti godinnikovoyi strilki dosyagayuchi kuta 45 Shvidkij napryamok bazisnij vektor z velikim zbilshennyam znachennya ye napryamkom zminnoyi y displaystyle y Algoritm zavzhdi robit krok v pozitivnomu napryami vgoru y displaystyle y a inodi robit krok v povilnomu napryami vid yemnij x displaystyle x napryamok Z rivnyannya kola vihodit peretvorene rivnyannya x 2 y 2 r 2 0 displaystyle x 2 y 2 r 2 0 de r 2 displaystyle r 2 obchislyuyetsya tilki odin raz pid chas inicializaciyi Nehaj tochki na koli ce poslidovnist koordinat vektora v tochci v zvichajnomu bazisi Tochki pronumerovani vidpovidno do poryadku v yakomu tochka kreslitsya z n 1 displaystyle n 1 i prisvoyuyetsya pershij tochci r 0 displaystyle r 0 Dlya kozhnoyi tochki maye misce nastupne x n 2 y n 2 r 2 displaystyle begin aligned x n 2 y n 2 r 2 end aligned Ce mozhe buti zmineno takim chinom x n 2 r 2 y n 2 displaystyle begin aligned x n 2 r 2 y n 2 end aligned A takozh dlya nastupnoyi tochki x n 1 2 r 2 y n 1 2 displaystyle begin aligned x n 1 2 r 2 y n 1 2 end aligned Oskilki nastupna tochka zavzhdi bude prinajmni na odin piksel vishe nizh v minulomu ce pravda sho y n 1 2 y n 1 2 y n 2 2 y n 1 displaystyle begin aligned y n 1 2 amp y n 1 2 amp y n 2 2y n 1 end aligned x n 1 2 r 2 y n 2 2 y n 1 displaystyle begin aligned x n 1 2 r 2 y n 2 2y n 1 end aligned Takim chinom pererobki nastupnoyi tochki rivnyannya rekursivnim shlyahom zamini odnogo x n 2 r 2 y n 2 displaystyle x n 2 r 2 y n 2 x n 1 2 x n 2 2 y n 1 displaystyle begin aligned x n 1 2 x n 2 2y n 1 end aligned Cherez vlastivist bezperervnosti kola i tomu sho maksimumi po oboh osyah odnakovi ochevidno sho kolo ne bude propuskati h tochok tak yak algoritm prosuvayetsya v poslidovnosti Zazvichaj vin zalishayetsya na tih zhe koordinati h a inodi i viperedzhaye na odin Ostatochni koordinati rahuyutsya shlyahom dodavannya serednoyi tochki koordinat Ci cilochislenni dopovnennya ne obmezhuyut en tak yak ci kvadratni korin obchislennyav svoyu chergu mozhut buti pozbavleni u vnutrishnomu cikli Znovu zh nul v peretvorenomu rivnyanni kola zaminyuyetsya terminom pomilki Inicializaciya termina pomilki vivodyatsya z zmishennya pikselya na starti Do peretinu z perpendikulyarnoyu liniyeyu ce ne prizvodit do nakopichenogo znachennyam r displaystyle r v terminah pomilki tak sho ce znachennya vikoristovuyetsya dlya inicializaciyi Chasti obchislennya kvadrativ v rivnyanni kola trigonometrichnih viraziv i kvadratnih koreniv znovu mozhna uniknuti shlyahom rozbittya vsogo na okremi kroki i za dopomogoyu rekursivnogo obchislennya kvadratichnogo chlena vid poperednih iteracij Variant z cilochiselnoyu osnovoyu arifmetiki Tak samo yak i algoritm Brezenhejma cej algoritm mozhe buti optimizovanij dlya cilih chisel na osnovi matematiki Shlyahom simetri yaksho algoritm obchislit pikseli dlya odnogo oktanta voni mozhut buti vidobrazheni simmetrichno shob otrimati ves krug Mi pochnemo z viznachennya pohibki radiusa yaka skladaye riznicyu mizh tochnim uyavlennyam okruzhnosti i centralnoyu tochkoyu kozhnogo pikselya abo bud yaka insha dovilna matematichna tochka na pikseli Dlya kozhnogo pikselya z centrom v tochci x i y i displaystyle x i y i pohibka radiusu viznachayetsya yak R E x i y i x i 2 y i 2 r 2 displaystyle RE x i y i left vert x i 2 y i 2 r 2 right vert Dlya yasnosti cya formula dlya okruzhnosti otrimuyetsya dlya pochatku koordinat ale algoritm mozhe buti zminenij dlya bud yakogo miscya Bude korrektno pochati z tochki r 0 displaystyle r 0 na pozitivnij osi H Oskilki radius bude cilim chislom pikseliv ochevidno pohibka radiusu bude dorivnyuvati nulyu R E x i y i r 2 0 2 r 2 0 displaystyle RE x i y i left vert r 2 0 2 r 2 right vert 0 Cherez te sho vona pochinayetsya v pershomu pozitivnomu Oktanti ce bude krok u napryamku najbilshoyi tak skazati podorozhi u napryamku Y takim chinom zrozumilo sho y i 1 y i 1 displaystyle y i 1 y i 1 Okrim togo oskilki ce stosuyetsya tilki cogo Oktantu znachennya X maye tilki dva varianti zalishitisya takim zhe yak ranishe iteruvati zbilshiti abo zmenshiti na 1 Zminna rishennya mozhe buti stvorena shlyahom viznachennya chi bude spravedlivo nastupne R E x i 1 y i 1 lt R E x i y i 1 displaystyle RE x i 1 y i 1 lt RE x i y i 1 Yaksho cya nerivnist vikonana to vikonuyetsya taka diya x i 1 y i 1 displaystyle x i 1 y i 1 yaksho ni to x i y i 1 displaystyle x i y i 1 Otzhe yak viznachiti chi ye ce nerivnist Pochnemo z viznachennya pohibki radiusa R E x i 1 y i 1 lt R E x i y i 1 x i 1 2 y i 1 2 r 2 lt x i 2 y i 1 2 r 2 x i 2 2 x i 1 y i 2 2 y i 1 r 2 lt x i 2 y i 2 2 y i 1 r 2 displaystyle begin array lcl RE x i 1 y i 1 amp lt amp RE x i y i 1 left vert x i 1 2 y i 1 2 r 2 right vert amp lt amp left vert x i 2 y i 1 2 r 2 right vert left vert x i 2 2x i 1 y i 2 2y i 1 r 2 right vert amp lt amp left vert x i 2 y i 2 2y i 1 r 2 right vert end array Absolyutne znachennya funkciyi ne dopomagaye tomu pidnesemo do kvadratu z oboh storin tak yak kvadrat bud yakogo chisla zavzhdi pozitivnij x i 2 2 x i 1 y i 2 2 y i 1 r 2 2 lt x i 2 y i 2 2 y i 1 r 2 2 x i 2 y i 2 r 2 2 y i 1 1 2 x i 2 lt x i 2 y i 2 r 2 2 y i 1 2 x i 2 y i 2 r 2 2 y i 1 2 2 1 2 x i x i 2 y i 2 r 2 2 y i 1 1 2 x i 2 lt x i 2 y i 2 r 2 2 y i 1 2 2 1 2 x i x i 2 y i 2 r 2 2 y i 1 1 2 x i 2 lt 0 displaystyle begin array lcl left x i 2 2x i 1 y i 2 2y i 1 r 2 right 2 amp lt amp left x i 2 y i 2 2y i 1 r 2 right 2 left x i 2 y i 2 r 2 2y i 1 1 2x i right 2 amp lt amp left x i 2 y i 2 r 2 2y i 1 right 2 left x i 2 y i 2 r 2 2y i 1 right 2 2 1 2x i x i 2 y i 2 r 2 2y i 1 1 2x i 2 amp lt amp left x i 2 y i 2 r 2 2y i 1 right 2 2 1 2x i x i 2 y i 2 r 2 2y i 1 1 2x i 2 amp lt amp 0 end array STak yak h gt 0 termin 1 2 x i lt 0 displaystyle 1 2x i lt 0 takim chinom pid chas dilennya mi otrimuyemo 2 x i 2 y i 2 r 2 2 y i 1 1 2 x i gt 0 2 R E x i y i Y C h a n g e X C h a n g e gt 0 displaystyle begin array lcl 2 left x i 2 y i 2 r 2 2y i 1 right 1 2x i amp gt amp 0 2 left RE x i y i Y Change right X Change amp gt amp 0 end array Takim chinom kriterij rishennya zminyuyetsya vid vikoristannya operacij z plavayuchoyu komoyu do prostogo cilochiselnogo dodavannya vidnimannya i bitu zsuvu dlya operaciyi mnozhennya na 2 Yaksho 2 R E Y C h a n g e X C h a n g e gt 0 displaystyle 2 RE Y Change X Change gt 0 to mi zmenshuyemo znachennya X Yaksho 2 R E Y C h a n g e X C h a n g e 0 displaystyle 2 RE Y Change X Change leq 0 to zberigayemo take zh znachennya X Znovu zh vidobrazhayemo ci tochki na vsih oktantah otrimuyuchi povne kolo rezultativ Priklad na S Vishezgadanij algoritm realizovanij na movi programuvannya C i pokazanij nizhche Pochinayuchi z tochki r 0 displaystyle r 0 vin pererahovuye tochki v poryadku proti godinnikovoyi strilki dlya pershogo oktanta odnochasno vidobrazhayuchi tochki do inshih oktantiv void drawcircle int x0 int y0 int radius int x radius int y 0 int err 0 while x gt y putpixel x0 x y0 y putpixel x0 y y0 x putpixel x0 y y0 x putpixel x0 x y0 y putpixel x0 x y0 y putpixel x0 y y0 x putpixel x0 y y0 x putpixel x0 x y0 y if err lt 0 y 1 err 2 y 1 if err gt 0 x 1 err 2 x 1 Priklad na JavaScript Realizaciya yaka malyuye kolo na storinci HTML5 tilki dlya osvitnih cilej ye krashi sposobi malyuvati kola na storinkah const CHANNELS PER PIXEL 4 rgba function drawCircle x0 y0 radius canvas var x radius var y 0 var decisionOver2 1 x Decision criterion divided by 2 evaluated at x r y 0 var imageWidth canvas width var imageHeight canvas height var context canvas getContext 2d var imageData context getImageData 0 0 imageWidth imageHeight var pixelData imageData data var makePixelIndexer function width return function i j var index CHANNELS PER PIXEL j width i index points to the Red channel of pixel at column i and row j calculated from top left return index var pixelIndexer makePixelIndexer imageWidth var drawPixel function x y var idx pixelIndexer x y pixelData idx 255 red pixelData idx 1 0 green pixelData idx 2 255 blue pixelData idx 3 255 alpha while x gt y drawPixel x x0 y y0 drawPixel y x0 x y0 drawPixel x x0 y y0 drawPixel y x0 x y0 drawPixel x x0 y y0 drawPixel y x0 x y0 drawPixel x x0 y y0 drawPixel y x0 x y0 y if decisionOver2 lt 0 decisionOver2 2 y 1 Change in decision criterion for y gt y 1 else x decisionOver2 2 y x 1 Change for y gt y 1 x gt x 1 context putImageData imageData 0 0 Malyuvannya nepovnih oktantivNavedeni vishe realizaciyi zavzhdi malyuyut tilki povni oktanti abo kola Shob namalyuvati tilki pevnu dugu vid kuta a displaystyle alpha do b displaystyle beta algoritmu neobhidno spochatku obchisliti koordinati x displaystyle x i y displaystyle y cih kincevih tochok de neobhidno vdatisya do obchislen trigonometrichnogo abo kvadratnogo korenya div Kvadratnij korin Potim algoritm Bresenhejma vikonuyetsya po vsomu Oktantu abo po kolu i vstanovlyuye pikseli tilki v tomu vipadku yaksho voni potraplyayut v potribnij interval Pislya zakinchennya ciyeyi dugi algoritm mozhe buti pripinenij dostrokovo Yaksho kuti zadani yak shili to nemaye neobhidnosti v trigonometriyi abo kvadratnih korenyah prosto perevirte sho y x displaystyle y x znahoditsya mizh bazhanimi nahilami UzagalnennyaTakozh mozhna vikoristovuvati tu zh samu koncepciyu dlya rasterizaciyi paraboli elipsa abo bud yakoyi inshoyi dvovimirnoyi krivoyi ReferencesDonald Hearn M Pauline Baker Prentice Hall ISBN 978 0 13 161530 4 Arhiv originalu za 7 lipnya 2014 Procitovano 25 kvitnya 2017 Pitteway M L V Algoritm dlya kreslennya elipsa abo giperboli z cifrovimi plotterami Computer J 10 3 November 1967 pp 282 289 Van Aken J R Efektivnij algoritm dlya kreslennya elipsa CG amp A 4 9 September 1984 pp 24 35 Arhiv originalu za 30 kvitnya 2017 Procitovano 25 kvitnya 2017 Zovnishni posilannya Stattya pro malyuvannya kil yaka pohodit vid prostoyi shemi do efektivnoyi Algoritm okruzhnosti v deyakih movah programuvannya 5 travnya 2017 u Wayback Machine