Геометричен примитив

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене
Видове графични примитиви

Геометричен примитив представлява проста геометрична форма.

Геометричен примитиви се разделят на примитиви на ниско ниво (точка и отсечка) и примитиви на високо ниво (затворени многоъгълниции отворени многоъгълници). Точката е графичен примитив описван с двойка координати - X, Y при 2D графиката и X,Y,H при 3D графиката. Отсечката се описва с крайна и начална точка (X1, Y1) и (X2, Y2) при 2D графиката, (X1,Y1,H1) и (X2,Y2,H2) при 3D графиката. Тази информация е достатъчна за определяне на дължината и посоката на отсечката. Към затворените многоъгълници се отнасят - триъгълници, класически многоъгълници, окръжности и елипси. Към отврорените многоъгълницисе отнасят - дъги, параболи и полилиния.

Геометрично моделиране[редактиране | edit source]

Преди всичко трябва да бъдат определени атрибутните класове формиращи геометричната информация. Реалните обекти, притежаващи така определените свойства се наричат физически обекти. На второ място трябва да бъдят определени онези математически обекти, които се явяват модели на разглежданите реални обекти по отношение на геометричната информация. При вторият етап се създават информатични модели, които представляват математически обектиописани с средствата на информатиката.

Геометрична информация[редактиране | edit source]

Реалните тримерни твърди тела притежават безброй много свойства, но от гледна точка на геометричното моделиране, само някои от тях са съществени, т.е. само някои свойства трябва да присъстват като като атрибути в създаваните модели,

  • ограниченост - всяко тяло заема някаква ограничена част от пространството в което се намира
  • еднозначност на границата - границата трябва да определя еднозначно вътрешността на тялото, неможе едновременно дадена част от пространството да бъде определена като принадлежаща и непринадлежаща на тялото
  • хомогенна тримерност - всяка граница трябва да обхваща вътрешността
  • свързаност - всяка точка от вътрешността може да достигне до произволна друга точка без да пресича границата
  • твърдост - телата могат да се местят в пространството без да променят формата или размерите си

Трансформации и проекции[редактиране | edit source]

Матрицата М се нарича трансформационна матрица. 
M_{4,4} =
 \begin{pmatrix}
  a & b & c & p \\
  d & e & f & q \\
  g & i & j & r \\
  1 & m & n & s
 \end{pmatrix}

Транслация[редактиране | edit source]

Матриците T_{(1,m,n)} и T^{-1}_{(1,m,n)} се наричат съответно права и обратна матрица на транслация.


T_{(1,m,n)} = 
\begin{pmatrix}
  1 & 0 & 0 & 0 \\
  0 & 1 & 0 & 0 \\
  0 & 0 & 1 & 0 \\
  1 & m & n & 1
 \end{pmatrix}

T^{-1}_{(1,m,n)} = 
\begin{pmatrix}
  1 & 0 & 0 & 0 \\
  0 & 1 & 0 & 0 \\
  0 & 0 & 1 & 0 \\
  -1 & -m & -n & 1
 \end{pmatrix}

Транслацията не влияе върху координатите на вектор. Тя променя само местоположението на точката, но разстоянието, между две точки, подложени на една и съща транслация се запазва.

Мащабиране[редактиране | edit source]

Матриците S_{(u,v,w)} и S^{-1}_{(u,v,w)} , се наричат съответно права и обратна матрица на мащабиране. Тук u,v,w се наричат мащабни множители и трябва да бъде изпълнено u>0, v>0, w>0


S_{(u,v,w)} = 
\begin{pmatrix}
  u & 0 & 0 & 0 \\
  0 & v & 0 & 0 \\
  0 & 0 & w & 0 \\
  0 & 0 & 0 & 1
 \end{pmatrix}

S^{-1}_{(u,v,w)} = 
\begin{pmatrix}
  \frac{1}{u} & 0 & 0 & 0 \\
  0 & \frac{1}{v} & 0 & 0 \\
  0 & 0 & \frac{1}{w} & 0 \\
  0 & 0 & 0 & 1
 \end{pmatrix}

Мащабирането променя дължината на вектор, т.е. множеството от точки, подложено на мащабиране се "разширява", ако мащабните множители са по-големи от 1, и се "свива" ако мащабните множители са по-малки от 1.

Отражение[редактиране | edit source]

Матриците O_{xy}, O_{xz}, O_{yz} се наричат матрици на огледално отражение спрямо координатните равнини.


O_{xy} =
 \begin{pmatrix}
  1 & 0 & 0 & 0 \\
  0 & 1 & 0 & 0 \\
  0 & 0 & -1 & 0 \\
  0 & 0 & 0 & 1
 \end{pmatrix}

O_{xz} =
 \begin{pmatrix}
  1 & 0 & 0 & 0 \\
  0 & -1 & 0 & 0 \\
  0 & 0 & 1 & 0 \\
  0 & 0 & 0 & 1
 \end{pmatrix}

O_{yz} =
 \begin{pmatrix}
  -1 & 0 & 0 & 0 \\
  0 & 1 & 0 & 0 \\
  0 & 0 & 1 & 0 \\
  0 & 0 & 0 & 1
 \end{pmatrix}

Това преобразувание се използва за преминаване от ляво ориентирана към дясно ориентирана координатна система и обратно.

Алгоритми[редактиране | edit source]

Алгоритми за визуализация на графични примитиви.

Линия[редактиране | edit source]

Линия
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;
	        }
	}
}

Кръг[редактиране | edit source]

Кръг
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;
    }
  }
}

Източници[редактиране | edit source]

  • Димчо Димов, Компютърна графика, Университетско издателство ПУ "Паисий Хилендарски", 1999 г.

Вижте също[редактиране | edit source]

Външни препратки[редактиране | edit source]