Геометричен примитив
Геометричен примитив представлява проста геометрична форма.
Геометричен примитиви се разделят на примитиви на ниско ниво (точка и отсечка) и примитиви на високо ниво (затворени многоъгълниции отворени многоъгълници). Точката е графичен примитив описван с двойка координати – X, Y при 2D графиката и X,Y,H при 3D графиката. Отсечката се описва с крайна и начална точка (X1, Y1) и (X2, Y2) при 2D графиката, (X1,Y1,H1) и (X2,Y2,H2) при 3D графиката. Тази информация е достатъчна за определяне на дължината и посоката на отсечката. Към затворените многоъгълници се отнасят – триъгълници, класически многоъгълници, окръжности и елипси. Към отврорените многоъгълницисе отнасят – дъги, параболи и полилиния.
Геометрично моделиране
[редактиране | редактиране на кода]Преди всичко трябва да бъдат определени атрибутните класове формиращи геометричната информация. Реалните обекти, притежаващи така определените свойства, се наричат физически обекти. На второ място трябва да бъдят определени онези математически обекти, които са модели на разглежданите реални обекти по отношение на геометричната информация. При втория етап се създават информатични модели, които представляват математически обектиописани със средствата на информатиката.
Геометрична информация
[редактиране | редактиране на кода]Реалните тримерни твърди тела притежават безброй много свойства, но от гледна точка на геометричното моделиране, само някои от тях са съществени, т.е. само някои свойства трябва да присъстват като като атрибути в създаваните модели,
- ограниченост – всяко тяло заема някаква ограничена част от пространството в което се намира
- еднозначност на границата – границата трябва да определя еднозначно вътрешността на тялото, не може едновременно дадена част от пространството да бъде определена като принадлежаща и непринадлежаща на тялото
- хомогенна тримерност – всяка граница трябва да обхваща вътрешността
- свързаност – всяка точка от вътрешността може да достигне до произволна друга точка без да пресича границата
- твърдост – телата могат да се местят в пространството без да променят формата или размерите си
Трансформации и проекции
[редактиране | редактиране на кода]Матрицата М се нарича трансформационна матрица.
Транслация
[редактиране | редактиране на кода]Матриците и се наричат съответно права и обратна матрица на транслация.
Транслацията не влияе върху координатите на вектор. Тя променя само местоположението на точката, но разстоянието, между две точки, подложени на една и съща транслация се запазва.
Мащабиране
[редактиране | редактиране на кода]Матриците и , се наричат съответно права и обратна матрица на мащабиране. Тук u,v,w се наричат мащабни множители и трябва да бъде изпълнено u>0, v>0, w>0
Мащабирането променя дължината на вектор, т.е. множеството от точки, подложено на мащабиране се „разширява“, ако мащабните множители са по-големи от 1, и се „свива“ ако мащабните множители са по-малки от 1.
Отражение
[редактиране | редактиране на кода]Матриците , , се наричат матрици на огледално отражение спрямо координатните равнини.
Това преобразование се използва за преминаване от ляво ориентирана към дясно ориентирана координатна система и обратно.
Алгоритми
[редактиране | редактиране на кода]Алгоритми за визуализация на графични примитиви.
Линия
[редактиране | редактиране на кода]void Line(const float x1, const float y1, const float x2, const float y2, const Color& color)
{
const bool steep = (fabs(y2 – y1) > fabs(x2 – x1));
if(steep)
{
std::swap(x1, y1);
std::swap(x2, y2);
}
if(x1 > x2)
{
std::swap(x1, x2);
std::swap(y1, y2);
}
const float dx = x2 – x1;
const float dy = fabs(y2 – y1);
float error = dx / 2.0f;
const int ystep = (y1 < y2) ? 1 : -1;
int y = (int)y1;
const int maxX = (int)x2;
for(int x=(int)x1; x<maxX; x++)
{
if(steep)
{
SetPixel(y,x, color);
}
else
{
SetPixel(x,y, color);
}
error -= dy;
if(error < 0)
{
y += ystep;
error += dx;
}
}
}
Кръг
[редактиране | редактиране на кода]void DrawCircle(int x0, int y0, int radius)
{
int x = radius, y = 0;
int xChange = 1 – (radius << 1);
int yChange = 0;
int radiusError = 0;
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++;
radiusError += yChange;
yChange += 2;
if(((radiusError << 1) + xChange) > 0)
{
x--;
radiusError += xChange;
xChange += 2;
}
}
}
Източници
[редактиране | редактиране на кода]- Димчо Димов, Компютърна графика, Университетско издателство ПУ „Паисий Хилендарски“, 1999 г.