Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ JavaScriptΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор ΠœΠ°Ρ€Π΅ΠΉΠ½ Π₯Π°Π²Π΅Ρ€Π±Π΅ΠΊΠ΅

  return form;

};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ всС элСмСнты управлСния, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ нСсколько инструмСнтов.

ЗакругляСмся

ΠžΡ‡Π΅Π½ΡŒ просто ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ инструмСнт для Π²Ρ‹Π²ΠΎΠ΄Π° тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ запрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, ΠΊΡƒΠ΄Π° ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ввСсти тСкст.

tools.Text = function(event, cx) {

  var text = prompt("Text:", "");

  if (text) {

    var pos = relativePos(event, cx.canvas);

    cx.font = Math.max(7, cx.lineWidth) + "px sans-serif";

    cx.fillText(text, pos.x, pos.y);

  }

};

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ΠΉ для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° тСкста ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Π°, Π½ΠΎ для простоты ΠΌΡ‹ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ sans-serif ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡˆΡ€ΠΈΡ„Ρ‚Π°, ΠΊΠ°ΠΊ Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ кисти. ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ – 7 пиксСлСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ мСньшС тСкст Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ.

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ инструмСнт для каляк-маляк – β€œΠ°ΡΡ€ΠΎΠ·ΠΎΠ»ΡŒβ€. Она рисуСт случайныС Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ΄ ΠΊΠΈΡΡ‚ΡŒΡŽ, ΠΏΠΎΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ, создавая Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ густыС Ρ‚ΠΎΡ‡ΠΊΠΈ Π² зависимости ΠΎΡ‚ скорости двиТСния курсора.

tools.Spray = function(event, cx) {

  var radius = cx.lineWidth / 2;

  var area = radius * radius * Math.PI;

  var dotsPerTick = Math.ceil(area / 30);


  var currentPos = relativePos(event, cx.canvas);

  var spray = setInterval(function() {

    for (var i = 0; i < dotsPerTick; i++) {

      var offset = randomPointInRadius(radius);

      cx.fillRect(currentPos.x + offset.x,

                  currentPos.y + offset.y, 1, 1);

    }

  }, 25);

  trackDrag(function(event) {

    currentPos = relativePos(event, cx.canvas);

  }, function() {

    clearInterval(spray);

  });

};

ΠΡΡ€ΠΎΠ·ΠΎΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ setInterval для выплёвывания Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 25 миллисСкунд, ΠΏΠΎΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ. Ѐункция trackDrag ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ currentPos ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»Π° Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ курсора, ΠΈ для Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° ΠΏΡ€ΠΈ отпускании ΠΊΠ½ΠΎΠΏΠΊΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, сколько Ρ‚ΠΎΡ‡Π΅ΠΊ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°, функция подсчитываСт Ρ€Π°Π·ΠΌΠ΅Ρ€ области Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ кисти ΠΈ Π΄Π΅Π»ΠΈΡ‚ Π΅Π³ΠΎ Π½Π° 30. Для поиска случайного полоТСния ΠΏΠΎΠ΄ ΠΊΠΈΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция randomPointInRadius.

function randomPointInRadius(radius) {

  for (;;) {

    var x = Math.random() * 2 - 1;

    var y = Math.random() * 2 - 1;

    if (x * x + y * y <= 1)

      return {x: x * radius, y: y * radius};

  }

}

Π­Ρ‚Π° функция создаёт Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ (-1,-1) ΠΈ (1,1). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ΠΎΡ€Π΅ΠΌΡƒ ΠŸΠΈΡ„Π°Π³ΠΎΡ€Π°, ΠΎΠ½Π° провСряСт, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ созданная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΡ€ΡƒΠ³Π° с радиусом 1. Когда такая Ρ‚ΠΎΡ‡ΠΊΠ° находится, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π½Π° радиус.

