2D Векторная Графика


В: Нарисуйте по одному примеру Полигона с нумерацией вершин:
a) открытый Полигон = polyline
b) выпуклый Полигон
c) вогнутый Полигон
d) сложный Полигон

О: 


В: Объем памяти для хранения 2D-Полигона с N вершинами с координатами типа float?
О: Объем в байтах = N * 2 * SizeOf( float )

В: xy-Координаты Полигона почти всегда типа FLOAT или DOUBLE.
В каких случаях они имеют тип INTEGER ?

О: в экранных координатах, возвращаемых событиями OnMouseDown, OnMouseMove и т.д., при полигонизации растровой графики.

В: Дан Полигон, записанный в массиве p[n] типа Point или CPoint. Напишите мини-программу, которая рисует один Полигон на C# или C++ или Java.
О: на C#: Graphics g = CreateGraphics(); Pen mypen = new Pen( Color.Black,1 );
for ( int i = 0; i < n-1; i++ ) g.DrawLine( mypen, p[i], p[i+1] );

на C++: CClientDC dc(this);
dc.MoveTo( p[0] ); for ( int i = 1; i < n; i++ ) dc.LineTo( p[i] );

на Java: Graphics g = getGraphics();
for ( int i = 0; i < n-1; i++ ) g.drawLine( p[i].x, p[i].y, p[i+1].x, p[i+1].y );


В: Объяснение 2D-Графических команд: (Draw)PolyLine(Draw)Polygon и (Draw)PolyBezier ?

 PolyLine       Polygon       PolyBézier                 
автоматическое закрытие:   
Заполнение Области:   
количество Точек:   
Соединения: 
 
 
 
 
 
Точки перегиба:   
Изменения Вершин:   

О:

 PolyLinePolygonPolyBézier
автоматическое закрытие:нетданет
Заполнение Области:нетданет
количество Точек:n n n = 4,7,10,13, и т.д.
Соединения:n-1 Отрезки от
p[i] до p[i+1]
n-1 Отрезки от
p[i] до p[i+1]
n/3 Полином 3 степени. от
p[i] до p[i+3]
Точки перегиба:все nвсе ni = 0,3,6,9,12, и т.д.
Изменения Вершин:ни однойни однойвсе, кроме точек перегиба


В: Программа расчета Центра тяжести xsys Полигона  p[n] ?
О:

float xs = 0, ys = 0;
for ( int i = 0; i < n-1; i++ ){ xs += p[i].X; ys += p[i].Y; }
xs /= n-1; ys /= n-1;

В: Программа расчета Периметра Полигона  p[n] ?
О:

double umfang = 0;
for ( int i = 0; i < n-1; i++ )
{ double dx = p[i+1].X - p[i].X;
  double dy = p[i+1].Y - p[i].Y;
  umfang += sqrt( dx*dx + dy*dy );
}

В: Программа расчета площади Полигона  p[n] ?
О:

float flaeche = 0;
for ( int i = 0; i < n-1; i++ )
{ float dx =  p[i+1].X - p[i].X;
  float my = (p[i+1].Y + p[i].Y) / 2f;
  flaeche += dx * my;
}

В: Программа расчета описанного четырехугольника xmin,ymin,xmax,ymax Полигона p[n]?
О:

float xmin = p[0].X, ymin = p[0].Y, xmax = p[0].X, ymax = p[0].Y;
for ( int i = 1; i < n; i++ )
{ if ( p[i].X < xmin ) xmin = p[i].X;
  if ( p[i].X > xmax ) xmax = p[i].X;
  if ( p[i].Y < ymin ) ymin = p[i].Y;
  if ( p[i].Y > ymax ) ymax = p[i].Y;
}

В: Программа масштабирования Полигона  p[n] на значения zx и zy zoomt (Центр Полигона в xm,ym)?
О:

for ( int i = 0; i < n; i++ )
{ p[i].X = ( p[i].X - xm ) * zx + xm;
  p[i].Y = ( p[i].Y - ym ) * zy + ym;
}

В: Программа поворота Полигона p[n] на 17 градусов вокруг точки xm,ym?
О:

double arcus = (2 * Math.PI * 17) / 360;
float cosinus = (float)Math.Cos( arcus );
float sinus   = (float)Math.Sin( arcus );
for ( int i = 0; i < n; i++ )
{ float x = p[i].X - xm;
  float y = p[i].Y - ym;
  p[i].X = cosinus * x - sinus * y + xm;
  p[i].Y = sinus * x + cosinus * y + ym;
}

