Построение двухмерного изображения на языке программирования “Delphi” с применением библиотеки OpenGL, страница 2

Программа

unit unit1;

interface

uses

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

  Dialogs, ExtCtrls, OpenGL;

type

  TGrahpik = class(TForm)

    Painting: TPaintBox;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure The_FormPaint (Sender: TObject);

  private

  public

       hrc: HGLRC;

  end;

var

  Grahpik: TGrahpik;

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 TGrahpik.FormCreate(Sender: TObject);

begin

   SetDCPixelFormat(Canvas.Handle);

   hrc:=wglCreateContext(Canvas.Handle);

end;

procedure TGrahpik.FormDestroy(Sender: TObject);

begin

   wglDeleteContext(hrc);

end;

procedure TGrahpik.The_FormPaint (Sender: TObject);

var x,yMax:Real;

    j:shortint;

    PoleY:word;

    y:Array[-100..100]Of Real;

Begin

   wglMakeCurrent(Canvas.Handle, hrc);

      glClearColor(0.2, 0.5, 0.75, 1.0);

      glClear(GL_COLOR_BUFFER_BIT);

      glColor3d(1,1,1);

      glEnable(GL_LINE_STIPPLE);

      glLineStipple(1,$F00F);

7.160101.1381.02

Лист

3

Зм.

Лист

№ Докум

Підпис

Дата

    glBegin(GL_LINES);

      For j:=-5to 5do Begin

        glVertex2f(j*0.2, 1);

        glVertex2f(j*0.2, -1);

        glVertex2f(1, j*0.2);

        glVertex2f(-1, j*0.2);

      End;

    glEnd;

    glDisable(GL_LINE_STIPPLE);

      glBegin(GL_LINES);

      glColor3d(0,0,0);

      glVertex2f(1, 0);

      glVertex2f(-1, 0);

      glVertex2f(0, 1);

      glVertex2f(0, -1);

    glEnd;

    glBegin(GL_LINE_STRIP);

      glVertex2f(0.96, 0.015);

      glVertex2f(1, 0);

      glVertex2f(0.96, -0.015);

    glEnd;

    glBegin(GL_LINE_STRIP);

      glVertex2f(0.015, 0.96);

      glVertex2f(0, 1);

      glVertex2f(-0.015, 0.96);

    glEnd;

    For j:=-100to 100do Begin

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

      If abs(y(.j.))>yMax then yMax:=y(.j.);

    End;

    yMax:=1/(int(yMax)+1);

    glColor3d(1,0,0);

    glEnable(GL_LINE_SMOOTH);

    glBegin(GL_LINE_STRIP);

      For j:=-100to 100do Begin

        glVertex2f(j/100, y(.j.)*yMax);

      End;

    glEnd;

    glDisable(GL_LINE_SMOOTH);

    wglMakeCurrent(0,0);

End;

End.

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

7.160101.1381.02

Лист

4

Зм.

Лист

№ Докум

Підпис

Дата

Вывод

Я научился на языке программирования “Delphi” применять для построения графического изображения библиотеку OpenGL и нарисовал в 2x мерной графики  график функции  на промежутке . Для изображения функции я применил ломаную, которую разбил на маленькие участки по 0.01, из-за чего получилась почти ровная линия. Т. к. я сначала проанализировал полученный массив на выход за пределы рамки, а затем умножал все значения  ординат на такое число, которое позволило графику не выступать за свои пределы по оси  ординат.

7.160101.1381.02

Лист

5

Зм.

Лист

№ Докум

Підпис

Дата