Пиксельная прорисовка точки, линии и закрашенного треугольника, аппроксимируя реальные положения точек на плоскости к ячейкам монитора

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

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

Московский Государственный университет приборостроения и информатики

Сергиево-Посадский Филиал

Отчёт по лабораторной работе №1

по дисциплине «Компьютерная графика»

Выполнил студент

III курса 230101 (2)

Проверил

Преподаватель

2009г

Введение

Данная программа производит по пиксельную прорисовку точки, линии, и закрашенного треугольника, аппроксимируя реальные положения точек на плоскости, к ячейкам монитора. Программа была создана в среде разработки приложений «Delphi 7», вывод графической информации на экран осуществлялся при помощи свойства, стандартного класса TCanvas, Pixels.

На форме программы содержатся 3 вкладки: «Пиксель», «Линия», «Треугольник».

Для прорисовки пикселя, необходимо зайти на вкладку «Пиксель», ввести координаты, где будет отображен этот пиксель, в однострочные поля редактирования «Х» и «У», и нажать на кнопку «Нарисовать пиксель», после чего будет предоставлено диалоговое окно, в котором нужно указать цвет рисуемого пикселя.

Для прорисовки линии, необходимо зайти на вкладку «Линия», ввести координаты начала линии, в однострочные поля редактирования «Х1» и «У1», ввести координаты конца линии, в однострочные поля редактирования «Х2» и «У2», и нажать на кнопку «Нарисовать линию», после чего будет предоставлено диалоговое окно, в котором нужно указать цвет рисуемой линии. При прорисовки линии используется математический расчет, для определения точек, находящихся на линии, и прорисовка именно этих точек.

Для прорисовки закрашенного треугольника, необходимо зайти на вкладку «Треугольник», ввести координаты вершин треугольника, в однострочные поля редактирования «Х1», «У1», «Х2», «У2», «Х3», «У3»и нажать на кнопку «Треугольник», после чего будет предоставлено диалоговое окно, в котором нужно указать цвет рисуемого закрашенного треугольника. При прорисовки треугольника используется математический расчет, для определения точек, находящихся внутри треугольника, либо на его ребрах, и прорисовка именно этих точек.

Программный код

unit Unit1;

interface

uses

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

  Dialogs, StdCtrls, ComCtrls, TabNotBk, ExtCtrls;

type

  TForm1 = class(TForm)

    ColorDialog1: TColorDialog;

    ColorDialog2: TColorDialog;

    TB: TTabbedNotebook;

    Button1: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Button2: TButton;

    PaintBox1: TPaintBox;

    PaintBox2: TPaintBox;

    Edit3: TEdit;

    Edit4: TEdit;

    Edit5: TEdit;

    Edit6: TEdit;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    Edit7: TEdit;

    Edit8: TEdit;

    Edit9: TEdit;

    Edit10: TEdit;

    Edit11: TEdit;

    Edit12: TEdit;

    Button3: TButton;

    Label7: TLabel;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Label11: TLabel;

    Label12: TLabel;

    ColorDialog3: TColorDialog;

    PaintBox3: TPaintBox;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

function square(x1, y1, x2, y2, x3, y3: integer): real;

var //функция нахождения площади треугольника

  p, a, b, c: real;

begin

  y1:=-y1;

  y2:=-y2;

  y3:=-y3;

  a := sqrt(sqr(x2 - x1) + sqr(y2 - y1));

  b := sqrt(sqr(x3 - x1) + sqr(y3 - y1));

  c := sqrt(sqr(x3 - x2) + sqr(y3 - y2));

  p := (a + b + c) * 0.5;

  square := sqrt(p * (p - a) * (p - b) * (p - c));

end;

Procedure Drawline(x1,y1,x2,y2:integer; c:Tcolor; ppbb:TPaintBox);

var //процедура по пиксельной прорисовки линии

x,y,x3,y3,x4,y4:integer;