В: Определение объектов типа Brush и Pen (C# или C++ или Java) ?
О: C#: Brush mybrush = new SolidBrush(Color.Red); Pen mypen = new Pen(Color.Red,5);
C++/MFC: CPen mypen; CBrush mybrush; mypen.CreatePen( PS_SOLID, 5, RGB( 255,0,0 ) );
        mybrush.CreateSolidBrush( RGB( 255,0,0 ) );

Java: g.SetColor(Color.red); BasicStroke mypen = new BasicStroke( 5 ); Einen Brush kennt Java nicht.

В: Функция OnPaint, которая рисует диагонали между углами окна (C# или Java или C++)

protected override void OnPaint( PaintEventArgs e )
{ Graphics g = e.Graphics;
  ........................................
  Pen blackpen = new Pen( Color.Black, 4 );
  g.DrawLine( ......................................... );
  g.DrawLine( ......................................... );
}
О:
protected override void OnPaint( PaintEventArgs e )
{ Graphics g = e.Graphics;
  Rectangle cr = ClientRectangle;
  Pen blackpen = new Pen( Color.Black, 4 );
  g.DrawLine( blackpen, 0, 0, cr.Width, cr.Height );
  g.DrawLine( blackpen, cr.Width, 0, 0, cr.Height );
}

В: Функция OnPaint, которая рисует заполненный Эллипс (с черной границей толщиной 4, залитым случайным цветом) отцентровано  (отступ от всех границ 20%). (C# или Java или C++)

protected override void OnPaint( PaintEventArgs e )
{ Graphics g = e.Graphics;
  .......................................
  Pen blackpen = new Pen( Color.Black, 4 );
  Random r = new Random();
  Byte red   = ..............................
  Byte green = ..............................
  Byte blue  = ..............................
  Brush brush = new SolidBrush( .................................... );
  g.FillEllipse( brush   ,......................................................... );
  g.DrawEllipse( blackpen,......................................................... );
}
О:
protected override void OnPaint( PaintEventArgs e )
{ Graphics g = e.Graphics;
  Rectangle cr = ClientRectangle;
  Pen blackpen = new Pen( Color.Black, 4 );
  Random r = new Random();
  Byte red   = (Byte)r.Next( Byte.MaxValue );
  Byte green = (Byte)r.Next( Byte.MaxValue );
  Byte blue  = (Byte)r.Next( Byte.MaxValue );
  Brush brush = new SolidBrush( Color.FromArgb( red, green, blue ) );
  g.FillEllipse( brush   , cr.Width/5, cr.Height/5, (3*cr.Width)/5, (3*cr.Height)/5 );
  g.DrawEllipse( blackpen, cr.Width/5, cr.Height/5, (3*cr.Width)/5, (3*cr.Height)/5 );
}

В: Функция OnPaint, которая рисует из центра окна звезду из 360 линий случайной длины случайных цветов.

protected override void OnPaint( PaintEventArgs e )

{ Double radius_x, radius_y, arcus_1, arcus_i, factor, sinus, cosinus;

  Rectangle cr = ClientRectangle;
  radius_x = .................;//половинаширины
    radius_y = .................;//половинавысоты
  int mid_x = (int)radius_x;

  int mid_y = (int)radius_y;
  arcus_1 = ..................;//1 градусврадианах
  Random r = new Random();
  for ( int i ................ )// на каждый градус круга
  { Pen mypen  = new Pen( Color.FromArgb( r.Next( 255 ), r.Next( 255 ), r.Next( 255 ) ), 1 );
    factor = ...........................................//Случайный между 
0.25 и 1

    arcus_i = ..........................................//текущий угол
    cosinus = ..........................................//прилежащий катет
    sinus   = ..........................................//противолежащий 
катет

    e.Graphics.DrawLine( mypen, 

..........................................................);

    mypen.Dispose();

  }

}


О:

protected override void OnPaint( PaintEventArgs e )
{ Double radius_x, radius_y, arcus_1, arcus_i, factor, sinus, cosinus;
  Rectangle cr = ClientRectangle;
  radius_x = cr.Width  / 2;
  radius_y = cr.Height / 2;
  int mid_x = (int)radius_x;
  int mid_y = (int)radius_y;
  arcus_1 = 2.0 * Math.PI / 360.0;
  Random r = new Random();
  for ( int i=0; i < 360; i++ )
  { Pen mypen  = new Pen( Color.FromArgb( r.Next( 255 ), r.Next( 255 ), r.Next( 255 ) ), 1 );
    factor = Math.Max( 0.25, r.NextDouble() );
    arcus_i = arcus_1 * i;
    cosinus = radius_x * factor * Math.Cos( arcus_i );
    sinus   = radius_y * factor * Math.Sin( arcus_i );
    e.Graphics.DrawLine( mypen, mid_x, mid_y, mid_x + (int)cosinus, mid_y + (int)sinus );
    mypen.Dispose();
  }
}

В: Минимальная рисовалка на C# со следующими глобальными переменными:

int x0, y0;
Graphics g = CreateGraphics();
Pen mypen  = new Pen( Color.Red, 5 );
О:
protected override void OnMouseDown( MouseEventArgs e )
{ x0 = e.X; y0 = e.Y;
}
protected override void OnMouseMove( MouseEventArgs e )
{ if ( e.Button == MouseButtons.None ) return;
  g.DrawLine( mypen, x0, y0, e.X, e.Y );
  x0 = e.X; y0 = e.Y;
}

В: Что такое XAML и SVG ?

 XAML                         SVG                      
Сокращение от: 
Владелец:
 
содержится в:
 
поддержка через PlugIn:
 
Перспектива:  

О:

 XAML                         SVG                      
Сокращение от: Extensible Application Markup Language Scalable Vector Graphics
Владелец: Microsoft Adobe
содержится в: Internet Explorer от Ver. 7.0 Mozilla Firefox от Ver. 2.0
поддержка через PlugIn: Microsoft для всех браузеров Adobe для всех браузеров
Перспектива: стандартизируется исчезнет


Как и Flash (Macromedia) формат SVG и XBAP (=XAML Browser Applications) построены для хранения и отображения векторной графики в WEB-е. В отличии от Flash эти стандарты базируются на XML. XAML функционально сильнее, чем SVG, т.к. поддерживает 3D и User Interfaces для Windows Presentation Foundation WPF.

В: a) Что такое Полигон? b) Что такое Полином? c) Как Полином связан с Полигоном?
О
a) упорядоченный набор Вертексов (xi,yi) - Вертексы (x0,y0), (x1,y1), ... (xi,yi) ... (xn,yn)
b) функция типа Прямой или Параболы, Funktion vom Typ Gerade oder Parabel или 2-х перегибов или 3-х перегибов и т.д. - y = an-1*xn-1 + an-2*xn-2 + an-3*xn-3 + ..... + a2*x2 + a1*x + a0
c) Полином аппроксимирует или интерполирует Полигон. 

