рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдЦрд┐рд▓реМрдиреЗ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдЧреЗрдВрдж рдХреЛ рдЙрд╕реА рд░рдВрдЧ рдХреЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╢реВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЦреЗрд▓ рдЦреЗрд▓рддрд╛ рд╣реВрдВ, рд▓рдЧрднрдЧ 30 рдорд┐рдирдЯ рддрдХ рдореИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдмреИрдард╛ рд░рд╣рд╛ред
рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЦреЗрд▓ рд╣реИрдВред
рдореИрдВ рдЗрд╕ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВред

рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:
рдЪрд░рдг 1. рд╕реНрдХреНрд░реАрди рд╕реЗ рдПрдХ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЪрд░рдг 2. рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЧреЗрдВрджреЛрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ
рдЪрд░рдг 3. рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЪрд╛рд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреНрдпреВрдЯреА рдФрд░ рдбреЗрд▓реНрдлреА рдХреЗ рдмреАрдЪ рдереЛрдбрд╝рд╛ рд╕рдВрдХреЛрдЪ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВ рд╕рдм рдХреБрдЫ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбреЗрд▓реНрдлреА рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЕрдм рдЖрдк
рдЪрд░рдг 1 рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
редрдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ TImage рдкрд░ рд░рдЦреЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдлрд╝реЙрд░реНрдо рдкрд░ рд╕реНрдерд┐рдд рд╣реИред
procedure MakeFrame(); var bmp:TBitmap; rect:TRect; begin rect.Left := 50; rect.Top:= 150; rect.Right:=550;
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдорд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЧреЗрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЧреЗрдо рдХреА рдЫрд╡рд┐ рдХреЙрдкреА рд╣реЛ рдЬрд╛рдПред
рдЪрд░рдг 2ред рдЖрдкрдХреЛ рдЧреЗрдВрджреЛрдВ рдХреЗ рд░рдВрдЧ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд╕реАрдзреЗ рдЖрд░рдЬреАрдмреАред
рдЧреЗрдВрджреЛрдВ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реНрдпрд╛рд╕ рдХреЗ рдмреАрдЪ рдХреА рдКрдВрдЪрд╛рдИ рд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЗрдВрджреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
for I:=0 to rows do begin offset:=10;
рдПрдХ рдЧреЗрдВрдж рдХреЗ рд░рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддреБрд▓рдирд╛ RGB рд░рдВрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди рд╕реЗ рдХрд░реЗрдВ
rgb:=Form1.Image1.Canvas.Pixels[ mat[i,j].X, mat[i,j].Y-4 ]; mat[i,j].color := 0; mat[i,j].summa := 0; if GetRValue(rgb) > 230 then mat[i,j].color:=1; if GetGValue(rgb) > 230 then mat[i,j].color:=2; if GetBValue(rgb) > 230 then mat[i,j].color:=3;
рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рдЧреЗрдВрдж рдкрд░ рдкрд░рд┐рдгрд╛рдореА рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдЖрдпрдд рдЦреАрдВрдЪреЗрдВ
if mat[i,j].color = 0 then Form1.Image1.Canvas.Brush.Color := clWhite; if mat[i,j].color = 1 then Form1.Image1.Canvas.Brush.Color := clRed; if mat[i,j].color = 2 then Form1.Image1.Canvas.Brush.Color := clGreen; if mat[i,j].color = 3 then Form1.Image1.Canvas.Brush.Color := clBlue; Form1.Image1.Canvas.Rectangle( mat[i,j].X-5, mat[i,j].Y-5, mat[i,j].X+5, mat[i,j].Y+5 );
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реБрдВрджрд░ рддрд╕реНрд╡реАрд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣ рдЧреНрд░рд┐рдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
рдЪрд░рдг 3рд╣рдо рдЗрд╕ рдкрд░ рдЧреЛрд▓реАрдмрд╛рд░реА рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЧреЗрдВрджреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдПрдХ рдФрд░ рдЧреЗрдВрдж рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреЗрдХрд┐рдВрдЧ рд╣реЛрддреА рд╣реИ (рдЧреЗрдВрджреЛрдВ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд╛рдХреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ)
рд╕рддреНрдпрд╛рдкрди рдХреА рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рдпрдВ рддреАрди рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред
{A = 1, B = (x0-y0) / (y1-y0), C = -x0-By0}
| Ax3 + By3 + C | / sqrt (A ^ 2 + b ^ 2) <= рддреНрд░рд┐рдЬреНрдпрд╛
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЙрди рдЧреЗрдВрджреЛрдВ рдХреА рд░реЗрдЦрд╛рдПрдВ рдЦреАрдВрдЪрд┐рдП рдЬрд┐рдирд╕реЗ рдЖрдк рдЧреЛрд▓реА рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред
if mat[i,j].allow = 1 then begin Form1.Image1.Canvas.Pen.Width:= 2; Form1.Image1.Canvas.Pen.Color:= clWhite; Form1.Image1.Canvas.MoveTo(Round(LineMinX),Round(LineMinY)); Form1.Image1.Canvas.LineTo(Round(LineMaxX),Round(LineMaxY)); end;
рдЕрдиреБрдордд рд▓реЛрдЧреЛрдВ рд╕реЗ рдПрдХ рд╣реА рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЗрдВрдж рдЪреБрдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
for I:=0 to rows-1 do for J:=0 to cols do begin if mat[i,j].allow = 1 then begin Form1.Image1.Canvas.Pen.Width:= 2; Form1.Image1.Canvas.Pen.Color:= clWhite; Form1.Image1.Canvas.MoveTo(Round(LineMinX),Round(LineMinY)); Form1.Image1.Canvas.LineTo(Round(LineMaxX),Round(LineMaxY));
рдФрд░ WinApi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
if Form1.CheckBox2.Checked then begin GetCursorPos(MouseL); SetCursorPos(MouseX,MouseY); mouse_event(MOUSEEVENTF_LEFTDOWN,MouseX,MouseY,0,0);
рдпрд╣ рдЯрд╛рдЗрдорд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдФрд░ рдЪрд╛рдп рдкреАрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реАрдбрд┐рдпреЛ
рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреЗрдВрджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ рдвреВрдВрдвреЗрдВ рдпрд╛ рдЙрди рд▓рд╛рдЗрдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдЪрд░ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╛рдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ
рд╕реНрд░реЛрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ
рд╡реЗ рдпрд╣рд╛рдВ рд╣реИрдВ ред