рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рд╛рдЗрдкрд░рд╕реНрдкреЗрд╕

Habrovchane! рд╣реИрдкреНрдкреА рдХреЙрд╕реНрдореЛрдиреЙрдЯрд┐рдХреНрд╕ рдбреЗ!



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

рдорд╛рд░реНрдЬрд┐рди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдХреЛрдб reqestAnimFrame рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ requestAnimationFrame рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдФрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рд░рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ:
window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(/* function */ callback, /* DOMElement */ element){ window.setTimeout(callback, 1000 / 60); }; })(); function getRandomInt(min, max){ return Math.floor( Math.random() * (max - min + 1) ) + min; } 


рджреГрд╖реНрдЯрд┐рдХреЛрдг 1. рдПрдХ рд╕реНрдХреЗрд▓ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░реЗрдВред

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

Jsfiddle рдкрд░ рдкреВрд░реНрдг рдХреЛрдб рдФрд░ рдбреЗрдореЛред

рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рд░реНрдл рдХреЛрдбред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХреЛрдИ рдЬреАрд╡рди рдирд╣реАрдВ рд╣реИ:

рджреГрд╖реНрдЯрд┐рдХреЛрдг 2. рдореБрдХрд╛рдмрд▓рд╛ред

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯрд╛рд░ рдФрд░ рдПрдХ рд▓реВрдк рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред

Jsfiddle рдкрд░ рдкреВрд░реНрдг рдХреЛрдб рдФрд░ рдбреЗрдореЛред рдореВрд╡рдореЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдореЗрдВ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдВрджреЛрд▓рди

рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ x рдФрд░ y, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддрд╛рд░реЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдХрд░рд┐рдпрд░рд▓рд╛рдЗрдл рддрд╛рд░реЗ рд╕реЗ рд▓реВрдк рдХреА рд╡рд░реНрддрдорд╛рди рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, nx, ny рдФрд░ рдЬреАрд╡рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдХ рдХреЗ рдмрд╛рдж рддрд╛рд░реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рдВрдЧ - рд░рдВрдЧ рд╕рд░рдгреА рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд┐рд╕реА рднреА рд░рдВрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧреАред рджреЛ рд╕рд░рдгрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреНрд╖реАрдгрди рдХреЗ рдХреНрд╖рдг рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЪрд▓рддреА рдФрд░ рдЧрддрд┐рд╣реАрди рд╕рд┐рддрд╛рд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╕реНрдЯрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (рдФрд░ рд╢рд╛рдпрдж рдЖрд╡рд╢реНрдпрдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрдЧреЗ рддрд░реНрдХ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реВрдВред

  var colors = ["white","rgb(200,200,255)"]; function newStar(){ var life = getRandomInt(50,150); var dx = getRandomInt(0,canvas.width); var dy = getRandomInt(0,canvas.height); return { x : dx, y : dy, nx : dx, ny : dy, life : life, currentLife : life, color : colors[getRandomInt(0,1)] }; } var stars = []; var finStars = []; var maxStars = 350; for(var i = 0; i < maxStars; i++){ finStars.push(newStar()); } 


рдЕрдм рдПрдХ рд╕реНрдЯрд╛рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╣рдо рд╕рд░рд▓ рдЧрдгрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:



рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ dx рдЙрд╕реА рддрд░рд╣ рдбрд╛рдИ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХреБрд▓реНрд╣рд╛рдбрд╝реА рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо currentLife рдХреЗ рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ dx рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдбрд╛рдИ = currentLife * (y - cy) / (x - xx) рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯрд╛рд░ рдореЗрдВ рджреЛ рд░рд╛рдЬреНрдп рд╣реЛрддреЗ рд╣реИрдВ - рдЬрдм рдЯреНрд░реЗрди рдмрдврд╝рддреА рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рдШрдЯ рдЬрд╛рддреА рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: 2 рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ 2 рдЪрд░ред (Var1> const1; Var1: const1) рд╕реЗ (var2 <const2? Var2: const2) рдбреНрд░рд╛ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рдмрдврд╝рддрд╛ рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рдПрдХ рд▓реБрдкреНрдд рд╣реЛрддрд╛ рд╕рд┐рддрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИред



рдпрд╣ рд╕рдм рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

  var x = stars[j].x, // (x,y) -  const1 y = stars[j].y, dx = cx - stars[j].x, dy = cy - stars[j].y; if ( Math.abs(dx) > Math.abs(dy) ){ var xLife = dx > 0 ? stars[j].life : - stars[j].life, // (xLife, yLife) - const2.  star.life    ""  yLife = xLife * dy / dx, xCur = dx > 0 ? - stars[j].currentLife : stars[j].currentLife, // (xCur,yCur) -var1 yCur = xCur * dy / dx, xLast = dx > 0 ? xCur + stars[j].life : xCur - stars[j].life, // (xLast,yLast) - var2 yLast = xLast * dy / dx, mod = "x"; } else { var yLife = dy > 0 ? stars[j].life : - stars[j].life, xLife = yLife * dx / dy, yCur = dy > 0 ? - stars[j].currentLife : stars[j].currentLife, xCur = yCur * dx / dy, yLast = dy > 0 ? yCur + stars[j].life : yCur - stars[j].life, xLast = yLast * dx / dy, mod = "y"; } if(dx > 0 && dy > 0) { var qx = x - ( xLife < xLast ? xLife : xLast); var qy = y - ( yLife < yLast ? yLife : yLast); ctx.moveTo( qx < cx ? qx : cx, qy < cy ? qy : cy); var sx = x - ( xCur > 0 ? xCur : 0); var sy = y - ( yCur > 0 ? yCur : 0); ctx.lineTo( sx < cx ? sx : cx, sy < cy ? sy : cy); if ( mod == "x"){ ctx.lineTo( qx < cx ? qx : cx, (qy < cy ? qy : cy) + 2); } else { ctx.lineTo( (qx < cx ? qx : cx) + 2, qy < cy ? qy : cy); } ctx.lineTo( qx < cx ? qx : cx, qy < cy ? qy : cy); ctx.closePath(); stars[j].nx = sx < cx ? sx : cx; stars[j].ny = sy < cy ? sy : cy; } if(dx < 0 && dy < 0) { var qx = x - ( xLife > xLast ? xLife : xLast); var qy = y - ( yLife > yLast ? yLife : yLast); ctx.moveTo( qx > cx ? qx : cx, qy > cy ? qy : cy); var sx = x - ( xCur < 0 ? xCur : 0); var sy = y - ( yCur < 0 ? yCur : 0); ctx.lineTo( sx > cx ? sx : cx, sy > cy ? sy : cy); if ( mod == "x" ){ ctx.lineTo( qx > cx ? qx : cx, (qy > cy ? qy : cy) + 2); } else { ctx.lineTo( (qx > cx ? qx : cx) + 2, qy > cy ? qy : cy); } ctx.lineTo( qx > cx ? qx : cx, qy > cy ? qy : cy); ctx.closePath(); stars[j].nx = sx > cx ? sx : cx; stars[j].ny = sy > cy ? sy : cy; } if(dx < 0 && dy > 0) { var qx = x - ( xLife > xLast ? xLife : xLast); var qy = y - ( yLife < yLast ? yLife : yLast); ctx.moveTo( qx > cx ? qx : cx, qy < cy ? qy : cy); var sx = x - ( xCur < 0 ? xCur : 0); var sy = y - ( yCur > 0 ? yCur : 0); ctx.lineTo( sx > cx ? sx : cx, sy < cy ? sy : cy); if ( mod == "x" ){ ctx.lineTo( qx > cx ? qx : cx, (qy < cy ? qy : cy) + 2); } else { ctx.lineTo( (qx > cx ? qx : cx) + 2, qy < cy ? qy : cy); } ctx.lineTo( qx > cx ? qx : cx, qy < cy ? qy : cy); ctx.closePath(); stars[j].nx = sx > cx ? sx : cx; stars[j].ny = sy < cy ? sy : cy; } if(dx > 0 && dy < 0) { var qx = x - ( xLife < xLast ? xLife : xLast); var qy = y - ( yLife > yLast ? yLife : yLast); ctx.moveTo( qx < cx ? qx : cx, qy > cy ? qy : cy); var sx = x - ( xCur > 0 ? xCur : 0); var sy = y - ( yCur < 0 ? yCur : 0); ctx.lineTo( sx < cx ? sx : cx, sy > cy ? sy : cy); if ( mod == "x" ){ ctx.lineTo( qx < cx ? qx : cx, (qy > cy ? qy : cy) + 2); } else { ctx.lineTo( (qx < cx ? qx : cx) + 2, qy > cy ? qy : cy); } ctx.lineTo( qx < cx ? qx : cx, qy > cy ? qy : cy); ctx.closePath(); stars[j].nx = sx < cx ? sx : cx; stars[j].ny = sy > cy ? sy : cy; } 


рд╣рдорд╛рд░реЗ рд╕реНрдЯрд╛рд░ рдХрд┐рд╕ рддрд┐рдорд╛рд╣реА рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдФрд░ рддреБрд▓рдирд╛рдУрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрдХреЗрдд рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ рд▓рдЧрднрдЧ 4 рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЙрдб рдЪрд░ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЕрдЧреНрд░рдгреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, dL рдХреЛ currentLife рдпрд╛ dy рдХреЗ рдмрд░рд╛рдмрд░)ред рдмрд┐рдирд╛ рдореЙрдб рдХреЗ, рдЪреМрдбрд╝реЗ рдХреЛрдг рдХреА рд╡рдЬрд╣ рд╕реЗ рдСрд░реНрдбрд┐рдиреЗрдЯ рдЕрдХреНрд╖ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рддрд╛рд░реЗ "рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЙрдбрд╝реЗрдВрдЧреЗ"ред

