Nadesłany przez Tomasz Lubiński, 31 lipca 2005 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.
Burkes - C++/Unit1.cpp:
//Tomasz Lubiński (C)2009
// http://www.algorytm.org
//Algorytm Burkes'a
//---------------------------------------------------------------------------
#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++;
}
}
//Burkes
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*8.0/32.0);
a[i+2+SHIFT][j ] = a[i+2+SHIFT][j ] + (w*4.0/32.0);
a[i-2+SHIFT][j+1] = a[i-2+SHIFT][j+1] + (w*2.0/32.0);
a[i-1+SHIFT][j+1] = a[i-1+SHIFT][j+1] + (w*4.0/32.0);
a[i +SHIFT][j+1] = a[i +SHIFT][j+1] + (w*8.0/32.0);
a[i+1+SHIFT][j+1] = a[i+1+SHIFT][j+1] + (w*4.0/32.0);
a[i+2+SHIFT][j+1] = a[i+2+SHIFT][j+1] + (w*2.0/32.0);
pixelOrg++;
pixelNew++;
}
}
}
//---------------------------------------------------------------------------

