algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm Sierra 3 - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 30 lipca 2009 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Sierra 3 - Delphi/Unit1.pas:
//Tomasz Lubiński (C)2009
// http://www.algorytm.org
//Algorytm Sierra 3

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Image2: TImage;
    Image3: TImage;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    UpDown1: TUpDown;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  PPixelRec = ^TPixelRec;
  TPixelRec = packed record
    B: Byte;
    G: Byte;
    R: Byte;
    Reserved: Byte;
  end;

var
  Form1: TForm1;
  a: Array [-2..249] of Array [0..231] of Real;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
var i,j,p: Integer;
    w: Real;
    pixelOrg, pixelNew: PPixelRec;
    white, black: TPixelRec;
begin

//przygotuj wartosci bialy i czarny
white.B := 255;
white.G := 255;
white.R := 255;
black.B := 0;
black.G := 0;
black.R := 0;

//przygotuj obrazy wynikowe
Image2.Canvas.Brush.Color := clWhite;
Image2.Canvas.Rectangle(0, 0, Image2.Width, Image2.Height);
Image2.Picture.Bitmap.PixelFormat := pf32Bit;

Image3.Canvas.Brush.Color := clWhite;
Image3.Canvas.Rectangle(0, 0, Image3.Width, Image3.Height);
Image3.Picture.Bitmap.PixelFormat := pf32Bit;

//przygotuj format obrazu zrodlowego
Image1.Picture.Bitmap.PixelFormat := pf32Bit;

//pobierz prog
p := StrToInt(Form1.Edit1.Text);

//zwykle progowe
for j:=0 to 229 do
begin
        pixelOrg := Image1.Picture.Bitmap.ScanLine[j];
        pixelNew := Image2.Picture.Bitmap.ScanLine[j];
        for i:=0 to 247 do
                begin
                if (p>pixelOrg.R) then
                        pixelNew^ := black
                else
                        pixelNew^ := white;
                Inc(pixelOrg);
                Inc(pixelNew);
                end;
end;

//Sierra 3
for j:=0 to 231 do
        for i:=-2 to 249 do
                a[i,j] := 0;
for j:=0 to 229 do
begin
        pixelOrg := Image1.Picture.Bitmap.ScanLine[j];
        pixelNew := Image3.Picture.Bitmap.ScanLine[j];
        for i:=0 to 247 do
                begin
                w := pixelOrg.R+a[i,j];
                if (p>w) then
                        pixelNew^ := black
                else
                begin
                        pixelNew^ := white;
                        w := w-255;
                end;
                a[i+1, j  ] := a[i+1, j  ] + (w*5/32);
                a[i+2, j  ] := a[i+2, j  ] + (w*3/32);

                a[i-2, j+1] := a[i-2, j+1] + (w*2/32);
                a[i-1, j+1] := a[i-1, j+1] + (w*4/32);
                a[i  , j+1] := a[i  , j+1] + (w*5/32);
                a[i+1, j+1] := a[i+1, j+1] + (w*4/32);
                a[i+2, j+1] := a[i+2, j+1] + (w*2/32);

                a[i-1, j+2] := a[i-1, j+2] + (w*2/32);
                a[i  , j+2] := a[i  , j+2] + (w*3/32);
                a[i+1, j+2] := a[i+1, j+2] + (w*2/32);

                Inc(pixelOrg);
                Inc(pixelNew);
                end;
end;
end;

end.
Dodaj komentarz