рдЦреЗрд▓ рдмрд╛рдврд╝ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдмреЙрдЯ

рдЫрд╡рд┐
рдЪрд┐рддреНрд░ 1. рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рдиред

рдПрдХ рдмрд╛рд░, рдПрдХ рд▓реЗрдЦ рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдкрдХрдбрд╝ рд▓реАред рд╣реЗрдбрд▓рд╛рдЗрди рдкрдврд╝рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдЗрд╕ рддрд░рд╣ рдХреЗ рджрд░реНрдЬрдиреЛрдВ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реА рдерд╛ - рдЗрд╕ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ред

рдЙрд╕ рд╕рдордп, рдореБрдЭреЗ рдЦреЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЗрдЪреНрдЫрд╛ рд╕рдм рд╕реЗ рдКрдкрд░ рдереАред рдЗрд╕рд▓рд┐рдП, рдиреЛрдЯрдмреБрдХ рдирд┐рдХрд╛рд▓рдХрд░, рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ ...


рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг



рдореИрдВрдиреЗ рдЕрдВрдд рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд╛рде рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рд╕рд╣реА рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рд╣реА рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИред рдЙрд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдЗрди рдмрдЯрдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпрд╛ рд╡рд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд╣реАрдВ рднреА рдкреНрд░рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪреЗрдЧреА? рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╡рд╣ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмреЙрдЯ рдмрдЯрди рджрдмрд╛рдПрдЧрд╛, рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА рдмрдЯрди рдХреЛ рдкреНрд░рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╣реИ рдирд╛? рдХреНрд▓рд┐рдХ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдВрдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдпрд╣ рд╕рд╣реА рд╣реИ, рдХреБрдЫ рдирд╣реАрдВ! рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЦреЗрд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╣рд╛рди, рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдХрд╣рд╛рдБ рд╣реИ? рдЬрд╡рд╛рдм "рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд╣реАрдВ" рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрдм рдпрд╣ рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ:


рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдорд╛рдиреНрдпрддрд╛



рдкрд╣рд▓рд╛ рдХрджрдо рдХрд┐рд╕реА рддрд░рд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЛрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде java.awt.Robot рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: BufferedImage createScreenCapture (рдЖрдпрдд рд╕реНрдХреНрд░реАрдирд░реЗрдХреНрдЯ)ред
рдФрд░ рдлрд┐рд░ рдХреНрдпрд╛? рдФрд░ рдлрд┐рд░ рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЧрдП рдереЗ, рдмрдлрд╝рд░рдбрд╛рдЗрдореИрдЬ рдХреНрд▓рд╛рд╕ рдХреА рдЧреЗрдЯрдЖрд░рдЬреАрдмреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рджрд╕рд┐рдпреЛрдВ рд╣рдЬрд╛рд░ рдХреЙрд▓, рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЖрджрд┐ред рдпреЗ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдЕрд╕рдлрд▓ рд░рд╣реЗред рдПрдХ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рджреВрд╕рд░реЗ рдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ред рдФрд░ рдПрдХ рдмрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдЖ рдЧрдИ:


рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ ARGB рд╕рд░рдгреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:
int[] pixels = new int[w * h]; image.getRGB(0, 0, w, h, pixels, 0, w); 


рдПрдХ рд░рдВрдЧ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЗрд╕реЗ рдореЛрдиреЛрдХреНрд░реЛрдо рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рд░рдВрдЧ рд╣реЛрдВред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЕрдЧрд▓рд╛ рд░рдВрдЧ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдЪрдордХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рджрд╣рд▓реАрдЬ рдХреЗ рдиреАрдЪреЗ рд╣реИ, рддреЛ рдпрд╣ рд░рдВрдЧ рдХрд╛рд▓рд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдКрдкрд░ рдпрд╣ рд╕рдлреЗрдж рд╣реЛрдЧрд╛ред рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 int red = (color >> 16) & 0xff; int green = (color >> 8) & 0xff; int blue = color & 0xff; int mean = (qr + qg + qb) / 3; if (mean > thresholdValue) color = 0xFFFFFFFF; else color = 0xFF000000; 

рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рд░рдВрдЧ рдХреА рдЪрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдпрд╛ рддреЛ рдЖрд░рдЬреАрдмреА рдШрдЯрдХреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рдФрд╕рдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░: рдЪрдордХ = 0.3 * рд▓рд╛рд▓ + 0.59 * рд╣рд░рд╛ + 0.11 * рдиреАрд▓рд╛ред рдЧреБрдгрд╛рдВрдХ рдХреЛ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд░рдВрдЧ рдШрдЯрдХ рдХреА рдорд╛рдирд╡ рдЖрдВрдЦ рджреНрд╡рд╛рд░рд╛ рдзрд╛рд░рдгрд╛ред

рдЕрдм рдЖрдкрдХреЛ рдереНрд░реЗрд╢реЛрд▓реНрдб рд╡реИрд▓реНрдпреВ (рдереНрд░реЗрд╢реЛрд▓реНрдбрд╡реИрд▓реНрдпреВ) рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, 191 рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИ - рдЦреЗрд▓ рдХреЗ рд╕рд╛рде рдЙрди рд╕рднреА рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рдПрдХ рд╣рд▓реНрдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдереА, рдмрд┐рдирд╛рд░рд╛рдЗрдЬреЗрд╢рди рдиреЗ рдРрд╕реА рдЫрд╡рд┐ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛:

рдЪрд┐рддреНрд░рд╛ 2. рдореЛрдиреЛрдХреНрд░реЛрдо рдЫрд╡рд┐ред
рдФрд░ рдПрдХ рдЕрдВрдзреЗрд░реЗ рдкреГрд╖реНрдарднреВрдорд┐ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдкрд░, 64 рдХреЗ рдореВрд▓реНрдп рдиреЗ рдПрдХ рд╕рдорд╛рди рддрд╕реНрд╡реАрд░ рджреА, рд▓реЗрдХрд┐рди рдЙрд▓рдЯрд╛ред рд╡реИрд╕реЗ, рдореИрдВрдиреЗ 191 рдХреЛ рди рдХреЗрд╡рд▓ рдРрд╕рд╛ рдЪреБрдирд╛, рдмрд▓реНрдХрд┐ рдХрд╛рдиреВрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ 255-64ред

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЫрд╡рд┐ рдкрд░ рдЦреЗрд▓рдиреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдЦреЛрдЬрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЕрдЧрд░ рд╣рдо рд░рдВрдЧ рдореЗрдВ рджрд┐рдЦ рд░рд╣реЗ рдереЗред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдбреЗрдЯрд╛ рд╕реЗ рдереНрд░реЗрд╢реЛрд▓реНрдб 64 рдпрд╛ (255-64) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╣рд▓реНрдХрд╛ рдпрд╛ рдЧрд╣рд░рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЫрд╡рд┐ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░ рджреЗрдВред рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 private boolean[] threshold(int[] pixels, int value) { boolean inverse = isBackgroundLight(MAX_COLOR_POINTS); if (inverse) value = 255 - value; boolean[] bw = new boolean[pixels.length]; for (int i = 0; i < pixels.length; i++) { int brightness = getBrightness(pixels[i]); bw[i] = (brightNess >= value) ^ inverse; } return bw; } 


