рдмреЙрд▓реНрд╕ 2.0 рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

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



рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:
рдЪрд░рдг 1. рд╕реНрдХреНрд░реАрди рд╕реЗ рдПрдХ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЪрд░рдг 2. рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЧреЗрдВрджреЛрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ
рдЪрд░рдг 3. рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЪрд╛рд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреНрдпреВрдЯреА рдФрд░ рдбреЗрд▓реНрдлреА рдХреЗ рдмреАрдЪ рдереЛрдбрд╝рд╛ рд╕рдВрдХреЛрдЪ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВ рд╕рдм рдХреБрдЫ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбреЗрд▓реНрдлреА рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдЕрдм рдЖрдк рдЪрд░рдг 1 рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ TImage рдкрд░ рд░рдЦреЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдлрд╝реЙрд░реНрдо рдкрд░ рд╕реНрдерд┐рдд рд╣реИред

procedure MakeFrame(); var bmp:TBitmap; rect:TRect; begin rect.Left := 50; rect.Top:= 150; rect.Right:=550; // Screen.Width rect.Bottom:=550; // Screen.Height bmp := TBitmap.Create; bmp.Width := Screen.Width; bmp.Height := Screen.Height; BitBlt(bmp.Canvas.Handle, 0, 0, rect.Right, rect.Bottom, GetDC(0), rect.Left, rect.Top, SRCCOPY); Form1.Image1.Width := rect.Right; Form1.Image1.Height := rect.Bottom; Form1.Image1.Picture.Assign(bmp); bmp.Free; end; 


рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдорд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЧреЗрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЧреЗрдо рдХреА рдЫрд╡рд┐ рдХреЙрдкреА рд╣реЛ рдЬрд╛рдПред

рдЪрд░рдг 2ред рдЖрдкрдХреЛ рдЧреЗрдВрджреЛрдВ рдХреЗ рд░рдВрдЧ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд╕реАрдзреЗ рдЖрд░рдЬреАрдмреАред
рдЧреЗрдВрджреЛрдВ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реНрдпрд╛рд╕ рдХреЗ рдмреАрдЪ рдХреА рдКрдВрдЪрд╛рдИ рд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЗрдВрджреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 for I:=0 to rows do begin offset:=10; //  if (I mod 2) <> 0 then offset:=offset+(36 div 2); for J:=0 to cols do begin mat[i,j].Y := 10+Round(I*36); //   mat[i,j].X := offset+Round(J*36); //  (        ) if (I=rows) and (J=cols) then begin mat[i,j].Y := 519; mat[i,j].X := 262; end; //    end; end; 


рдПрдХ рдЧреЗрдВрдж рдХреЗ рд░рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддреБрд▓рдирд╛ 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) <= рддреНрд░рд┐рдЬреНрдпрд╛

  ///      for I:=0 to rows-1 do for J:=0 to cols do begin if (mat[I,J].color = 0) and (I <> 0) then continue; mat[i,j].allow:=1; //    LineMaxX:=mat[I,J].X; LineMaxY:=mat[I,J].Y; //    LineMinX:=mat[rows,cols].X; LineMinY:=mat[rows,cols].Y; mat[I,J].dist := sqrt( sqr(mat[I,J].X-mat[rows,cols].X)+ sqr(mat[I,J].Y-mat[rows,cols].Y)); for II:=I+1 to rows-1 do for JJ:=0 to cols do begin if mat[II,JJ].color = 0 then continue; //    LineMiddleX:=mat[II,JJ].X; LineMiddleY:=mat[II,JJ].Y; //        //      ka:=1; kb:=(LineMinX-LineMaxX)/(LineMaxY-LineMinY); kc:=-LineMinX-kb*LineMinY; kz:= abs(ka*LineMiddleX + kb*LineMiddleY+kc)/ sqrt(sqr(ka)+sqr(kb)); if kz < 39 then mat[i,j].allow:=0; //Form1.Memo1.Lines.Add(FloatToStr(kz)); end; 


рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЙрди рдЧреЗрдВрджреЛрдВ рдХреА рд░реЗрдЦрд╛рдПрдВ рдЦреАрдВрдЪрд┐рдП рдЬрд┐рдирд╕реЗ рдЖрдк рдЧреЛрд▓реА рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред

 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)); //  if mat[i,j].color=mat[rows,cols].color //    then begin MouseX:=mat[i,j].X+50; MouseY:=mat[i,j].Y+250; //  +    break; end; end; end; 


рдФрд░ WinApi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

  if Form1.CheckBox2.Checked then begin GetCursorPos(MouseL); SetCursorPos(MouseX,MouseY); mouse_event(MOUSEEVENTF_LEFTDOWN,MouseX,MouseY,0,0);// -    mouse_event(MOUSEEVENTF_LEFTUP,MouseX,MouseY,0,0);// -    SetCursorPos(MouseL.X,MouseL.Y); end; 


рдпрд╣ рдЯрд╛рдЗрдорд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдФрд░ рдЪрд╛рдп рдкреАрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реАрдбрд┐рдпреЛ


рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреЗрдВрджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ рдвреВрдВрдвреЗрдВ рдпрд╛ рдЙрди рд▓рд╛рдЗрдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдЪрд░ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╛рдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдпрд╣рд╛рдВ рд╣реИрдВ ред

Source: https://habr.com/ru/post/In165297/


All Articles