HTML5 рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдмрд┐рд▓рд┐рдирд┐рдпрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд┐рд░реВрдкрдг


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ shaders рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ 2 рдбреА-рдХреИрдирд╡рд╕ рдореЗрдВ "рд╢реБрджреНрдз" рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреА рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд┐рд░реВрдкрдг рдХреА рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕реАрдзреЗ рдЫрд╡рд┐ рдкрд┐рдХреНрд╕рд▓ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдХрд░ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред


рдХреИрдирд╡рд╕ рдФрд░ рдкрд┐рдХреНрд╕рд▓


рдореИрдВ рдХреИрдирд╡рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╣реИред рд╣рдореЗрдВ рдЙрд╕ рдЪреАрдЬрд╝ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред рдкрд╣рд▓реЗ 2 рдбреА рд╕рдВрджрд░реНрдн рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:
var context = canvas.getContext('2d'); 

рдпрд╣ рд╕рдВрджрд░реНрдн рджреЛ-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ pies рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ:
 var pixels = context.getImageData(x, y, width, height); context.putImageData(pixels, x, y); 

рдпреЗ рдРрд╕реЗ рдкрд┐рдХреНрд╕рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдРрд╕реА рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕, рдкреНрд░рддрд┐ рдЪреИрдирд▓ рдмрд╛рдЗрдЯ (R, G, B, A) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдкрд┐рдХреНрд╕реЗрд▓ рдЗрди рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рд╣реИрдВред рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ (рдПрдХреНрд╕, рд╡рд╛рдИ - рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рд╕реА - рдЪреИрдирд▓, рдмреА - рдореВрд▓реНрдп) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ:
 pixels.data[(x+y*height)*4+c] = b; 

рд╡рд┐рд░реВрдкрдг рд╕рдорд╛рд░реЛрд╣


рдЬрд┐рд╕ рдЫрд╡рд┐ рдкрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд┐рд░реВрдкрдг рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ (рдмрд╛рдж рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╣реЗрдВрдЧреЗ), рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореВрд▓ рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХрд╣реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдЫрд╡рд┐ рдПрдХ рдмрдирд╛рд╡рдЯ рд╣реИ, рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ рдпреЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рд╣реИрдВ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЫрд╡рд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд▓рдЧрднрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
 var zoom = function(px, py) { return { 'x': (px+width/2)*0.5, 'y': (py+height/2)*0.5 } } 

рдЖрдЗрдП рдЕрдиреНрдп рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджреЗрдЦрддрд╛; рдЧрдгрд┐рдд рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред
 var twirl = function(px, py) { var x = px-width/2; var y = py-height/2; var r = Math.sqrt(x*x+y*y); var maxr = width/2; if (r>maxr) return { 'x':px, 'y':py } var a = Math.atan2(y,x); a += 1-r/maxr; var dx = Math.cos(a)*r; var dy = Math.sin(a)*r; return { 'x': dx+width/2, 'y': dy+height/2 } } 

 var reflect = function(px, py) { if (py<height/2) return { 'x': px, 'y': py } var dx = (py-height/2)*(-px+width/2)/width; return { 'x': px+dx, 'y': height-py } } 

 var spherize = function(px,py) { var x = px-width/2; var y = py-height/2; var r = Math.sqrt(x*x+y*y); var maxr = width/2; if (r>maxr) return { 'x':px, 'y':py } var a = Math.atan2(y,x); var k = (r/maxr)*(r/maxr)*0.5+0.5; var dx = Math.cos(a)*r*k; var dy = Math.sin(a)*r*k; return { 'x': dx+width/2, 'y': dy+height/2 } } 

рд╣реИрд╢ рдЯреЗрдмрд▓


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЯреЗрдХреНрд╕рд▓реНрд╕ рд▓реЗрдиреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рди рдХрд░реЗрдВ? рдпрд╣ рдмрд╣реБрдд рддрдирд╛рд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдЯреЗрдмрд▓ рдЖрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд╕рдВрдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 //    .   ,      . var setTranslate = function(translator) { if (typeof translator === 'string') translator = this[translator]; for (var y=0; y<height; y++) { for (var x=0; x<width; x++) { var t = translator(x, y); map[(x+y*height)*2+0] = Math.max(Math.min(tx, width-1), 0); map[(x+y*height)*2+1] = Math.max(Math.min(ty, height-1), 0); } } } 

рдмрд┐рд▓рд┐рдирд┐рдпрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ


рд╣рдорд╛рд░реЗ рдореВрдб рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рд╕реЗ рддреЗрдЬ рд╕реАрдорд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢рд╛рд╕реНрддреНрд░реАрдп рдмрд┐рд▓рд┐рдирд┐рдпрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рд░ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХреЛ рдЪрд╛рд░ рдирд┐рдХрдЯрддрдо рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдвреВрдВрдврдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 var colorat = function(x, y, channel) { return texture.data[(x+y*height)*4+channel]; } for (var j=0; j<height; j++) { for (var i=0; i<width; i++) { var u = map[(i+j*height)*2]; var v = map[(i+j*height)*2+1]; var x = Math.floor(u); var y = Math.floor(v); var kx = ux; var ky = vy; for (var c=0; c<4; c++) { bitmap.data[(i+j*height)*4+c] = (colorat(x, y , c)*(1-kx) + colorat(x+1, y , c)*kx) * (1-ky) + (colorat(x, y+1, c)*(1-kx) + colorat(x+1, y+1, c)*kx) * (ky); } } } 

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


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


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


All Articles