Bu açı nedir?


12

Bu zorluğun amacı bir görüntüdeki bir çizginin açısını belirlemektir.

Resimdeki kurallar:

  • Görüntü arka planı beyaz olacaktır ( #FFFFFF)
  • Çizginin konturu siyah olacaktır ( #000000)
  • Çizgi kenar yumuşatılmayacak
  • Görüntü 100x100 piksel olacaktır
  • Çizgi görüntünün ortasında başlayacaktır
  • Çizgi aşağıya doğru başlayacaktır (6-OClock)
  • Çizgi 50 piksel uzunluğunda olacak
  • Çizginin açısı başlangıç ​​konumundan saat yönünün tersine ölçülecektir
  • Görüntü codec bileşeni .jpgya.png

Girdi biçimi, komut satırı arg, komut dosyası girişi veya işlev arg tarafından iletilen bir dosya adı olacaktır. Çıktı formatı basittir - sadece derece sayısını (örn. 90) Çıktılayın .

Cevaplar belirtilen ölçünün ± 1 derece olabilir. İşte birkaç örnek resim:

1

Gri arka planı olan 45 derecede referans görüntü

1

0 derece

2

45 derece

3

50 derece

4

130 derece

6

230 derece

7

324 derece

Görüntüleri oluşturmak için kullanılan kod şudur ( İşleme ile kodlanmıştır ):

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
Bir intikam aldım mı? Öyleyse seçmen neden açıklayabilir?
J Atkin

Sadece bir dosyaya kaydetmeyebilir, görüntüleyebilir miyiz?
ev3commander

Elbette, diğer tüm cevaplar böyle yapar. Programınızın verdiği yanıtı konsolda yazdırmanız yeterlidir.
J Atkin

1
@JAtkin Genel olarak oylanan bir yazıdaki downvotes hakkında endişelenmezdim. c: Hepimiz anlıyoruz.
Addison Crump

Ah anlıyorum. Acaba neden bir tane aldım ...
J Atkin

Yanıtlar:


7

Pyth - 28 26 bayt

Js cevabı ile aynı tür kaba kuvvet stratejisini kullanır.

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

Stdin'den dosya adı olarak girdi alır.

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

Vay canına, bu harika ama ben pyth konuşmuyorum. Bir açıklama eklemeyi düşünür müsünüz?
J Atkin

1
Öte yandan JavaScript aynı bayt sayısına sahip olsaydı.
insertusernameburada

Harika ya da scala bu tür bir golf de yapabilseydim.
J Atkin

@JAtkin açıklaması eklendi. Herhangi bir sorunuz varsa sohbet sırasında bana mesaj atmaktan çekinmeyin.
Maltysen

9

JavaScript (ES6), 225 227 244 bayt

Haydi başlayalım:

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

Görüntünün URL'sini işleve iletmeniz yeterlidir:

f('90deg.png');

± 1 aralığında dereceleri uyarır. Tüm test senaryolarını geçti.

Ungolfed

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

Düzenlemeler

  • 17 bayt kaydedildi - tuval öğesinin genişliğini ve yüksekliğini ayarlamam gerekmiyor.
  • Koşulu ortadan kaldırarak 2 bayt tasarruf etti.

Bunun işe yarayacağını düşünüyorum (test etmedim). 206 bayt: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
Bu kod, şanslı olduğunuz için çalışır. Tuval neredeyse her seferinde lekelenecektir. Özellikle ile file://. crossOriginÖzelliği ayarlamanız gerekir . Ayrıca, resim yükleme tuvali oluşturmaktan 0.00001 saniye daha fazla sürerse işe yaramaz. Ayrıca, f=2 bayt kesmenize gerek yoktur. Ama gerçekten güzel bir çözüm !!! Benim oyum.
Ismael Miguel

@IsmaelMiguel Detaylı geri bildiriminiz için teşekkür ederiz. Tuval hakkında haklısın. Başlangıçta görüntüyü döndürmeye ve yansıtmaya çalıştım, böylece açının dönüştürülmesine gerek kalmadı. Buna güle güle diyebilirsiniz! Bulanıklaştı, doğru pikseli bulamadım. Bu yüzden onloadbaşka bir meydan okumada altını keserken parçayı atladım. Bu yüzden yeterince hızlı yüklendiğini varsaymanın iyi olduğunu düşündüm. Anonim işlev ile ilgili olarak nasıl sayılacağından emin değilim. Ben keserse f=ve bunu çağırmak istiyorum ben onu sarmak zorunda ()gibi (s=>{})('arg');. Bayt sayımında bunu göz ardı edebilir miyim?
insertusernameburada

@insertusernamehere Evet, bayt sayısını yoksayabilirsiniz. Ancak bunun anonim bir işlev olduğunu belirtmelisiniz
Ismael Miguel

5

Matlab, 118104 bayt

Karmaşık sayılarla (merkezde 0) görüntü ile aynı boyutta bir matris oluşturuyorum ve bu matriste satırdaki değerleri çıkarıyorum. Daha sonra bunların ortalaması argümanı görüntülenir.

@ThomasKwa'ya, doğrulukta daha kısa kodla sonuçlanan bir iyileştirme önerdiği için teşekkürler !!!

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
Hattaki tüm noktaların ortalamasının argümanını bulmak daha kısa olur mu?
lirtosiast

Vay canına, bu cevapların beklediğimden çok daha kısa, güzel iş!
J Atkin

@ThomasKwa Kesinlikle, ancak merkeze yakın pikseller kesinlikle yanlış olduğu için doğru olmaz. Denemek istiyorsanız, Octave'de de bu kodu çalıştırabilirsiniz, sanırım!
flawr

Ortalamanın argümanı (çizginin merkezinin argümanını oldukça iyi bir doğruluğa vermelidir), argümanların anlamı değil. Doğruluğun kabul edilebilir olup olmadığını bilmiyorum.
lirtosiast

1
@ThomasKwa Harika fikir, teşekkürler! Doğruluk şimdi daha da iyi ve kod birkaç bayt daha kısa =)
flawr

5

Matlab, 86 77 bayt

İşte Matlab'ı kullanmanın başka bir yolu:

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

Bu dosyayı okur ( kusurdan çalınır ) ve siyah piksellerin dizinlerini bulur. Ardından, görüntünün merkezinden her bir siyah piksele işaret eden vektörü çalıştırır atan2dve açıyı bulmak, tamsayı açıları elde etmek için yuvarlamak ve mod(...,360)sonuçları doğru aralıkta almak için kullanır. Doğru açıyı elde etmek için (merkeze yakın pikseller için biraz hata var), en sık hesaplanan açıyı alın.

Öneri için slvrbld teşekkürler im2bw!


1
Modunuzdan ( ...) önceki bölümü [I, J] = find (~ im2bw (imread (input (''))) ile değiştirerek kodunuz 77 bayta indirilebilir .
slvrbld

Güzel! Teşekkürler Bunu daha kolay yapmanın bir yolu olduğundan emindim ama hatırlayamıyordum.
David

3

Labview, 10098 Bayt

Hadi başka bir labview kodu koyalım.

Labview bayt saymak için resmi bir yolu olmadığından ben kaydedildiğinde dosya boyutunu kullanın. Alternatif olarak, her kablo ve 1 olarak sayılır ve durum 2 olarak sayılır, 71'e çıkar.

1

Görüntüyü yükleyin, 1D'ye düzleştirin, her iki taraftan 0 saniye tarayın ve ilk noktadan kalkın ve açı elde etmek için geometriyi kullanın.


1
Güzel, bu ilginç. Meta olarak labview programlarının nasıl puanlanacağını sormak isteyebilirsiniz.
J Atkin

zaten nasıl puan bir iş parçacığı var ama ne yazık ki henüz bir cevap yok
Eumel

Ah anlıyorum. Az önce A'nın ABD'deki bayt sayısını bizim için daha anlaşılır hale getirmek için yazınızı düzenledim
J Atkin

@JAtkin Avrupalı ​​bir adam olarak, kafamı çizmemi sağladı, bu bayt fraksiyonlarını nasıl aldığını merak etti. Bir alan kullanmak istemez misiniz lütfen?
Aaron

Hehehe, ,ondalık basamaklara sahip olduğunuzu unuttum .
J Atkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.