isBackgroundLight рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рд╣рд▓реНрдХреА рд╣реИ рдпрд╛ рдЕрдВрдзреЗрд░рд╛ рд╣реИред рд╣рдо рд░рдВрдЧреАрди рдЫрд╡рд┐ рд╕реЗ MAX_COLOR_POINTS рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдФрд╕рдд рдЪрдордХ рдкрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ 128 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдкреГрд╖реНрдарднреВрдорд┐ рд╣рд▓реНрдХреА рд╣реИ, рдпрджрд┐ рдХрдо рд╣реИ - рдЕрдВрдзреЗрд░реЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╛рдкреНрдд рдореЛрдиреЛрдХреНрд░реЛрдо рдЫрд╡рд┐ рдореЗрдВ, рд╣рдореЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рд╕рдлреЗрдж рдбреЙрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЫрд╡рд┐ рдкрд░ рджреЛ рдкрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдлреЙрд░реНрдо рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рд╕рд░рдгрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ: 1440, 1440, 410, 23, 119, 838 ... рдФрд╕рдд рд╕реЗ рдиреАрдЪреЗ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 1, 1, 0, 0, 0, 1 ... рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╡реЗ рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реИрдВ рдЬреЛ рд╢реВрдиреНрдп рд╕реЗ рдЯреВрдЯреА рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рдХрд╛рдо рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ 4 рдорд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВ: рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ, рд▓рдВрдмрд╡рдд, рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИред рдЪреВрдБрдХрд┐ рдпрд╣ рд╡рд░реНрдЧрд╛рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд┐рдо рджреЛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдореЗрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдпрд╛рдо рджреНрд╡рд╛рд░рд╛ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдпрд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ 14x14 рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ 10x10, 20x20, рдЖрджрд┐ рднреА рд╣реИред

рд╕реЗрд▓ рд░рдВрдЧ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ



рдЕрдм рдЬрдм рд╣рдордиреЗ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
 int[][] table = new int[boardSize][boardSize]; int offset = cellSize / 2; for (int i = 0; i < boardSize; i++) { for (int j = 0; j < boardSize; j++) { table[i][j] = detectImage.getRGB(j*cellSize + offset, i*cellSize + offset); } } 

рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рд░рдВрдЧ рд▓реЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рд░рдВрдЧреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 0, 1, 2, 3 ... рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рд╕рд░рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ (рд░рдВрдЧ == 0xFF46B1E2), рдЬреИрд╕рд╛ рдХрд┐ рдкреИрд▓реЗрдЯ рдЧреЗрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЗрдВ рдПрдХ рдирд╛рд░рдВрдЧреА рд░рдВрдЧ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдмрдХрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВрдЧреЗ:
 private byte[][] colorsToIds(int[][] tableColor) { int size = tableColor.length; byte[][] out = new byte[size][size]; int colorsReaded = 1; //    for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int color = tableColor[i][j]; for (byte k = 0; k < colorsReaded; k++) { //     if (colors[k] == -1) { colors[k] = color; colorsReaded++; if (colorsReaded > MAX_COLORS) colorsReaded = MAX_COLORS; } //     ,    ID if (color == colors[k]) { out[i][j] = k; break; } } } } return out; } 


MAX_COLORS рдпрд╣рд╛рдВ 6 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд▓рдб-рдЗрдЯ рдЧреЗрдо рдореЗрдВ рдкреИрд▓реЗрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХрдИ рд░рдВрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдХреЛрдИ рдкреИрд▓реЗрдЯ рдореЗрдВ рджрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЕрдм рдЖрдк рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд┐рддреНрд░ 1 рдореЗрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рдЫрд╡рд┐ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдЖрдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рдирд╣реАрдВ рдерд╛:

0 1 2 2 3 3 0 0 1 4 2 3 5 3
2 4 1 1 5 4 5 0 2 4 5 3 4 4
3 1 1 5 2 1 3 5 5 2 1 0 4 2
0 3 1 0 5 4 4 1 4 1 4 5 3 5
4 5 0 4 4 4 3 2 0 3 1 0 0 5
0 4 3 4 1 1 2 2 3 2 4 3 1 2
3 2 0 0 5 2 1 5 3 0 2 1 4 4
3 3 5 3 1 5 3 0 3 5 2 4 1 1
3 3 3 3 0 5 0 3 5 0 1 4 2 4
4 2 3 0 2 1 0 3 1 3 2 5 2 3
5 5 1 4 2 3 5 4 1 2 5 0 4 0
5 2 0 2 2 3 2 5 4 1 1 5 0 5
1 0 0 5 5 5 4 1 2 2 3 2 2 0
3 2 2 3 4 3 0 3 2 2 4 3 5 5

рднрд░рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЗрд╖реНрдЯрддрдо рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛



рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреИрд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдирдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рдорд╛рдиреЗрдЧрд╛ред
 private byte getNextFillColor(byte[][] table) { //    int fillSize = (int) Math.pow(MAX_COLORS, FILL_STEPS); int[] fillRate = new int[fillSize]; //     int[] fillPow = new int[FILL_STEPS]; for (int i = 0; i < FILL_STEPS; i++) { fillPow[i] = (int) Math.pow(MAX_COLORS, i); } //  FILL_STEPS  MAX_COLORS  for (int i = 0; i < fillSize; i++) { byte[][] iteration = copyTable(table); for (int j = 0; j < FILL_STEPS; j++) { byte fillColor = (byte) (i / fillPow[j] % MAX_COLORS); fillTable(iteration, fillColor); } //     fillRate[i] = getFillCount(iteration); } //       FILL_STEPS   int maxArea = fillRate[0]; int maxColor = 0; for (int i = 1; i < fillSize; i++) { if (fillRate[i] > maxArea) { maxColor = i; maxArea = fillRate[i]; } } //        byte colorID = (byte) (maxColor % MAX_COLORS); fillTable(table, colorID); return colorID; } 


рдЕрдм рд╣рдо рдЪрд╛рд░ рдорд┐рд╕рдХрд▓реНрдЪрд░ рдЖрдЧреЗ рдФрд░ рдЫрд╣ рд░рдВрдЧреЛрдВ рдкреИрд▓реЗрдЯ рдореЗрдВ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкреВрд░реНрдг рдЬреАрддрдиреЗ рдХрд╛ рдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдВ:
 ArrayList<Byte> seq = new ArrayList<Byte>(); while(!gameCompleted(copyTable)) { seq.add(getNextFillColor(copyTable)); } 

gameCompleted рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рд╕реЗрд▓ рдХрд┐рд╕реА рдПрдХ рд░рдВрдЧ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЧреЗрдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ, рд╣рдо рдЙрд╕реЗ рдЕрдкрдирд╛ рдЪрд┐рддреНрд░ 1 рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛:
1 2 1 3 0 5 4 0 3 1 0 5 3 1 4 1 5 2 4 0 5
рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред

рднрд░рдг рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛



рддреЛ, рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд▓реЗрдЯ, рдХреНрд╖реЗрддреНрд░ рдФрд░ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред рдмрдЯрди рд╣реИрдВред рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрдЯрди рдЕрдХреНрд╕рд░ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ред рд╣рдо рдЗрд╕ рддрдХ рд╕реАрдорд┐рдд рд░рд╣реЗрдВрдЧреЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЕрдЪрд╛рдирдХ рдХрд╣реАрдВ рдкрд░ рд╢реАрд░реНрд╖ рдкрд░ рдпрд╛ рджрд╛рдИрдВ рдУрд░ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдЦреЗрд▓ рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдЯрди рдХрд╛ рд░рдВрдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдкреИрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдмрд┐рдВрджреБрдУрдВ рдХреА рдПрдХ рд╕рд░рд▓ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ рдФрд░ рдПрдХ рдмрдЯрди рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦреЗрдВ:



рдЪрд┐рддреНрд░рд╛ 3. рднрд╛рдЧреЛрдВ рдореЗрдВ рдЫрд╡рд┐ рдХрд╛ рдЯреВрдЯрдирд╛ред

рдХреЛрдб рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 public Point[] getButtons(int[] colors) { Point[] out = new Point[colors.length]; //      int size = boardSize * cellSize; //   ,      Rectangle[] partsOfImage = new Rectangle[] { new Rectangle(0, board.y, board.x, size), //    new Rectangle(0, 0, w, board.y), //    new Rectangle(board.x+size, board.y, w-board.x-size, size), //    new Rectangle(0, board.y+size, w, h-board.y-size) //    }; for (int i = 0; i < partsOfImage.length; i++) { Rectangle rect = partsOfImage[i]; BufferedImage part = image.getSubimage(rect.x, rect.y, rect.width, rect.height); //   ,     boolean found = true; for (int j = 0; j < colors.length; j++) { if (colors[i] == -1) continue; Point pt = findButton(part, colors[j]); if (pt != null) { //      pt.translate(rect.x, rect.y); out[j] = pt; } else { found = false; break; } } if (found) return out; } //      return null; } 


FindButton рдмрд╕ рдЫрд╡рд┐ рдХреЗ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рджрд┐рдП рдЧрдП рд░рдВрдЧ рдХреЗ рд╕рдорд╛рди рд░рдВрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рдВрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрд░рдЬреАрдмреА рдШрдЯрдХреЛрдВ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛:
 private boolean isEquals(int color1, int color2, int tolerance) { if (tolerance < 2) return color1 == color2; int r1 = (color1 >> 16) & 0xff; int g1 = (color1 >> 8) & 0xff; int b1 = color1 & 0xff; int r2 = (color2 >> 16) & 0xff; int g2 = (color2 >> 8) & 0xff; int b2 = color2 & 0xff; return (Math.abs(r1 - r2) <= tolerance) && (Math.abs(g1 - g2) <= tolerance) && (Math.abs(b1 - b2) <= tolerance); } 


рдЦреЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рди



рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╕рднреА рдмрдЯрди рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдХреНрд▓рд┐рдХ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдХреНрд░рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк "рдЖрдЯреЛрдХреНрд▓рд┐рдХ" рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрд░реНрд╕рд░ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдФрд░ рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП, рд╡рд╣реА рд╡рд░реНрдЧ java.awt.Robot рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 public void clickPoint(Point click) { robot.mouseMove(click.x, click.y); robot.mousePress(InputEvent.BUTTON1_MASK); robot.delay(CLICK_DELAY); robot.mouseRelease(InputEvent.BUTTON1_MASK); } 


рдореБрдЭреЗ рд╕рдордЭрд╛рдПрдВ: рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд░реНрд╕рд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдХреЛ рджрдмрд╛рддреЗ рд╣реИрдВ, рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рдХреБрдЫ рдЕрдВрд╢реЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗ, рдФрд░ рдлрд┐рд░ рдмрдЯрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдФрд░ рдХреНрд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрд▓рд┐рдХрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 public void autoClick(Point[] buttons, byte[] result) { for (int i = 0; i < result.length; i++) { clickPoint(buttons[result[i]]); } } 


рд╡рд╣ рд╕рдм рдЕрдм рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЛрдИ рдмрдЯрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдмрд╕ рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ, рдЙрд╕ рдкрд░ рд╕рднреА рд░рдВрдЧреЛрдВ рдХреЛ рдбреНрд░рд╛ рдХрд░реЗрдВ (рдХреНрд░рдо рдореЗрдВ рд░рдВрдЧ, рди рдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 0, 1, 2 ...) рдХреНрд░рдо рдореЗрдВред
 public BufferedImage sequenceToImage(byte[] ids, int[] palette) { final int size = 20; //    //    10    final int CELLS_IN_ROW = 10; int width = CELLS_IN_ROW * size; if (width == 0) width = size; int rows = ids.length / CELLS_IN_ROW; BufferedImage out = new BufferedImage(width, (rows*size)+size, BufferedImage.TYPE_INT_RGB); Graphics G = out.getGraphics(); for (int i = 0; i < ids.length; i++) { G.setColor(new Color(palette[ids[i]])); G.fillRect(i % CELLS_IN_ROW * size, i / CELLS_IN_ROW * size, size, size); } G.dispose(); return out; } 


рдирд┐рд╖реНрдХрд░реНрд╖



рдпрд╣рд╛рдБ рд╡рд╣реА рдЖрдВрдХрдбрд╝рд╛ 1 рдХреЗ рд╕рд╛рде рд╣реБрдЖ рд╣реИ:

рдЪрд┐рддреНрд░рд╛ 4. рдкрд░рд┐рдгрд╛рдоред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЧреАрдереВрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕реНрд░реЛрдд: рдмрд╛рдврд╝-рдпрд╣-рдмреЙрдЯ

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


All Articles