Chargez une image dans cet extrait de pile et déplacez votre souris dessus. Une courbe noire qui suit l' angle de teinte , en commençant au point du curseur, sera dessinée:
<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>
Je n'ai testé cet extrait que dans Google Chrome.
Par exemple, lorsque le curseur est au-dessus du rouge, la courbe a une pente de 0 °, mais lorsqu'elle est au-dessus du jaune, elle a une pente de 60 °. La courbe continue sur la longueur spécifiée, changeant continuellement sa pente pour correspondre à la teinte.
Chargez cette image et lorsque vous déplacez le curseur dessus, la ligne juste autour du curseur doit faire un tour complet dans le sens antihoraire:
Ceci et ce sont d'autres images soignées à essayer. (Vous devrez les enregistrer, puis les charger avec l'extrait de code. Ils ne peuvent pas être directement liés en raison de contraintes d'origine croisée.)
Voici une version non réduite de l'extrait:
Défi
Écrivez un programme qui fait ce que l'extrait fait, mais pas de manière interactive. Prenez une image et une coordonnée (x, y) dans les limites de l'image et une longueur de courbe maximale. Sortez la même image avec la courbe noire ajoutée qui suit les angles de teinte commençant à (x, y) et se termine lorsqu'elle a atteint la longueur maximale ou atteint une limite d'image.
Plus précisément, commencez la courbe à (x, y) et mesurez l'angle de teinte à cet endroit. Allez d'une unité (largeur d'un pixel) dans cette direction, en notant que votre nouvelle position n'est probablement pas une coordonnée entière . Marquez un autre point sur la courbe et déplacez-vous à nouveau, en utilisant la teinte du pixel le plus proche (en utilisant quelque chose comme floor
ou round
, je ne vérifierai pas cela précisément). Continuez comme ceci jusqu'à ce que la courbe sorte des limites ou dépasse la longueur maximale. Pour terminer, tracez tous les points de la courbe sous la forme de pixels noirs uniques (à nouveau, utilisez les pixels les plus proches) superposés sur l'image, et sortez cette nouvelle image.
"L'angle de teinte" est juste la teinte :
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
Notez que pour les valeurs de niveaux de gris qui n'ont techniquement pas de teinte, cela renvoie 0, mais c'est très bien.
(Cette formule utilise la atan2
plupart des bibliothèques mathématiques intégrées. R, G, B sont de 0 à 1, pas de 0 à 255.)
- Vous pouvez utiliser n'importe quel format de fichier d'image sans perte commun ainsi que toutes les bibliothèques d'images.
- Prenez l'entrée de stdin ou de la ligne de commande, ou écrivez une fonction avec des arguments pour le nom du fichier image, x et y, et la longueur maximale.
- La longueur maximale et x et y sont toujours des entiers non négatifs. Vous pouvez supposer que x et y sont dans la plage.
- Enregistrez l'image de sortie avec un nom de votre choix ou affichez-la simplement.
- Votre implémentation ne doit pas nécessairement correspondre exactement à l'extrait de code. Quelques pixels à des endroits légèrement différents en raison d'une méthode d'arrondi / de calcul légèrement différente conviennent. (Dans les cas chaotiques, cela pourrait conduire à des courbes qui finissent par être très différentes, mais tant qu'elles semblent correctes visuellement, c'est bien.)
Notation
La plus petite soumission en octets gagne.