그 각도는 무엇입니까?


12

이 문제의 목표는 이미지에서 선의 각도를 결정하는 것입니다.

이미지의 규칙 :

  • 이미지 배경이 흰색이됩니다 ( #FFFFFF)
  • 선의 선이 검은 색이됩니다 ( #000000)
  • 이 줄은 앤티 앨리어싱되지 않습니다
  • 이미지는 100x100 픽셀입니다.
  • 이미지의 중앙에서 선이 시작됩니다
  • 선이 아래쪽을 가리 키기 시작합니다 (6-OClock)
  • 선의 길이는 50 픽셀입니다.
  • 선의 각도는 시작 위치에서 시계 반대 방향으로 측정됩니다
  • 이미지 코덱은 .jpg또는.png

입력 형식은 명령 행 arg, 스크립트 입력 또는 함수 arg에 의해 전달되는 파일 이름입니다. 출력 형식은 간단 90합니다. 도 (예 :)를 출력하면 됩니다.

답은 명시된 측정 값의 ± 1 도입니다. 다음은 몇 가지 예제 이미지입니다.

1

회색 배경의 45도 기준 이미지

1

0도

2

45도

삼

50도

4

130도

6

230도

7

324도

이미지를 생성하는 데 사용되는 코드는 다음과 같습니다 ( 처리 로 코딩 됨 ).

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
공감대를 받았습니까? 그렇다면 유권자가 비행기를 타는 이유는 무엇입니까?
J Atkin

파일로 저장하지 않고 표시 만 할 수 있습니까?
ev3commander

물론, 다른 모든 답변이 그렇게합니다. 프로그램이 생성하는 답변을 콘솔에 인쇄하십시오.
J Atkin

1
@JAtkin 나는 일반적으로 upvoted 게시물에 downvotes에 대해 걱정하지 않을 것입니다. c : 우리 모두는 그것을 얻습니다.
Addison Crump

아, 알겠습니다 나는 왜 하나를 얻었는지 궁금합니다.
J Atkin

답변:


7

Pyth- 28 26 바이트

js 답변과 같은 종류의 무차별 대입 전략을 사용합니다.

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

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

와우, 이것은 시원하지만 나는 pyth를 말하지 않습니다. 설명을 추가 하시겠습니까?
J Atkin

1
반면에 JavaScript가 동일한 바이트 수를 갖기를 바랍니다.
insertusername 여기

@insertusername 여기서 그루비 나 스칼라가 이런 종류의 골프를 할 수 있기를 바랍니다.
J Atkin

@JAtkin 설명이 추가되었습니다. 궁금한 점이 있으면 채팅으로 메시지를 보내 주시기 바랍니다.
Maltysen

9

자바 스크립트 (ES6) 225 227 244 바이트

볼을 굴려 보자.

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}}

이미지의 URL을 함수에 전달하면됩니다.

f('90deg.png');

± 1 범위 내의도를 경고합니다. 모든 테스트 사례를 통과했습니다.

언 골프

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
        }
}

편집

  • 17 바이트 절약 – 캔버스 요소의 너비와 높이를 설정할 필요가 없습니다.
  • 조건을 무시하여 2 바이트절약했습니다 .

나는 이것이 효과가 있다고 생각한다 (테스트하지 않았다). 206 바이트 :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
이 코드는 운이 좋기 때문에 작동합니다. 캔버스는 거의 항상 오염됩니다. 와 함께 특별히 file://. crossOrigin속성 을 설정해야 합니다. 또한 이미지로드가 캔버스 작성보다 0.00001 초 더 걸리면 작동하지 않습니다. 또한 f=2 바이트를 잘라서 필요하지 않습니다 . 그러나 실제로 좋은 해결책입니다 !!! 그것에 대한 나의 공감.
Ismael Miguel

