इस स्टैक स्निपेट में एक छवि लोड करें और उस पर अपना माउस ले जाएँ। एक काला वक्र इस प्रकार है कि रंग कोण, अपने कर्सर बिंदु पर शुरू करने, तैयार किया जाएगा:
<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) छवि की सीमा में समन्वय करें, और अधिकतम वक्र लंबाई। जोड़े गए काले वक्र के साथ एक ही छवि को आउटपुट करें जो hue कोण पर शुरू होता है (x, y) और यह तब समाप्त होता है जब यह अधिकतम लंबाई तक पहुँच जाता है या एक छवि सीमा को हिट करता है।
विशेष रूप से, (x, y) पर वक्र शुरू करें और वहां पर कोण को मापें। उस दिशा में एक इकाई (एक पिक्सेल की चौड़ाई) पर जाएं, यह देखते हुए कि आपकी नई स्थिति एक पूर्णांक समन्वय की संभावना नहीं है । वक्र पर एक अन्य बिंदु चिह्नित करने और फिर से ले जाते हैं, निकटतम पिक्सेल से रंग का उपयोग कर (की तरह कुछ का उपयोग कर floor
या round
, मैं इस ठीक जाँच नहीं लिया जाएगा)। इस तरह से जारी रखें जब तक कि वक्र सीमा से बाहर नहीं जाता है या यह अधिकतम लंबाई से अधिक है। समाप्त करने के लिए, सभी वक्र बिंदुओं को सिंगल ब्लैक पिक्सल्स के रूप में प्लॉट करें (फिर से, निकटतम पिक्सेल का उपयोग करें) छवि पर ओवरले, और इस नई छवि को आउटपुट करें।
"ह्यू एंगल" सिर्फ ह्यू है :
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
ध्यान दें कि ग्रेस्केल मूल्यों के लिए जो तकनीकी रूप से एक ह्यू नहीं है, यह 0 देता है, लेकिन यह ठीक है।
(यह सूत्र उपयोग करता है atan2
जो अधिकांश अंतर्निहित गणित पुस्तकालयों में है। आर, जी, बी 0 से 1 तक हैं, 0 से 255.5 तक नहीं)
- आप किसी भी सामान्य दोषरहित छवि फ़ाइल प्रारूप के साथ-साथ किसी भी छवि लाइब्रेरी का उपयोग कर सकते हैं।
- स्टडिन या कमांड लाइन से इनपुट लें, या छवि फ़ाइल नाम, x और y, और अधिकतम लंबाई के लिए तर्कों के साथ एक फ़ंक्शन लिखें।
- अधिकतम लंबाई और x और y हमेशा nonnegative पूर्णांक होते हैं। आप मान सकते हैं कि x और y सीमा में हैं।
- अपनी पसंद के नाम के साथ आउटपुट छवि को सहेजें या बस इसे प्रदर्शित करें।
- आपके कार्यान्वयन को स्निपेट से बिल्कुल मेल नहीं खाता है। कुछ अलग गोलाई / गणना पद्धति के कारण थोड़े अलग स्थानों में कुछ पिक्सेल ठीक हैं। (अराजक मामलों में यह घटता है जो प्रमुख रूप से भिन्न होता है, लेकिन जब तक वे नेत्रहीन सही दिखते हैं, यह ठीक है।)
स्कोरिंग
बाइट्स में सबसे छोटी सबमिशन जीत जाती है।