простые примеры:

Прямая =
Полином 1-й степени =
y = a*x + b
не имеет изгибов и определяется по двум точкам.
    Парабола =
Полином 2-й степени =
y = a*x2 + b*x + c
имеет один изгиб и определяется по трем точкам.
    кубический Полином =
Полином 3-й степени =
y = a*x3 + b*x2 + c*x + d
имеет два перегиба  и определяется четырьмя точками.


В: Что такое a) Аппроксимация и b) Интерполяция? Приведите по два примера.
О
a) Приближение: процесс определения функции, которая не смотря на свою жесткость, максимально приближается ко множеству узловых точек.
Пример 1: определить прямую, проходящую через множество (облако) точек так, что сумма отклонений данных точек от прямой будет минимальной.
Пример 2: определить коэффициенты a3, a2, a1, a0 Полинома y = a3*x³ + a2*x² + a1*x + a0, с помощью 4-х точек, так чтобы кривая прошла через первую и последнюю точки, а две средние определили два ее изгиба.
b) Заполнение между полюсами: Кривая не имеет никакой жесткости, и соединяет все заданные точки, т.е. Интерполяция - это поиск промежуточных точек между двумя или более Вершинами. Простейший пример линейной Интерполяции = рисование растрового отрезка = g.DrawLine( mypen, x0, y0, x1, y1 );.


В: Что подразумевается под кривой Бизье? Главное применение?
О: Аппроксимация n-вершинного Полигона через Полином[n-1]степени. Главное применение = Аппроксимация 4-х последовательных точек через кубический Полином в векторных шрифтах - True Type Fonts = TTF и PostScript Fonts.

В: Прямая проходящая через две точки x0,y0 и x1,y1 в параметрической форме?
О: x = x0 + t * ( x1 - x0 )
   y = y0 + t * ( y1 - y0 )

В: Программа, интерполяции 100 равноотстоящих точек между заданными вершинами x0,y0 и x1,y1?
О: 
float[] x = new Single[100]; float[] y = new Single[100];
for ( int i=0; i < 100; i++ )
{ float t = i * 0.01f;
  x[i] = x0 + t * ( x1 - x0 );
  y[i] = y0 + t * ( y1 - y0 );
}

В: Программа интерполяции окружности 100 равноотстоящих точек. Окружность с радиусом r и центром xm,ym ?
О: 
float[] x = new Single[100]; float[] y = new Single[100];
for ( int i=0; i < 100; i++ )
{ double arcus = 2.0 * Math.PI * i * 0.01;
  x[i] = xm + r * (Single)Math.Cos( arcus );
  y[i] = ym + r * (Single)Math.Sin( arcus );
}