Góc đó là gì?


12

Mục tiêu của thử thách này là xác định góc của một đường trong ảnh.

Quy tắc về hình ảnh:

  • Nền hình ảnh sẽ có màu trắng ( #FFFFFF)
  • Nét của dòng sẽ có màu đen ( #000000)
  • Dòng này sẽ KHÔNG được khử răng cưa
  • Hình ảnh sẽ là 100x100 pixel
  • Dòng sẽ bắt đầu ở trung tâm của hình ảnh
  • Dòng sẽ bắt đầu chỉ xuống (6-OClock)
  • Dòng này sẽ dài 50 pixel
  • Góc của đường sẽ được đo đi ngược chiều kim đồng hồ từ vị trí bắt đầu
  • Bộ giải mã hình ảnh sẽ là .jpghoặc.png

Định dạng đầu vào sẽ là một tên tệp được truyền bởi dòng lệnh arg, đầu vào tập lệnh hoặc hàm arg. Định dạng đầu ra rất đơn giản - chỉ cần xuất số độ (ví dụ 90).

Câu trả lời có thể là 1 độ của biện pháp đã nêu. Dưới đây là một vài hình ảnh ví dụ:

1

Một hình ảnh tham khảo ở 45 độ với nền màu xám

1

0 độ

2

45 độ

3

50 độ

4

130 độ

6

230 độ

7

324 độ

Đây là mã được sử dụng để tạo hình ảnh (mã này được xử lý bằng Xử lý ):

int deg = 45;

int centX = width/2, centY = height/2;

background(255);
noSmooth();
line(centX,
     centY,
     centX + sin(radians(deg))*50,
     centY + cos(radians(deg))*50);

saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'

1
Tôi đã nhận được một downvote? Nếu vậy cử tri có thể giải thích tại sao?
J Atkin

Chúng ta có thể chỉ hiển thị nó, không lưu nó vào một tập tin?
ev3commander

Chắc chắn, đó là cách tất cả các câu trả lời khác làm điều đó. Chỉ cần in ra bàn điều khiển câu trả lời mà chương trình của bạn tạo ra.
J Atkin

1
@JAtkin Tôi sẽ không lo lắng về việc tải xuống trên một bài viết thường được nâng cấp. c: Tất cả chúng ta đều có được điều đó.
Addison Crump

Ồ, tôi hiểu rồi. Tôi tự hỏi tại sao tôi lại có một cái ...
J Atkin

Câu trả lời:


7

Pyth - 28 26 byte

Sử dụng cùng một loại chiến lược vũ phu như câu trả lời của js.

f!@F+]'zm+50s*48.t.tT7d_U2

Lấy đầu vào là tên tệp từ stdin.

f                     Filters from 1 till predicate is matched
 !                    Boolean not so that only pixel with zero value matched
  @F+]                Folds by indexing to get pixel value  
   'z                 Reads image filename input
   m         _U2      Maps over both trig ratios
    +50               Adds 50 to pixel value
     *48              Multiplies pixel value by 48
      .t    d         Takes trig ratio with appropriate option
        .t 7          Degrees to radians
          T           Filter var

Wow, điều này thật tuyệt nhưng tôi không nói chuyện. Bạn có phiền thêm một lời giải thích?
J Atkin

1
Tôi ước rằng JavaScript sẽ có cùng số byte trên mặt khác.
insertusernamehere

@insertusernamehere Tôi muốn Groovy hoặc scala cũng có thể chơi loại hình này.
J Atkin

@JAtkin giải thích thêm. Hãy nhắn tin cho tôi khi trò chuyện nếu bạn có bất kỳ câu hỏi nào.
Maltysen

9

JavaScript (ES6), 225 227 244 byte

Hãy để bóng lăn:

f=s=>{(i=new Image).src=s;c=document.createElement`canvas`.getContext`2d`;c.drawImage(i,0,0,100,100);for(a=360;a--,r=a/180*(m=Math).PI;)if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){alert((450-a)%360);break}}

Chỉ cần chuyển URL của hình ảnh cho chức năng:

f('90deg.png');

Cảnh báo độ trong phạm vi ± 1. Đã qua tất cả các trường hợp thử nghiệm.

Ung dung

f=s=>{
    // create new image and set source
    (i=new Image).src=s;
    // create canvas and get context
    c=document.createElement`canvas`.getContext`2d`;
    // set width/height to 100px and draw image on canvas
    c.drawImage(i,0,0,100,100);
    // check whether for any degree on the theoretical circle a black pixel is found
    for(a=360;a--,r=a/180*(m=Math).PI;)
        if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){
            // wait, it should be ccw and the board is rotated 90 degrees
            alert((450-a)%360);
            break
        }
}

Chỉnh sửa

  • Đã lưu 17 byte - hình tôi không cần đặt chiều rộng và chiều cao của phần tử canvas.
  • Đã lưu 2 byte bằng cách phủ định điều kiện.

Tôi nghĩ rằng điều này sẽ làm việc (chưa thử nghiệm nó). 206 byte:s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
user81655

1
Mã này hoạt động vì bạn may mắn. Canvas sẽ bị nhiễm bẩn gần như mọi lúc. Đặc biệt với file://. Bạn cần thiết lập crossOrigintài sản. Ngoài ra, nó sẽ không hoạt động nếu tải hình ảnh mất 0,00001 giây so với việc tạo khung vẽ. Ngoài ra, bạn không cần f=, cắt 2 byte. Nhưng đó là một giải pháp tốt đẹp thực sự !!! Upvote của tôi cho nó.
Ismael Miguel

