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 2 - C++/Unit1.cpp:
//Tomasz Lubiński (C)2009 // http://www.algorytm.org //Algorytm Sierra 2 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- typedef struct Pixel { Byte b; Byte g; Byte r; Byte reserved; } TPixel; /* by uniknac indeksow mniejszych od zera w tablicy bledow */ #define SHIFT 2 void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j,p; float w,a[252][231]; TPixel *pixelOrg, *pixelNew, white, black; //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; TColor color; p = StrToInt(Form1->Edit1->Text); //zwykle progowe for (j=0; j<230; j++){ pixelOrg = (TPixel *)Image1->Picture->Bitmap->ScanLine[j]; pixelNew = (TPixel *)Image2->Picture->Bitmap->ScanLine[j]; for (i=0; i<248; i++){ if (p > pixelOrg->r) *pixelNew = black; else *pixelNew = white; pixelOrg++; pixelNew++; } } //Sierra 2 for (i=0; i<252; i++) for (j=0; j<231; j++) a[i][j] = 0; for (j=0; j<230; j++){ pixelOrg = (TPixel *)Image1->Picture->Bitmap->ScanLine[j]; pixelNew = (TPixel *)Image3->Picture->Bitmap->ScanLine[j]; for (i=0; i<248; i++){ w = pixelOrg->r + a[i+SHIFT][j]; if (p>w) { *pixelNew = black; } else { *pixelNew = white; w = w - 255.0; } a[i+1+SHIFT][j ] = a[i+1+SHIFT][j ] + (w*4.0/16.0); a[i+2+SHIFT][j ] = a[i+2+SHIFT][j ] + (w*3.0/16.0); a[i-2+SHIFT][j+1] = a[i-2+SHIFT][j+1] + (w*1.0/16.0); a[i-1+SHIFT][j+1] = a[i-1+SHIFT][j+1] + (w*2.0/16.0); a[i +SHIFT][j+1] = a[i +SHIFT][j+1] + (w*3.0/16.0); a[i+1+SHIFT][j+1] = a[i+1+SHIFT][j+1] + (w*2.0/16.0); a[i+2+SHIFT][j+1] = a[i+2+SHIFT][j+1] + (w*1.0/16.0); pixelOrg++; pixelNew++; } } } //---------------------------------------------------------------------------