이 스택 스 니펫에 이미지를로드하고 이미지 위로 마우스를 이동하십시오. 커서 지점에서 시작 하여 색조 각도 를 따르는 검은 곡선이 그려집니다.
<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>
이 스 니펫은 Chrome에서만 테스트했습니다.
예를 들어, 커서가 빨간색 위에 있으면 곡선의 기울기가 0 °이지만 노란색 위에 있으면 60 °의 기울기가 있습니다. 곡선은 지정된 길이 동안 계속 진행되어 색조와 일치하도록 기울기를 계속 변경합니다.
이 이미지를로드하고 커서를 이미지 위로 이동하면 커서 주위의 선이 시계 반대 방향으로 완전히 회전합니다.
이것 과 이것은 시도 할 다른 깔끔한 이미지입니다. (저장 한 다음 스 니펫으로로드해야합니다. 출처 간 제약으로 인해 직접 연결할 수 없습니다.)
다음은 스 니펫의 축소되지 않은 버전입니다.
도전
스 니펫이 수행하는 작업을 수행하는 프로그램을 대화식이 아닌 작성하십시오. 이미지 경계에서 이미지와 (x, y) 좌표와 최대 커브 길이를 가져옵니다. (x, y)에서 시작하여 색조 각도를 따라 최대 길이에 도달하거나 이미지 경계에 도달하면 끝나는 검은 색 곡선이 추가 된 동일한 이미지를 출력합니다.
구체적으로, (x, y)에서 커브를 시작하고 거기에서 색조 각도를 측정합니다. 새 위치가 정수 좌표가 아닐 가능성이 있으므로 해당 방향으로 한 단위 (한 픽셀 너비)로 이동 하십시오 . 곡선의 다른 점을 표시하고 (같은 것을 사용하여 가장 가까운 픽셀의 색상을 사용하여, 다시 이동 floor
하거나 round
, 내가 정확하게이 확인되지 않습니다). 커브가 범위를 벗어나거나 최대 길이를 초과 할 때까지 이와 같이 계속하십시오. 완료하려면 모든 곡선 점을 이미지에 겹친 단일 검은 색 픽셀 (다시 가장 가까운 픽셀 사용)로 플로팅하고이 새 이미지를 출력합니다.
"hue angle"은 단지 색조입니다 .
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
기술적으로 색조가없는 그레이 스케일 값의 경우 0을 반환하지만 괜찮습니다.
(이 공식은 atan2
대부분의 내장 수학 라이브러리를 사용합니다. R, G, B는 0에서 255가 아닌 0에서 1 사이입니다.)
- 이미지 라이브러리뿐만 아니라 일반적인 무손실 이미지 파일 형식을 사용할 수 있습니다.
- stdin 또는 명령 행에서 입력을 받거나 이미지 파일 이름, x 및 y에 대한 인수 및 최대 길이를 가진 함수를 작성하십시오.
- 최대 길이와 x 및 y는 항상 음이 아닌 정수입니다. x와 y가 범위 내에 있다고 가정 할 수 있습니다.
- 출력 이미지를 원하는 이름으로 저장하거나 간단히 표시하십시오.
- 구현이 스 니펫과 정확히 일치 할 필요는 없습니다. 약간 다른 반올림 / 계산 방법으로 인해 약간 다른 곳에서 몇 픽셀이 좋습니다. 혼란스런 경우 곡선이 크게 달라 지지만 시각적으로보기 만하면 괜찮습니다.