xr,yr:real;

begin

 y3:=y2-y1;

 x3:=x2-x1;

 x4:=x3*y1;

 y4:=y3*x1;

 xr:=0;

 repeat

 if x3=0 then yr:=0 else

 yr:=(y3*xr - y4 + x4) / x3;

 x:=round(xr);

 y:=round(yr);

 if x1>x2 then

 if (xr<x1) and (xr>x2) then

  ppbb.Canvas.Pixels[x,y]:=c else

 else

 if (xr>x1) and (xr<x2) then

  ppbb.Canvas.Pixels[x,y]:=c;

 xr:=xr+0.01;

 until x>10000;

  if x1=x2 then

  begin

  yr:=0;

  repeat

  if y3=0 then xr:=0 else

  xr:=(x3*yr+y4-x4) / y3;

  x:=round(xr);

  y:=round(yr);

  if y1>y2 then

  if (yr<y1) and (yr>y2) then

  ppbb.Canvas.Pixels[x,y]:=c else

  else

  if (yr>y1) and (yr<y2) then

   ppbb.Canvas.Pixels[x,y]:=c;

  yr:=yr+0.01;

  until y>10000;

  end;

end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin //рисование пикселя

if form1.colordialog1.Execute then

 paintbox1.Canvas.Pixels[strtoint(edit1.Text),strtoint(edit2.Text)]:=colordialog1.Color;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin //по пиксельное рисование прямой

 if form1.colordialog2.Execute then

 drawline(strtoint(edit3.Text),strtoint(edit4.Text),strtoint(edit5.Text),strtoint(edit6.Text),colordialog2.color, form1.paintbox2);

end;

procedure TForm1.Button3Click(Sender: TObject);

var //по пиксельное рисование закрашенного треугольника

i,j:integer;

sqmax,sq1,sq2,sq3:real;

maxx, minx, maxy, miny:integer;

begin

 if form1.colordialog3.Execute then

 begin

 sqmax:=square(strtoint(edit7.Text),strtoint(edit8.Text),strtoint(edit9.Text),strtoint(edit10.Text),strtoint(edit11.Text),strtoint(edit12.Text));

 if strtoint(edit7.Text)<=strtoint(edit9.Text) then minx:=strtoint(edit7.Text) else minx:=strtoint(edit9.Text);

 if minx>strtoint(edit11.Text) then minx:=strtoint(edit11.Text);

 if strtoint(edit8.Text)<=strtoint(edit10.Text) then miny:=strtoint(edit8.Text) else miny:=strtoint(edit10.Text);

 if miny>strtoint(edit12.Text) then miny:=strtoint(edit12.Text);

 if strtoint(edit7.Text)>=strtoint(edit9.Text) then maxx:=strtoint(edit7.Text) else maxx:=strtoint(edit9.Text);

 if maxx<strtoint(edit11.Text) then maxx:=strtoint(edit11.Text);

 if strtoint(edit8.Text)>=strtoint(edit10.Text) then maxy:=strtoint(edit8.Text) else maxy:=strtoint(edit10.Text);

 if maxy<strtoint(edit12.Text) then maxy:=strtoint(edit12.Text);

  For i:=minx to maxx do

   for j:=miny to maxy do

    begin

      sq1:=square(i,j,strtoint(edit9.Text),strtoint(edit10.Text),strtoint(edit11.Text),strtoint(edit12.Text));

      sq2:=square(i,j,strtoint(edit11.Text),strtoint(edit12.Text),strtoint(edit7.Text),strtoint(edit8.Text));

      sq3:=square(i,j,strtoint(edit7.Text),strtoint(edit8.Text),strtoint(edit9.Text),strtoint(edit10.Text));

      if ROUND(sqmax)=ROUND(sq1+sq2+sq3) then paintbox3.Canvas.Pixels[i,j]:=colordialog3.Color;

    end;

 end;

end;

end.

Результат работы

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

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