Nadesłany przez Tomasz Lubiński, 06 listopada 2007 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.
CMY - C++/Unit1.cpp:
// Model CMY // www.algorytm.org // (c)2007 by Tomasz Lubinski //--------------------------------------------------------------------------- #include <vcl.h> #include "math.h" #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void CMY2RGB(int c, int m, int y, int &red, int &grn, int &blu) { red = 255 - c; grn = 255 - m; blu = 255 - y; } void RGB2CMY(int &c, int &m, int &y, int red, int grn, int blu) { c = 255 - red; m = 255 - grn; y = 255 - blu; } void __fastcall TForm1::Button1Click(TObject *Sender) { int r,g,b,c,m,y,step; int width, shift_x, shift_y; int side, side_sign; Model->Canvas->Brush->Color = clWhite; Model->Canvas->Rectangle(0, 0, Model->Width, Model->Height); width = StrToInt(Width->Text); shift_x = Model->Width / 2 - width / 1.5; shift_y = width * 1.5 + 50; if (black->Checked) { side = 0; side_sign = -1; } else { side = 255; side_sign = 1; } for (int i=0; i<width; i++) { for (int j=0; j<width; j++) { m = side; y = side - (255.0/width) * i * side_sign; c = side - (255.0/width) * j * side_sign; CMY2RGB(c, m, y, r, g, b); if (i==0 || j==0 || j == width -1) { g = 0; b= 0; r = 0; } Model->Canvas->Pixels[i+shift_x][shift_y-j] = (TColor)r + (g << 8) + (b << 16);; } } for (int i=0; i<width; i++) { for (int j=0; j<width/2; j++) { c = 255 - side; y = side - (255.0/width) * i * side_sign; m = side - (255.0/(width/2)) * j * side_sign; CMY2RGB(c, m, y, r, g, b); if (i==0 || i == width-1 || j == width/2 -1) { b= 0; g = 0; r = 0; } Model->Canvas->Pixels[i+j+shift_x][shift_y-j-width] = (TColor)r + (g << 8) + (b << 16);; } } for (int i=0; i<width/2; i++) { for (int j=0; j<width; j++) { y = 255 - side; m = side - (255.0/(width/2)) * i * side_sign; c = side - (255.0/width) * j * side_sign; CMY2RGB(c, m, y, r, g, b); if (i==0 || j==0 || i == width/2-1) { b= 0; g = 0; r = 0; } Model->Canvas->Pixels[i+shift_x+width][shift_y-j-i-1] = (TColor)r + (g << 8) + (b << 16);; } } Model->Canvas->MoveTo(shift_x, shift_y + 20); Model->Canvas->LineTo(shift_x + width, shift_y + 20); Model->Canvas->LineTo(shift_x + width - 5, shift_y + 15); Model->Canvas->MoveTo(shift_x + width, shift_y + 20); Model->Canvas->LineTo(shift_x + width - 5, shift_y + 25); Model->Canvas->TextOutA(shift_x + 10, shift_y + 7, "Y"); Model->Canvas->MoveTo(shift_x - 20, shift_y); Model->Canvas->LineTo(shift_x - 20, shift_y - width); Model->Canvas->LineTo(shift_x - 25, shift_y - width + 5); Model->Canvas->MoveTo(shift_x - 20, shift_y - width); Model->Canvas->LineTo(shift_x - 15, shift_y - width + 5); Model->Canvas->TextOutA(shift_x - 15, shift_y - 20, "C"); Model->Canvas->MoveTo(shift_x + width + 2, shift_y + 18); Model->Canvas->LineTo(shift_x + width * 1.5 + 2, shift_y + 18 - width / 2); Model->Canvas->LineTo(shift_x + width * 1.5 - 5, shift_y + 18 - width / 2); Model->Canvas->MoveTo(shift_x + width * 1.5 + 2, shift_y + 18 - width / 2); Model->Canvas->LineTo(shift_x + width * 1.5 + 2, shift_y + 25 - width / 2); Model->Canvas->TextOutA(shift_x + width + 10, shift_y - 10, "M"); Model->Refresh(); } //--------------------------------------------------------------------------- void __fastcall TForm1::CButtonClick(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::MButtonClick(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::YButtonClick(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::ReDrawProbe(TObject *Sender) { int c, m, y, r, g, b; c = StrToInt(C->Text); m = StrToInt(M->Text); y = StrToInt(Y->Text); ProbeSmall->Canvas->Brush->Color = clWhite; ProbeSmall->Canvas->Rectangle(0, 0, ProbeSmall->Width, ProbeSmall->Height); if (CButton->Checked) { for (int i=0; i<256; i++) { c = i; CMY2RGB(c, m, y, r, g, b); ProbeSmall->Canvas->Pixels[1][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[2][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[3][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[4][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[5][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[6][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[7][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[8][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[9][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[10][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[11][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[12][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[13][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[14][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[15][i] = (TColor)r + (g << 8) + (b << 16); } } else if (MButton->Checked) { for (int i=0; i<256; i++) { m = i; CMY2RGB(c, m, y, r, g, b); ProbeSmall->Canvas->Pixels[1][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[2][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[3][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[4][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[5][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[6][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[7][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[8][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[9][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[10][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[11][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[12][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[13][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[14][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[15][i] = (TColor)r + (g << 8) + (b << 16); } } else if (YButton->Checked) { for (int i=0; i<256; i++) { y = i; CMY2RGB(c, m, y, r, g, b); ProbeSmall->Canvas->Pixels[1][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[2][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[3][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[4][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[5][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[6][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[7][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[8][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[9][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[10][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[11][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[12][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[13][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[14][i] = (TColor)r + (g << 8) + (b << 16); ProbeSmall->Canvas->Pixels[15][i] = (TColor)r + (g << 8) + (b << 16); } } c = StrToInt(C->Text); m = StrToInt(M->Text); y = StrToInt(Y->Text); ProbeLarge->Canvas->Brush->Color = clWhite; ProbeLarge->Canvas->Rectangle(0, 0, ProbeLarge->Width, ProbeLarge->Height); if (CButton->Checked) { for (int i=0; i<256; i++) { for (int j=0; j<256; j++) { m = i; y = 255-j; CMY2RGB(c, m, y, r, g, b); ProbeLarge->Canvas->Pixels[i][255-j] = (TColor)r + (g << 8) + (b << 16); } } } else if (MButton->Checked) { for (int i=0; i<256; i++) { for (int j=0; j<256; j++) { c = i; y = 255-j; CMY2RGB(c, m, y, r, g, b); ProbeLarge->Canvas->Pixels[i][255-j] = (TColor)r + (g << 8) + (b << 16); } } } else if (YButton->Checked) { for (int i=0; i<256; i++) { for (int j=0; j<256; j++) { c = i; m = 255-j; CMY2RGB(c, m, y, r, g, b); ProbeLarge->Canvas->Pixels[i][255-j] = (TColor)r + (g << 8) + (b << 16); } } } ReDrawRectangle(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::ReDrawRectangle(TObject *Sender) { int c, m, y, r, g, b; c = StrToInt(C->Text); m = StrToInt(M->Text); y = StrToInt(Y->Text); CMY2RGB(c, m, y, r, g, b); Probe->Canvas->Brush->Color = (TColor)r + (g << 8) + (b << 16); Probe->Canvas->Rectangle(0, 0, Probe->Width, Probe->Height); if (CButton->Checked) { ProbeSmall->Canvas->Ellipse(5, c-3, 13, c+3); ProbeLarge->Canvas->Ellipse(m-3, y-3, m+3, y+3); } else if (MButton->Checked) { ProbeSmall->Canvas->Ellipse(5, m-3, 13, m+3); ProbeLarge->Canvas->Ellipse(c-3, y-3, c+3, y+3); } else if (YButton->Checked) { ProbeSmall->Canvas->Ellipse(5, y-3, 13, y+3); ProbeLarge->Canvas->Ellipse(c-3, m-3, c+3, m+3); } } //--------------------------------------------------------------------------- void __fastcall TForm1::CChange(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::MChange(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::YChange(TObject *Sender) { ReDrawProbe(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::ProbeLargeMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (CButton->Checked) { this->M->Text = IntToStr(X); this->Y->Text = IntToStr(Y); } else if (MButton->Checked) { this->C->Text = IntToStr(X); this->Y->Text = IntToStr(Y); } else if (YButton->Checked) { this->C->Text = IntToStr(X); this->M->Text = IntToStr(Y); } } //--------------------------------------------------------------------------- void __fastcall TForm1::ProbeSmallMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (CButton->Checked) { this->C->Text = IntToStr(Y); } else if (MButton->Checked) { this->M->Text = IntToStr(Y); } else if (YButton->Checked) { this->Y->Text = IntToStr(Y); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormActivate(TObject *Sender) { ReDrawProbe(Sender); Button1Click(Sender); Layers(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Layers() { int r, g, b, c, m, y; TColor color; for (int i=0; i<AllLayers->Width; i++) { for (int j=0; j<AllLayers->Height; j++) { color = AllLayers->Canvas->Pixels[i][j]; r = color & 0xFF; g = (color & 0xFF00) >> 8; b = (color & 0xFF0000) >> 16; RGB2CMY(c, m, y, r, g, b); CMY2RGB(c, 0, 0, r, g, b); LayerC->Canvas->Pixels[i][j] = (TColor)r + (g << 8) + (b << 16); CMY2RGB(0, m, 0, r, g, b); LayerM->Canvas->Pixels[i][j] = (TColor)r + (g << 8) + (b << 16); CMY2RGB(0, 0, y, r, g, b); LayerY->Canvas->Pixels[i][j] = (TColor)r + (g << 8) + (b << 16); } } } //---------------------------------------------------------------------------