@IsmaelMiguel 자세한 피드백에 감사드립니다. 당신은 캔버스에 대해 옳습니다. 처음에는 각도를 변환 할 필요가 없도록 이미지를 회전하고 미러링하려고했습니다. 당신은 작별 인사를 할 수 있습니다! 흐릿 해져 올바른 픽셀을 찾을 수 없습니다. onload그로 인해 또 다른 도전에서 언더컷이 된 부분을 건너 뛰었습니다 . 그래서 나는 그것이 충분히 빨리로드된다고 가정하는 것이 좋다고 생각했습니다. 익명 함수와 관련하여 계산 방법을 잘 모르겠습니다. 잘라 내고 f=호출하려면 다음과 ()같이 포장해야합니다 (s=>{})('arg');. 바이트 수로 이것을 무시할 수 있습니까?
insertusername 여기

@insertusername 여기, 바이트 수는 무시해도됩니다. 그러나 익명 함수임을 지정해야합니다
Ismael Miguel

5

Matlab, 118104 바이트

복잡한 숫자 (중앙에서 0)가있는 이미지와 동일한 크기의 행렬을 생성하고 해당 행렬에서 줄에있는 값을 추출합니다. 그런 다음 그 평균의 인수가 표시됩니다.

정확도가 향상되어 코드가 짧아지는 @ThomasKwa에게 감사드립니다 !!!

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
선에있는 모든 점의 평균에 대한 인수를 찾는 것이 더 짧습니까?
lirtosiast

와우, 이것은 내가 예상했던 것보다 훨씬 짧습니다.
J Atkin

@ThomasKwa 절대적으로, 그러나 중심에 가까운 픽셀이 절대적으로 부정확하기 때문에 정확하지 않을 것입니다. 시도하고 싶다면이 코드를 Octave에서도 실행할 수 있습니다.
flawr

인수의 평균이 아닌 평균의 인수 (선 중심의 인수에 대해 정확한 정확도를 제공해야 함). 정확성이 수용 가능한지 모르겠습니다.
lirtosiast

1
@ThomasKwa 좋은 생각입니다, 감사합니다! 정확도는 지금 더 나아지고 코드는 몇 바이트 더 짧습니다 =)
flawr

5

Matlab, 86 77 바이트

Matlab을 사용하는 또 다른 방법은 다음과 같습니다.

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

파일을 읽고 ( flawr 에서 도난 ) 검은 색 픽셀의 인덱스를 찾습니다. 그런 다음 이미지의 중심에서 각 검은 픽셀을 가리키는 벡터를 계산 atan2d하고 각도를 찾고, 정수 각도를 얻기 위해 반올림하고 mod(...,360), 올바른 범위에서 결과를 얻는 데 사용합니다. 정확한 각도를 얻으려면 (가운데 가까이 픽셀에 약간의 오차가 있음) 가장 일반적으로 계산되는 각도를 사용하십시오.

제안에 대한 slvrbld 감사합니다 im2bw!


1
mode (...) 이전 부분을 [I, J] = find (~ im2bw (imread (in) ( '')))); 로 바꾸면 코드를 77 바이트 로 줄일 수 있습니다 .
slvrbld

좋은 것! 고마워 나는 그것을 더 쉽게 할 수있는 방법이 있었지만 그것을 기억할 수 없다고 확신했다.
David

3

랩뷰, 10098 바이트

또 다른 labview 코드를 작성해 봅시다.

labview에는 바이트를 계산하는 공식적인 방법이 없으므로 저장시 파일 크기를 사용합니다. 또는 모든 와이어를 계산하고 1로 기능하고 케이스를 2로 계산하면 71로 나옵니다.

1

이미지를로드하고, 1D로 평평하게하고, 양쪽에서 0을 스캔하고, 첫 번째를 계산하고 다시 계산하여 형상을 사용하여 각도를 얻습니다.


1
좋아, 재미있다. 랩뷰 프로그램의 점수를 매기는 방법에 대해 메타에 문의 할 수 있습니다.
J Atkin

이미 점수를 매기는 방법에는 스레드가 있지만 불행히도 아직 답변이 없습니다
Eumel

아, 알겠습니다 A의 미국에서 바이트 수를 더 이해할 수 있도록 게시물을 편집했습니다.
J Atkin

@JAtkin 유럽의 동료로서, 저의 머리를 긁어 내면서 어떻게 그 바이트를 얻었는지 궁금해했습니다. 공간을 사용하지 않겠습니까?
Aaron

Hehehe, 나는 너희들이 ,소수점 이하 자리에 있다는 것을 잊었다 .
J Atkin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.