@IsmaelMiguel Cảm ơn phản hồi chi tiết của bạn. Bạn nói đúng về bức tranh. Lúc đầu, tôi đã cố gắng xoay và phản chiếu hình ảnh, để góc không cần phải được chuyển đổi. Bạn có thể nói lời tạm biệt với điều đó! Bị mờ, không thể tìm thấy pixel phù hợp. Tôi đã bỏ qua onloadphần này khi tôi bị hạ gục trong một thử thách khác vì điều đó. Vì vậy, tôi nghĩ rằng nó ổn khi cho rằng nó tải đủ nhanh. Về chức năng ẩn danh tôi không chắc làm thế nào để đếm nó. Nếu tôi cắt bỏ f=và tôi muốn gọi nó, tôi phải bọc nó ()như thế nào (s=>{})('arg');. Tôi có thể bỏ qua điều này trong số byte?
insertusernamehere

@insertusernamehere Vâng, bạn có thể bỏ qua số byte. Nhưng bạn phải xác định rằng đó là một chức năng ẩn danh
Ismael Miguel

5

Matlab, 118 104 byte

Tôi tạo ra một ma trận có cùng kích thước với hình ảnh với các số phức (0 ở giữa) và trích ra từ ma trận đó các giá trị nằm trên dòng. Đối số của giá trị trung bình sau đó được hiển thị.

Cảm ơn @ThomasKwa đã đề xuất cải thiện độ chính xác cũng dẫn đến mã ngắn hơn !!!

I=imread(input('','s'));
[y,x]=ndgrid(-50:49);
c=y+i*x;
disp(mod(angle(mean(c(~I(:,:,1))))*180/pi+360,360))

1
Nó sẽ ngắn hơn để tìm đối số của giá trị trung bình của tất cả các điểm trên dòng?
lirtosiast

Wow, điều này ngắn hơn nhiều so với tôi mong đợi câu trả lời, công việc tốt!
J Atkin

@ThomasKwa Hoàn toàn đúng, nhưng sau đó sẽ không chính xác, vì các pixel gần trung tâm là hoàn toàn không chính xác. Nếu bạn muốn thử, bạn cũng có thể chạy mã này trong Octave, tôi nghĩ vậy!
flawr

Đối số của giá trị trung bình (sẽ đưa ra đối số của trung tâm của dòng với độ chính xác khá tốt), không phải là trung bình của các đối số. Tôi không biết nếu độ chính xác sẽ được chấp nhận.
lirtosiast

1
@ThomasKwa Ý tưởng tuyệt vời, cảm ơn! Độ chính xác thậm chí còn tốt hơn bây giờ và mã ngắn hơn vài byte =)
flawr

5

Matlab, 86 77 byte

Đây là một cách khác sử dụng Matlab:

[I,J]=find(~im2bw(imread(input('','s'))));mode(mod(round(atan2d(J-51,I-51)),360))

Điều này đọc tệp (bị đánh cắp từ flawr ) và tìm thấy các chỉ số của các pixel đen. Sau đó, nó tìm ra vectơ chỉ từ tâm hình ảnh đến từng pixel đen và sử dụng atan2dđể tìm góc, làm tròn để lấy góc nguyên và thực hiện mod(...,360)để có kết quả trong phạm vi phù hợp. Để có được góc chính xác (có một chút lỗi cho các pixel gần trung tâm), hãy lấy góc được tính toán phổ biến nhất.

Cảm ơn slvrbld cho im2bwlời đề nghị!


1
Mã của bạn có thể được giảm xuống 77 byte bằng cách thay thế phần trước chế độ (...) bằng [I, J] = find (~ im2bw (imread (input (''))));
slvrbld

Đẹp quá Cảm ơn tôi chắc chắn có một cách để làm điều đó dễ dàng hơn nhưng không thể nhớ nó.
David

3

Labview, 10098 byte

Hãy đặt một mã labview khác ra khỏi đó.

Vì không có cách chính thức để đếm byte trong labview, tôi sử dụng kích thước của tệp khi được lưu. Hoặc đếm từng dây và chức năng là 1 và trường hợp là 2, nó sẽ ra 71.

1

Tải hình ảnh, làm phẳng thành 1D, quét 0 từ cả hai phía và lấy hình đầu tiên, quay lại điểm và sử dụng hình học để lấy góc.


1
Đẹp, điều này thật thú vị. Bạn có thể muốn hỏi về meta làm thế nào để ghi điểm các chương trình labview.
J Atkin

đã có một chủ đề về cách ghi điểm nhưng thật đáng tiếc vẫn chưa có câu trả lời
Eumel

Ồ, tôi hiểu rồi. Tôi vừa chỉnh sửa bài viết của bạn để làm cho số byte dễ hiểu hơn đối với chúng tôi ở Hoa Kỳ của A.
J Atkin

@JAtkin Là một người châu Âu, nó khiến tôi phải vò đầu băn khoăn, tự hỏi làm thế nào anh ta có được các phân số byte đó. Sẽ không sử dụng một không gian xin vui lòng tất cả các bên?
Aaron

Hehehe, tôi quên các bạn có , vị trí thập phân.
J Atkin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.