Tải một hình ảnh vào đoạn trích ngăn xếp này và di chuyển chuột của bạn qua nó. Một đường cong màu đen theo góc màu , bắt đầu từ điểm con trỏ của bạn, sẽ được vẽ:
<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>
Tôi chỉ thử đoạn trích này trong Google Chrome.
Ví dụ: khi con trỏ ở trên màu đỏ, đường cong có độ dốc 0 °, nhưng khi nó ở trên màu vàng, nó có độ dốc 60 °. Đường cong tiếp tục cho độ dài quy định, liên tục thay đổi độ dốc của nó để phù hợp với màu sắc.
Tải hình ảnh này lên và khi bạn xoay con trỏ qua nó, đường chỉ quanh con trỏ sẽ thực hiện lần lượt hoàn toàn ngược chiều kim đồng hồ:
Cái này và cái này là những hình ảnh gọn gàng khác để thử. (Bạn sẽ cần lưu chúng và sau đó tải chúng bằng đoạn mã. Chúng không thể được liên kết trực tiếp do các ràng buộc về nguồn gốc chéo.)
Đây là phiên bản rút gọn của đoạn trích:
Thử thách
Viết chương trình thực hiện những gì đoạn trích đang làm, chỉ là không tương tác. Lấy một hình ảnh và tọa độ (x, y) trong giới hạn của hình ảnh và độ dài đường cong tối đa. Xuất ra cùng một hình ảnh với đường cong màu đen được thêm vào theo các góc màu bắt đầu từ (x, y) và kết thúc khi nó đạt đến độ dài tối đa hoặc chạm vào một ranh giới hình ảnh.
Cụ thể, bắt đầu đường cong tại (x, y) và đo góc màu ở đó. Đi một đơn vị (chiều rộng một pixel) theo hướng đó, lưu ý rằng vị trí mới của bạn rất có thể không phải là tọa độ nguyên . Đánh dấu một điểm khác trên đường cong và di chuyển lại, sử dụng màu sắc từ pixel gần nhất (sử dụng cái gì đó như floor
hoặc round
, tôi sẽ không kiểm tra chính xác điều này). Tiếp tục như vậy cho đến khi đường cong đi ra khỏi giới hạn hoặc nó vượt quá độ dài tối đa. Để kết thúc, vẽ tất cả các điểm đường cong dưới dạng các pixel đen đơn (một lần nữa, sử dụng các pixel gần nhất) phủ lên hình ảnh và xuất hình ảnh mới này.
"Góc màu" chỉ là màu sắc :
hue = atan2(sqrt(3) * (G - B), 2 * R - G - B)
Lưu ý rằng đối với các giá trị thang độ xám về mặt kỹ thuật không có màu sắc, giá trị này trả về 0, nhưng điều đó tốt.
(Công thức này sử dụng atan2
hầu hết các thư viện toán học tích hợp có. R, G, B là từ 0 đến 1, không phải từ 0 đến 255.)
- Bạn có thể sử dụng bất kỳ định dạng tệp hình ảnh lossless phổ biến cũng như bất kỳ thư viện hình ảnh.
- Lấy đầu vào từ stdin hoặc dòng lệnh hoặc viết hàm với các đối số cho tên tệp hình ảnh, x và y và độ dài tối đa.
- Độ dài tối đa và x và y luôn là các số nguyên không âm. Bạn có thể giả sử x và y nằm trong phạm vi.
- Lưu hình ảnh đầu ra với một tên của sự lựa chọn của bạn hoặc chỉ đơn giản là hiển thị nó.
- Việc triển khai của bạn không nhất thiết phải khớp chính xác với đoạn trích. Một vài pixel ở những nơi hơi khác nhau do phương pháp làm tròn / tính toán hơi khác nhau là tốt. (Trong các trường hợp hỗn loạn, điều này có thể dẫn đến các đường cong cuối cùng khác biệt lớn, nhưng miễn là chúng nhìn chính xác, điều đó ổn.)
Chấm điểm
Đệ trình nhỏ nhất tính bằng byte thắng.