Математические основы компьютерной графики 1. Геометрическое моделирование в компьютерной графике. 2. Координатный метод и системы координат. 3. Двумерные аффинные преобразования. Аффинные преобразования Все изменения изображений можно выполнить с помощью трех базовых операций: поворот; масштабирование; отражение; перенос (смещение). 2D аффинные преобразования Переход от одной декартовой системы координат на плоскости к другой описывается следующими соотношениями: x' x y , y ' x y , где ,,, - произвольные числа, но (*) 0 2D аффинные преобразования x' x y , y ' x y , Изменяется точка, и сохраняется координатная система – формула задает отображение, переводящее Y произвольную точку М(x,y) в точку M(x’,y’), координаты которой определены в той M O M’ X же координатной системе. 2D аффинные преобразования Y I. Поворот (вокруг начальной точки на угол ) описывается формулами: xM ' xM cos( ) yM sin( ), yM ' xM ( sin( )) yM cos( ). M’ cos sin sin cos M X ( xM , yM ) (3, 0) 0 cos 2 ( xM ' , yM ' ) (3, 0) sin 2 sin 2 (3, 0) 0 1 (0, 3) 1 0 cos 2 2D аффинные преобразования II. Масштабирование вдоль координатных осей: x ' x, y ' y. 0, 0. 0 0 ( xM1 , yM 1 ) (1, 2); ( xM 2 , y M 2 ) (3, 4) 0 0 (3 , 4 ) ( xM ' , yM ' ) (1, 2) ( , 2 ); ( xM 2' , yM 2' ) (3, 4) 1 1 0 0 2D аффинные преобразования III. Отражение относительно оси абсцисс задается при помощи формул: x ' x, y ' y. 1 0 0 1 ( xM , yM ) (3, 2) 1 0 ( xM ' , yM ' ) (3, 2) (3, 2) 0 1 2D аффинные преобразования IV. Перенос обеспечивают соотношения: x' x , y' y . M’ Y M X O 2D аффинные преобразования Для применения перечисленных выше преобразований в задачах КГ применяется их матричная запись: cos sin sin , cos 0 0 , 1 0 0 1 Однородные координаты Однородными координатами точки M(x,y) называется тройка одновременно не равных нулю чисел x1 , x 2 , x3 , если: x1 x2 x , y . x3 x3 Однородные координаты Точке М(x, y) ставится в соответствие точка М’(x, y, 1) в Z пространстве. M’(x,y,1) 1 соединяющей начало координат, Y M(x, y) 0 X Произвольная точка на прямой, точку О(0,0,0), с точкой М’(x, y, 1), может быть задана тройкой (hx, hy, h). Исключая точку О из рассмотрения, будем считать, что h0. Однородные координаты Считая h=1 выражение переписать в виде: 0 ( x' , y ' ,1) ( x, y,1) 0 1 x' или y ' 1 (*) можно 0 x 0 y 1 1 Матрица 2D вращения (поворота) cos R sin 0 sin 0 cos 0 0 1 Матрица 2D масштабирования 0 0 D 0 0 0 0 1 Матрица 2D отражения 1 0 0 M 0 1 0 0 0 1 Матрица 2D переноса (сдвига) 1 T 0 0 1 0 1 0 ПРИМЕР 1 Построить матрицу растяжения с коэффициентом растяжения вдоль оси абсцисс и δ вдоль оси ординат и с центром в точке А(а,b). Шаг 1 Перенос на вектор –А(–а,–b) для смещения центра растяжения с началом координат: 0 0 1 T А 0 1 0 a b 1 Шаг 2 Растяжение вдоль координатных осей с коэффициентами и . Матрица преобразования имеет вид: 0 0 D 0 0 0 0 1 Шаг 3 Перенос на вектор А(а,b) для возвращения центра растяжения в прежнее положение: 1 0 0 TА 0 1 0 a b 1 Ответ: Перемножив матрицы в том же порядке , получим вид нашего преобразования: T A D TA 0 0 ( x' , y' ,1) ( x, y,1) 0 0 a (1 ) b (1 ) 1 Пример 2 Построить двумерное изображение фигуры. Выполнить сдвиг относительно оси x и оси y. ( x0 , y0 ,1) (3, 2, 1); ( x1 , y1 ,1) (1, 6, 1); ( x2 , y2 ,1) (8, 2, 1); ( x3 , y3 ,1) (8, 6, 1); 3 1 А 8 8 2 1 6 1 2 1 6 1 Отрисовка 2D фигуры function SistCoord(a:vertex):vertex; begin PatBlt(Form1.Canvas.Handle,0,0,Form1.ClientWidth,Form1.ClientHeight,WHITE NESS); Form1.Canvas.MoveTo(0,round(Form1.ClientHeight/2)); Form1.Canvas.LineTo(round(Form1.ClientWidth),round(Form1.ClientHeight/2)); Form1.Canvas.MoveTo(round(Form1.ClientWidth/2),0); Form1.Canvas.LineTo(round(Form1.ClientWidth/2),round(Form1.ClientHeight)); Form1.Canvas.MoveTo(a[0,0],a[0,1]); Form1.Canvas.LineTo(a[1,0],a[1,1]); Form1.Canvas.LineTo(a[2,0],a[2,1]); Form1.Canvas.LineTo(a[3,0],a[3,1]); Form1.Canvas.LineTo(a[0,0],a[0,1]); end; Отрисовка 2D фигуры Сдвиг фигуры С А TA 3 1 С 8 8 2 1 1 0 0 6 1 0 1 0 ? 2 1 2 1 1 6 1 Сдвиг фигуры 5 3 С 10 10 3 1 7 1 3 1 7 1 Умножение матриц function mult(a:vertex;b:change):vertex; var i,j,k:integer; Begin for i:=0 to 3 do begin for j:=0 to 2 do for k:=0 to 2 do c[i,j]:=c[i,j]+a[i,k]*b[k,j]; end; end; Сдвиг фигуры procedure TForm1.sdvig1Click(Sender: TObject); begin mult(a,sd); SistCoord(c); end; Сдвиг фигуры Спасибо за внимание!