Применение аффинных преобразований к сдвигу, повороту, переносу, отражению, и проектирования, 2x- и 3x-мерного изображения

Страницы работы

Содержание работы

7.160101.1381.03

Зм.

Лист

№ Докум

Підпис

Дата

Лабораторная работа №3

Аффинные преобразования в 2x- и 3x-мерной графики.

Лim

Лисm

Листів

Студент

20.04

1

6

НУК

Викладач

 Покровский

Лабораторная работа №3

          Тема:  Применение аффинных преобразований к сдвигу, повороту, переносу, отражению, и проектирования, 2x- и 3x-мерного изображения.

          Цель: изучить основные приёмы работы с изображением в аффинной системе координат.

Теоретические сведения

Аффинным называется такое изображения плоскости (пространства) в другой плоскости (пространстве), при котором каждая прямая отображается в прямую. Библиотека  OpenGL содержит в себе функции и процедуры, для работы с аффинными преобразованиями.

glTranslated(dx, dy, dz: Тип_переменных) – процедура переноса системы координат.

    Синтаксис dx, dy, dz”: обозначения осей координат.

    Синтаксис Тип_переменных: обозначения типа координат (double, float, shortint, integer).

glRotated (Angle, x, y, z: Тип_переменных) – процедура разворота системы координат.

    Синтаксис x, y, z”: обозначения радиус-вектора.

    Синтаксис Angle: обозначения  поворота.

glScaled(kx, ky, kz: Тип_переменных) – процедура масштабирования.

    Синтаксис kx, ky, kz”: обозначения коэффициента масштабирования.

Задание 1

          Вывести на экран изображение стрелки и проверить работу процедуру OpenGL.

Задание 2

          С применением OpenGL написать процедуру для вывода окружности с центром в начале координат и радиусом 1.

Задание 3

          Путём преобразований координат и вызова написанной процедуры вывести на экран несколько окружностей в разных позициях и с разным радиусом.

Программа

unit unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

    Forms,Dialogs, ExtCtrls, OpenGL;

type

  TGraphik = class(TForm)

    Painting: TPaintBox;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure The_FormPaint (Sender: TObject);

  private

  public

       hrc: HGLRC;

  end;

Лист

2

Зм.

Лист

№ Докум

Підпис

Дата

var

  Graphik: TGraphik;

implementation

{$R *.dfm}

procedure SetDCPixelFormat(hdc: HDC);

var pfd: TPixelFormatDescriptor;

nPixelFormat: integer;

begin

  FillChar (pfd, SizeOf(pfd), 0);

  nPixelFormat:=ChoosePixelFormat(hdc, @pfd);

  SetPixelFormat(hdc, nPixelFormat, @pfd);

end;

procedure TGraphik.FormCreate(Sender: TObject);

begin

   SetDCPixelFormat(Canvas.Handle);

   hrc:=wglCreateContext(Canvas.Handle);

end;

procedure TGraphik.FormDestroy(Sender: TObject);

begin

   wglDeleteContext(hrc);

end;

procedure TGraphik.The_FormPaint (Sender: TObject);

Procedure Risovka_Kruga;

var

    j:word;

    x:real;

Begin

    glLineWidth(2);

    glEnable(GL_LINE_SMOOTH);

    glBegin(GL_LINE_STRIP);

      For j:=0to 359do Begin

        x:=j/180*Pi;

        glVertex2f(cos(x),sin(x));

      End;

    glEnd;

    glDisable(GL_LINE_SMOOTH);

    glLineWidth(1);

End;

Begin

  wglMakeCurrent(Canvas.Handle, hrc);

    glClearColor(0.95, 0.95, 0.95, 1);

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3d(1,1,1);

    glColor3d(0.1,0.1,0.1);

    glPushMatrix;

    Risovka_Kruga;

    glRotated(10,0,0,1);

    glTranslated(0.5, 0.5, 0);

    glScaled(0.1, 0.1, 1);

    Risovka_Kruga;

    glTranslated(-10, 0, 0);

    Risovka_Kruga;

    glTranslated(5, -1, 0);

Лист

3

Зм.

Лист

№ Докум

Підпис

Дата

    glScaled(1, 3, 1);

    Risovka_Kruga;

    glTranslated(0, -3, 0);

    glScaled(5, 0.5, 1);

    Risovka_Kruga;

    glPopMatrix;

  wglMakeCurrent(0,0);

