Хід роботи
У растрових системах прямі лінії будуються за допомогою пікселів, а розмір кроку в горизонтальному і вертикальному напрямках обмежується розбіжністю пікселів. Це означає, що потрібно "провести вибірку" точок прямої лінії з дискретними значеннями і визначити пікселі, найближчі до даної прямої для кожного елементу вибірки. У середовищі VC розглянемо алгоритми перетворення стандартів розгортки прямої. 1. Цифровий диференційний аналізатор (ЦДА) — це алгоритм перетворення стандартів розгортки прямої лінії, оснований на обчисленні або за рівнянням або за рівнянням . Пряма розбивається на одиничні відрізки по одній координаті, а для іншої координати визначаються відповідні цілі значення, найближчі до даної прямої. #include <stdlib.h> #include <math.h> inline int round (const float а) { return int (а + 0.5); } void lineDDA (int x0, int y0, int xEnd, int yEnd){ int dx = xEnd-x0, dy = yEnd-y0, steps, k; float xIncrement, yIncrement, x = x0, y = y0; if (abs (dx) > abs (dy)) steps = abs (dx); else steps = abs (dy); xIncrement = float (dx) / float (steps); yIncrement = float (dy) / float (steps); setPixel (round (x), round (y)); for (k =0; k < steps; k++){ x += xIncrement; y += yIncrement; setPixel (round (x), round (y)); } } 2. Растровий алгоритм створення прямих ліній розроблений Брезенхемом (Bresenham), у ньому обчислюються тільки цілочислові значення приростів. Крім того, алгоритм побудови прямих Брезенхема можна адаптувати для зображення кіл та інших кривих. Реалізація алгоритму побудови прямої лінії Брезенхема для тангенса кута нахилу в діапазоні 0 < т < 1 наведена в наступній процедурі. Тут вводяться координати кінців відрізка, а пікселі відображаються від лівого кінця до правого. #include <stdlib.h> #include <math.h> /* Процедура побудови відрізка (Брезенхема) для |m|<1,0.*/ void lineBres (int x0, int y0, int xEnd, int yEnd){ int dx = abs (xEnd-x0), dy = abs(yEnd-y0); int p = 2 * dy - dx; int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy-dx); int x, y; /*Визначається, який кінець взяти як початкове *положення. */ if (x0 > xEnd) { x = xEnd; y = yEnd; xEnd = x0; } else { x = x0; y = y0; } setPixel (x, y); while (x < xEnd) { х++; if (P < 0) р += twoDy; else { y++; р += twoDyMinusDx;} setPixel (x, y); } } /* Процедура для відображення точки*/ Void setPixel (int xCoord, int yCoord){ glBegin (GL_POINTS); glVertex2i(xCoord, yCoord); glEnd(); }
|