Π¦ΠΈΠΊΠ» Π½ΡƒΠΆΠ΅Π½ для Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ распрСдСлСния Ρ‚ΠΎΡ‡Π΅ΠΊ. ΠŸΡ€ΠΎΡ‰Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΊΡ€ΡƒΠ³Π΅, взяв случайный ΡƒΠ³ΠΎΠ» ΠΈ радиус ΠΈ Π²Ρ‹Π·Π²Π°Π² Math.sin ΠΈ Math.cos для создания Ρ‚ΠΎΡ‡ΠΊΠΈ. Но Ρ‚ΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‡ΠΊΠΈ с большСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ появлялись Π±Ρ‹ Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ ΠΊΡ€ΡƒΠ³Π°. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ».

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для рисования Π³ΠΎΡ‚ΠΎΠ²Π°. ЗапуститС ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅.

<link rel="stylesheet" href="css/paint.css">

<body>

  <script>createPaint(document.body);</script>

</body>

УпраТнСния

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅Ρ‰Ρ‘ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΠΉ возмоТностСй.

ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ инструмСнт Rectangle, Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (см. ΠΌΠ΅Ρ‚ΠΎΠ΄ fillRect ΠΈΠ· Π³Π»Π°Π²Ρ‹ 16) Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ. ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΈΠ· Ρ‚ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ, ΠΈ Π΄ΠΎ Ρ‚ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ ΠΎΠ½ отпустил ΠΊΠ½ΠΎΠΏΠΊΡƒ. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ послСднСС дСйствиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π»Π΅Π²Π΅Π΅ ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ.

Когда это Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π΄Ρ€ΠΎΠΆΠΈΡ‚ ΠΈ Π΅Π³ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ Π²ΠΈΠ΄Π½ΠΎ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ способ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π²ΠΎ врСмя двиТСния ΠΌΡ‹ΡˆΠΈ, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ выводился Π½Π° холст, ΠΏΠΎΠΊΠ° ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π΅ ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°?

Если Π½Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, вспомнитС ΠΎ стилС position: absolute, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ обсуТдали Π² Π³Π»Π°Π²Π΅ 13, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠ·Π΅Π» ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Бвойства pageX ΠΈ pageY событий ΠΌΡ‹ΡˆΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ располоТСния элСмСнта ΠΏΠΎΠ΄ ΠΌΡ‹ΡˆΡŒΡŽ, записывая Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния Π² стили left, top, width ΠΈ height.

<script>

  tools.Rectangle = function(event, cx) {

    // Π’Π°Ρˆ ΠΊΠΎΠ΄

  };

</script>


<link rel="stylesheet" href="css/paint.css">

<body>

  <script>createPaint(document.body);</script>

</body>

Π’Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π°

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ инструмСнт – Π²Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ‰Π΅Π»Ρ‡ΠΊΠΎΠΌ ΠΌΡ‹ΡˆΠΈ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится ΠΏΠΎΠ΄ курсором. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ инструмСнт.

Для Π΅Π³ΠΎ изготовлСния понадобится доступ ΠΊ содСрТимому холста. ΠœΠ΅Ρ‚ΠΎΠ΄ toDataURL ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ это ΠΈ Π΄Π΅Π»Π°Π», Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ пиксСлС ΠΈΠ· URL с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ слоТно. ВмСсто этого ΠΌΡ‹ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ контСкста getImageData, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ кусок ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° со свойствами width, height ΠΈ data. Π’ свойствС data содСрТится массив чисСл ΠΎΡ‚ 0 Π΄ΠΎ 255, ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля хранится Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° β€” red, green, blue ΠΈ alpha (ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ).

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ числа ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ пиксСля холста, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‚ пуст (всС пиксСли – ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅ Ρ‡Ρ‘Ρ€Π½Ρ‹Π΅), ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° пиксСль ΠΎΠΊΡ€Π°ΡˆΠ΅Π½ Π² красный Ρ†Π²Π΅Ρ‚.

function pixelAt(cx, x, y) {

  var data = cx.getImageData(x, y, 1, 1);

  console.log(data.data);

}


var canvas = document.createElement("canvas");

var cx = canvas.getContext("2d");

pixelAt(cx, 10, 10);

// β†’ [0, 0, 0, 0]


cx.fillStyle = "red";

cx.fillRect(10, 10, 1, 1);

pixelAt(cx, 10, 10);

// β†’ [255, 0, 0, 255]

