Завантажте зображення в цей фрагмент стека та перемістіть на ньому мишу. Намалюється чорна крива, що слідує за кутом відтінку , починаючи з точки курсору:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><style>canvas{border:1px solid black;}</style>Load an image: <input type='file' onchange='load(this)'><br><br>Max length <input id='length' type='text' value='300'><br><br><div id='coords'></div><br><canvas id='c' width='100' height='100'>Your browser doesn't support the HTML5 canvas tag.</canvas><script>function load(t){if(t.files&&t.files[0]){var e=new FileReader;e.onload=setupImage,e.readAsDataURL(t.files[0])}}function setupImage(t){function e(t){t.attr("width",img.width),t.attr("height",img.height);var e=t[0].getContext("2d");return e.drawImage(img,0,0),e}img=$("<img>").attr("src",t.target.result)[0],ctx=e($("#c")),ctxRead=e($("<canvas>"))}function findPos(t){var e=0,a=0;if(t.offsetParent){do e+=t.offsetLeft,a+=t.offsetTop;while(t=t.offsetParent);return{x:e,y:a}}return void 0}$("#c").mousemove(function(t){function e(t,e){var a=ctxRead.getImageData(t,e,1,1).data,i=a[0]/255,r=a[1]/255,o=a[2]/255;return Math.atan2(Math.sqrt(3)*(r-o),2*i-r-o)}if("undefined"!=typeof img){var a=findPos(this),i=t.pageX-a.x,r=t.pageY-a.y;$("#coords").html("x = "+i.toString()+", y = "+r.toString());var o=parseInt($("#length").val());if(isNaN(o))return void alert("Bad max length!");for(var n=[i],f=[r],h=0;n[h]>=0&&n[h]<this.width&&f[h]>=0&&f[h]<this.height&&o>h;)n.push(n[h]+Math.cos(e(n[h],f[h]))),f.push(f[h]-Math.sin(e(n[h],f[h]))),h++;ctx.clearRect(0,0,this.width,this.height),ctx.drawImage(img,0,0);for(var h=0;h<n.length;h++)ctx.fillRect(Math.floor(n[h]),Math.floor(f[h]),1,1)}});</script>
Я тестував цей фрагмент лише в Google Chrome.
Наприклад, коли курсор вище червоного кольору, крива має нахил 0 °, але коли вона вище жовтого кольору, вона має нахил 60 °. Крива продовжується на вказану довжину, постійно змінюючи свій нахил, щоб відповідати відтінку.
Завантажте це зображення, і коли ви кладете курсор на нього, лінія прямо навколо курсора повинна зробити повний поворот проти годинникової стрілки:
Це та це інші акуратні зображення, які слід спробувати. (Вам потрібно буде зберегти їх, а потім завантажити їх фрагментом. Вони не можуть бути безпосередньо пов’язані через обмеження перехресного походження.)
Ось фрагмент фрагменту, який не є мінімізованим:
Виклик
Напишіть програму, яка робить те, що робить фрагмент, тільки не інтерактивно. Візьміть зображення та координату (x, y) у межах зображення та максимальну довжину кривої. Виведіть одне і те ж зображення із доданою чорною кривою, яка слідує за кутами відтінку, починаючи з (x, y) і закінчується, коли воно досягло максимальної довжини або потрапляє на межу зображення.
Зокрема, запустіть криву з (x, y) і виміряйте там кут відтінку. Переходьте один блок (ширина одного пікселя) у цьому напрямку, зазначивши, що ваша нова позиція, швидше за все, не є цілою координатою . Позначте ще одну крапку на кривій і перейдіть знову, використовуючи відтінок від найближчого пікселя (використовуючи щось на кшталт floor
або round
, я не буду перевіряти це точно). Продовжуйте так, поки крива не вийде за межі або вона не перевищить максимальну довжину. Для закінчення побудуйте всі точки кривої у вигляді одиничних чорних пікселів (знову ж таки, використовуйте найближчі пікселі), накладені на зображення, та виведіть це нове зображення.
"Кут відтінку" - це просто відтінок :
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
Зауважте, що для значень масштабів сірого, які технічно не мають відтінку, це повертає 0, але це нормально.
(Ця формула використовує atan2
більшість вбудованих математичних бібліотек. R, G, B - від 0 до 1, а не від 0 до 255.)
- Ви можете використовувати будь-який загальний формат файлу зображень без втрат, а також будь-які бібліотеки зображень.
- Візьміть введення з stdin або командного рядка або напишіть функцію з аргументами для імені файлу зображення, x і y та максимальної довжини.
- Максимальна довжина і x і y - це завжди негативні цілі числа. Можна припустити, що х і у знаходяться в діапазоні.
- Збережіть вихідне зображення з вибором імені або просто покажіть його.
- Ваша реалізація не повинна точно відповідати фрагменту. Кілька пікселів у дещо різних місцях через дещо інший метод округлення / обчислення - це добре. (У хаотичних випадках це може призвести до кривих, які в кінцевому підсумку відрізняються, але поки вони візуально виглядають правильно, це добре.)
Оцінка балів
Виграє найменше подання в байтах .