рдФрд░ рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА - рдореВрд▓ рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкрд╛рд╕ рдореЗрдВ, рдХреИрдирд╡рд╛рд╕ рдХреЛ рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рджреЛ рд░рдВрдЧреЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдПрдХ рд╣реА рд░рдВрдЧ рдХреЗ рд╕рднреА рддрд╛рд░реЛрдВ рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рджреГрд╖реНрдЯрд┐рдХреЛрдг 3. рд╕рд╣реАред

рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдПрдХ рд╕рд░рд╕рд░реА рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдереЗред рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдХреЛ рдЖрдЬрдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ Habrahabr рдкрд░ рдЗрд╕реЗ рдХрд╛рдлреА рдордЬрдмреВрддреА рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

Jsfiddle рдкрд░ рдкреВрд░реНрдг рдХреЛрдб рдФрд░ рдбреЗрдореЛред (рдЬреЗрдПрд╕рдПрдлрд▓реНрдб рдЬреАрдердм рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рдФрд░ рдХрд╛рдореЗрдЪреНрдЫрд╛ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдИ рдмрд╛рд░ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ)

рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

  new function () { var center, i, helper, stars; LibCanvas.extract(); helper = new App.Light(new Size( document.width, document.height)); center = helper.app.rectangle.center; stars = []; for(i = 0; i < 350; i++){ new function() { var point = new Point(getRandomInt(document.width/2,document.width),document.height/2), length = getRandomInt(50,150), angle = getRandomInt(0,360), coords = [ new Point(0,0), new Point(0,0), new Point(0,0) ], path = helper.createVector( new Path() .moveTo( coords[0] ) .lineTo( coords[1] ) .lineTo( coords[2] ) .lineTo( coords[0] )).setStyle({fill:"rgb(150,150,150)",stroke:"rgb(150,150,150)"}); point.rotate( - angle.degree(), center); var star = { point : point, length : length, angle : angle, coords : coords, live : 0, setLength : function(){ if (arguments.length > 0){ this.live = arguments[0]; } this.coords[0].x = this.point.x; this.coords[0].y = this.point.y; this.coords[1].x = this.coords[0].x + this.live * Math.cos( this.angle.degree() ); this.coords[1].y = this.coords[0].y - this.live * Math.sin( this.angle.degree() ); this.coords[2].x = this.coords[1].x + 2 * Math.sin( this.angle.degree() ); this.coords[2].y = this.coords[1].y + 2 * Math.cos( this.angle.degree() ); }, path : path }; star.setLength(); stars.push(star); }; } setInterval(function(){ for(var i = 0; i < 350; i++){ stars[i].setLength( stars[i].live + 1 ); stars[i].path.redraw(); } },10); }; 


рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣рд╛рдБ, рдХреЙрдореНрдмреИрдЯ рд╡рд░реНрдЬрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред LibCanvas рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдореВрд▓ рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдмрд╣реБрдд рдХрдо рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ, рдореИрдВрдиреЗ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ libCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛: рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдбрд░ рдерд╛ рдХрд┐ рдРрдб-рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдлрд╝реА рдзреАрдорд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдореИрдВ рд╡реНрдпрд░реНрде рдореЗрдВ рдбрд░ рдЧрдпрд╛ рдерд╛ред


UPD TheShock рд╕реЗ LibCanvas рдкрд░ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

Jsfiddle рдЙрджрд╛рд╣рд░рдг ред рдпрд╣ рдлреБрд▓рд╕реНрдХреНрд░реАрди рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ ред

рдПрдХ рддрд╛рд░реЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯрд╛рд░ рдХреЗ рд▓рд┐рдП рдЧрддрд┐, рд░рдВрдЧ рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 atom.declare( 'Star', App.Element, { progress: 0, opacity: 1, configure: function () { var screenRectangle = this.layer.ctx.rectangle; this.animate = new atom.Animatable(this).animate; this.from = screenRectangle.getRandomPoint(); this.shape = new Polygon(this.from.clone(), this.from.clone(), this.from.clone()); this.angle = -this.from.angleTo(screenRectangle.center); this.sin = this.angle.sin(); this.cos = this.angle.cos(); this.progressSpeed = Math.random() + 0.5; this.color = new atom.Color(128, 128, Number.random(128, 192)).toString(); setTimeout(this.fadeOut.bind(this), Number.random(1000, 8000)); }, fadeOut: function () { this.animate({ time: 2000, props: { opacity: 0 }, onComplete: this.destroy }); }, onUpdate: function () { var sin = this.sin, cos = this.cos, p = this.shape.points; this.progress += this.progressSpeed; p[1].x = p[0].x + this.progress * cos; p[1].y = p[0].y - this.progress * sin; p[2].x = p[1].x + 2 * sin; p[2].y = p[1].y + 2 * cos; this.redraw(); }, renderTo: function (ctx) { ctx.save(); if (this.opacity < 1) ctx.set({ globalAlpha: this.opacity }); ctx.fill( this.shape, this.color ); ctx.restore(); } }); 


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХрдо рд╕рд┐рддрд╛рд░реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 new function () { var helper = new App.Light( new Size(document.width || 800, document.height || 800), { intersection: 'full', invoke: true } ); for(i = 0; i < 200; i++) new Star(helper.layer); atom.frame.add(function () { new Star(helper.layer); }); }; 

// рдпреВрдкреАрдбреА рдЕрдВрдд

рдпрд╣ рд╕рдм рдФрд░ рдлрд┐рд░ рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░рд┐рдпреЛрдВ рдХреЗ рджрд┐рди рдХреЗ рд╕рд╛рде рд╣реИ!

рд╕рдВрджрд░реНрдн:
Jsfiddle рдкрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдгред
Jsfiddle рдкрд░ "рдХреЙрдореНрдмреИрдЯ" рдЙрджрд╛рд╣рд░рдгред
рддреАрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AtomJS рдФрд░ libCanvas ред
Jsfiddle рдкрд░ libCanvas рдкрд░ рддреАрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдгред (jsfiddle рдФрд░ github рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рддреБрд░рдВрдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ)
рдкреНрд░реЛрдореЛ рд╕рд╛рдЗрдЯ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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


All Articles