АргумСнты getImageData ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° x ΠΈ y, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΠ΄ΡƒΡ‚ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота.

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π² этом ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ трСмя Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ пиксСля. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ обновлСния поля color ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ†Π²Π΅Ρ‚Π°. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ fillStyle ΠΈ strokeStyle контСкста установлСны Π² Ρ†Π²Π΅Ρ‚, оказавшийся ΠΏΠΎΠ΄ курсором.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ эти свойства ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ любой Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ CSS, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ запись Π²ΠΈΠ΄Π° rgb(R, G, B), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 15.

ΠœΠ΅Ρ‚ΠΎΠ΄ getImageData ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ ограничСния, Ρ‡Ρ‚ΠΎ ΠΈ toDataURL – ΠΎΠ½ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° Π½Π° холстС содСрТатся пиксСли ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, скачанной с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ запись try/catch для сообщСния ΠΎΠ± этих ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΊΠ½ΠΎ alert.

<script>

  tools["Pick color"] = function(event, cx) {

    // Your code here.

  };

</script>


<link rel="stylesheet" href="css/paint.css">

<body>

  <script>createPaint(document.body);</script>

</body>

Π—Π°Π»ΠΈΠ²ΠΊΠ°

Π­Ρ‚ΠΎ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ слоТноС, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅, ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ…ΠΈΡ‚Ρ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ свободноС врСмя ΠΈ Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈ Π½Π΅ ΠΎΡ‚Ρ‡Π°ΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ, Ссли сразу Ρƒ вас Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒΡΡ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ пиксСль ΠΏΠΎΠ΄ курсором ΠΌΡ‹ΡˆΠΈ ΠΈ ΠΏΠΎΠ΄ Ρ†Π΅Π»ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ пиксСлСй Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅Π³ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚. Для Ρ†Π΅Π»Π΅ΠΉ нашСго упраТнСния ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта Π³Ρ€ΡƒΠΏΠΏΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС пиксСли, Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ, двигаясь ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ пиксСлю ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ (Π½ΠΎ Π½Π΅ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ), Π½Π΅ ΠΏΡ€ΠΈΠΊΠ°ΡΠ°ΡΡΡŒ ΠΊ пиксСлям, Ρ‡Π΅ΠΉ Ρ†Π²Π΅Ρ‚ отличаСтся ΠΎΡ‚ исходного.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° дСмонстрируСт Π½Π°Π±ΠΎΡ€ пиксСлСй, ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ…, ΠΊΠΎΠ³Π΄Π° инструмСнт Π·Π°Π»ΠΈΠ²ΠΊΠΈ примСняСтся ΠΊ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ пиксСлю:



Π—Π°Π»ΠΈΠ²ΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·Ρ€Ρ‹Π²Ρ‹ ΠΈ Π½Π΅ касаСтся пиксСлСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСльзя Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈ исходный.

Π’Π°ΠΌ вновь понадобится getImageData для выяснСния Ρ†Π²Π΅Ρ‚Π° пиксСля. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всю ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π·Π° Ρ€Π°Π·, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ пиксСлям ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ массива. ПиксСли Π² массивС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ схоТим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с Ρ€Π΅ΡˆΡ‘Ρ‚ΠΊΠΎΠΉ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 7, ΠΏΠΎ рядам, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль описываСтся Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ значСниями. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для пиксСля с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (x,y) находится Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (x + y Γ— width) Γ— 4.

Π’ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Π² рассмотрСниС Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠ΅ число (Π°Π»ΡŒΡ„Π°), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ Ρ‡Ρ‘Ρ€Π½Ρ‹Π΅ ΠΈ пустыС (ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅) пиксСли.

Поиск сосСдних пиксСлСй Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ повСрхности пиксСлСй Π²Π²Π΅Ρ€Ρ…, Π²Π½ΠΈΠ·, Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ, ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΌ находятся пиксСли Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚Π°. Π—Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ всю Π³Ρ€ΡƒΠΏΠΏΡƒ пиксСлСй Π½Π°ΠΉΡ‚ΠΈ Π½Π΅ получится. ВмСсто этого Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° отслСТиваниС Π² рСгулярных выраТСниях, описанноС Π² Π³Π»Π°Π²Π΅ 9. Когда Ρƒ вас Π΅ΡΡ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ направлСния, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС Ρ‚Π΅, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ прямо сСйчас Π½Π΅ ΠΈΠ΄Ρ‘Ρ‚Π΅, ΠΈ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ шага.