End;

End.

Графическое изображение

Задание 4

          Переделать процедуру рисования графика с предыдущей лабораторной работы так, что по заданному интервалу изменения координаты х автоматически определялись необходимые границы выводу по y координате и на форму выведения всего графика функции в целом.

Программа

Procedure TGraphik.The_FormPaint (Sender: TObject);

Const E=200;

var

    yMax,yMin,x,xMax,xMin,k,xPMax,xPMin,yPMax,yPMin,yP,xP:Real;

    j:integer;

    y:Array[0..E]Of Real;

Begin

  xMax:=-10;

  xMin:=2.96;

  If xMax<xMin then Begin

    k:=xMin;xMin:=xMax;xMax:=k;

  End;

  k:=Xmax-xMin;

Лист

4

Зм.

Лист

№ Докум

Підпис

Дата

  yMax:=0;

  yMin:=0;

  For j:=0to E do Begin

    x:=xMin+k*j/E;

    y(.j.):=2*sqr(sin(x))/(x-3);

    If y(.j.)>yMax

      then yMax:=y(.j.);

    If y(.j.)<yMin

      then yMin:=y(.j.);

  End;

  If xMax<-xMin*0.05then xPMax:=-xMin*0.05 else xPMax:=xMax;

  If xMin>-xMax*0.05then xPMin:=-xMax*0.05 else xPMin:=XMin;

  If yMax<-yMin*0.05then yPMax:=-yMin*0.05 else yPMax:=yMax;

  If yMin>-yMax*0.05then yPMin:=-yMax*0.05 else yPMin:=yMin;

  xP:=1/(xPMin/(xPMax+xPMin)-xPMax/(xPMax+xPMin));

  yP:=1/(yPMin/(yPMax+yPMin)-yPMax/(yPMax+yPMin));

  wglMakeCurrent(Canvas.Handle, hrc);

    glPushMatrix;

    glClearColor(0.2, 0.5, 0.75, 1.0);

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3d(1,1,1);

    glTranslated(xP, yP, 0);

    glEnable(GL_LINE_STIPPLE);

    glLineStipple(1,$F00F);

    glBegin(GL_LINES);

      For j:=-9to 9do Begin

        glVertex2f(j*0.2, 2);

        glVertex2f(j*0.2, -2);

        glVertex2f(2, j*0.2);

        glVertex2f(-2, j*0.2);

      End;

    glEnd;

   glDisable(GL_LINE_STIPPLE);

    glBegin(GL_LINES);

      glColor3d(0,0,0);

      glVertex2f(2, 0);

      glVertex2f(-2, 0);

      glVertex2f(0, 2);

      glVertex2f(0, -2);

    glEnd;

    glBegin(GL_LINE_STRIP);

      glVertex2f(0.96-xP, 0.015);

      glVertex2f(1-xP, 0);

      glVertex2f(0.96-xP, -0.015);

    glEnd;

    glBegin(GL_LINE_STRIP);

      glVertex2f(0.015, 0.96-yP);

      glVertex2f(0, 1-yP);

      glVertex2f(-0.015, 0.96-yP);

    glEnd;

    glScaled(2/(xPMax-xPMin), 2/(yPMax-yPMin), 1);

    glColor3d(1,0,0);

    glLineWidth(2);

    glEnable(GL_LINE_SMOOTH);

Лист

5

Зм.

Лист

№ Докум

Підпис

Дата

    glBegin(GL_LINE_STRIP);

      For j:=0to E do Begin

        glVertex2f(xMin+k*j/E, y(.j.));

      End;

    glEnd;

    glDisable(GL_LINE_SMOOTH);

    glLineWidth(1);

    glPopMatrix;

  wglMakeCurrent(0,0);

End;

Графическоеизображение

Вывод

Я научился работать с аффинными преобразованиями в 2x-мерной графики на языке программирования “Delphi” с применением библиотеки OpenGL. При помощи сдвигов, поворотов, переносов, масштабирования я построил изображения нескольких окружностей в разных позициях и с разными радиусами, вызывая процедуры рисования окружности с R=1. Путём сдвига и масштабирования процедуры рисования графика функции y=F(x) я добился автоматического определения необходимых границ вывода графика функции в пределах окна. Т. о. график не зависит от изменения интервала функции.

Лист

6

Зм.

Лист

№ Докум

Підпис

Дата

 

Похожие материалы

Информация о работе