Направо към съдържанието

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

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

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

Геометричен примитиви се разделят на примитиви на ниско ниво (точка и отсечка) и примитиви на високо ниво (затворени многоъгълниции отворени многоъгълници). Точката е графичен примитив описван с двойка координати – 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 г.