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 | |
автоматическое закрытие: | |||
Заполнение Области: | |||
количество Точек: | |||
Соединения: | | | |
Точки перегиба: | |||
Изменения Вершин: |
О:
PolyLine | Polygon | PolyBé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 | все n | i = 0,3,6,9,12, и т.д. |
Изменения Вершин: | ни одной | ни одной | все, кроме точек перегиба |
В: Программа расчета Центра тяжести xs, ys Полигона 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 );
}