Bu yığın snippet'ine bir resim yükleyin ve farenizi üzerinde hareket ettirin. İmleç noktanızdan başlayarak ton açısını takip eden siyah bir eğri çizilecektir:
<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>
Bu pasajı yalnızca Google Chrome'da test ettim.
Örneğin, imleç kırmızı üzerindeyken, eğrinin 0 ° eğimi vardır, ancak sarının üstünde olduğunda 60 ° eğimi vardır. Eğri, belirtilen uzunluk boyunca devam eder ve eğimini tonla eşleşecek şekilde sürekli değiştirir.
Bu görüntüyü yükleyin ve imleci üzerine kaydırdığınızda, imlecin hemen yanındaki çizgi saat yönünün tersine tam bir dönüş yapmalıdır:
Bu ve bu denemek için diğer düzgün görüntüler. (Bunları kaydetmeniz ve ardından snippet ile yüklemeniz gerekir. Çapraz kaynak kısıtlamaları nedeniyle doğrudan bağlanamazlar.)
Snippet'in küçültülmemiş bir sürümü:
Meydan okuma
Parçacığın ne yaptığını yapan bir program yazın, sadece etkileşimli değil. Bir görüntü ve görüntünün sınırlarında (x, y) bir koordinat ve maksimum eğri uzunluğu alın. Aynı görüntüyü, (x, y) ile başlayan ve maksimum uzunluğa ulaştığında veya bir görüntü sınırına çarptığında biten renk tonlarını izleyen eklenen siyah eğri ile çıktılayın.
Özellikle, eğriyi (x, y) 'de başlatın ve oradaki renk tonu açısını ölçün. Yeni konumunuzun büyük olasılıkla bir tamsayı koordinatı olmadığını belirterek, bu yönde bir birim (bir piksel genişliği) kullanın . Eğrideki başka bir noktayı işaretleyin ve en yakın pikseldeki tonu kullanarak tekrar hareket ettirin ( floor
veya gibi bir şey kullanarak round
bunu tam olarak kontrol etmeyeceğim). Eğri sınırların dışına çıkıncaya veya maksimum uzunluğu aşana kadar bu şekilde devam edin. İşlemi tamamlamak için, tüm eğri noktalarını görüntünün üzerine bindirilmiş tek bir siyah piksel olarak çizin (yine en yakın pikselleri kullanın) ve bu yeni görüntüyü çıktılayın.
"Ton açısı" sadece renk tonudur :
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
Teknik olarak renk tonu olmayan gri tonlamalı değerler için bu değerin 0 değerini döndürdüğünü, ancak sorun olmadığını unutmayın.
(Bu formülde, atan2
yerleşik matematik kitaplıklarının çoğunun bulunduğu kullanılır. R, G, B, 0 ile 255 arasında değil, 0 ile 1 arasındadır.)
- Herhangi bir yaygın kayıpsız görüntü dosyası biçiminin yanı sıra görüntü kitaplıklarını da kullanabilirsiniz.
- Stdin veya komut satırından girdi alın veya resim dosyası adı, x ve y ve maksimum uzunluk için bağımsız değişkenler içeren bir işlev yazın.
- Maksimum uzunluk ve x ve y her zaman negatif olmayan tamsayılardır. X ve y'nin menzil içinde olduğunu varsayabilirsiniz.
- Çıktı görüntüsünü istediğiniz bir adla kaydedin veya basitçe görüntüleyin.
- Uygulamanızın snippet ile tam olarak eşleşmesi gerekmez. Biraz farklı yuvarlama / hesaplama yöntemi nedeniyle biraz farklı yerlerde birkaç piksel iyi. (Kaotik durumlarda bu, büyük ölçüde farklı olan eğrilere yol açabilir, ancak görsel olarak doğru göründükleri sürece, sorun değil.)
puanlama
Bayt cinsinden en küçük gönderim kazanır.