Python 2 + PIL, hata yok, 313 307 bayt
from Image import*
I=open(sys.argv[1])
w,h=I.size;D=I.getdata()
B={i%w+i/w*1j for i in range(w*h)if D[i]!=D[0]}
n=d=1;o=v=q=p=max(B,key=abs)
while p-w:
p+=d*1j;e=2*({p}<B)+({p+d}<B)
if e!=2:e%=2;d*=1j-e*2j;p-=d/1j**e
if abs(p-q)>5:
t=(q-v)*(p-q).conjugate();q=p;w=o
if.98*abs(t)>t.real:n+=1;v=p
print n
Komut satırında bir görüntü dosyası adı alır ve sonucu STDOUT'a yazdırır.
Tüm testler için doğru sonucu ve daire için n = 28 değerini verir.
açıklama
Algoritma, çokgenin çevresi boyunca yürüyerek ve karşılaşılan köşe noktalarının sayısını (yön değişiklikleri olarak algılanır) sayarak çalışır. Köşe noktası oolduğu ve bu nedenle bir kenara bitişik (yani, ön plan pikseli ile arka plan pikseli arasındaki bir sınır) olduğu garanti edilen, başlangıç noktasından en uzak pikselden başlıyoruz . Başlangıçta hepsi eşit olan konumumuzu, pen son tepe noktasını vve en son "kontrol noktasını" takip qediyoruz o. Ayrıca d, mevcut piksele göre kenarın yönünü de izleriz; dbaşlangıçta doğuyu gösterir, bu güvenli bir yön, çünkü doğuda bir kenar olduğunu biliyoruzoya da başka bir deyişle, başlangıç noktasından en uzakta olmazdı. Kenar boyunca, solumuzu gösterecek şekilde , yani saat yönünde hareket dedecek dşekilde hareket ediyoruz. "Kenardan düştüğümüzde", yani pçokgenin dışında veya solumuzdaki pikselin (yani yönünde d) çokgenin içinde olduğu herhangi bir durumda , ayarlamaya pve dbuna uygun olarak devam etmeden önce.
Her zaman arasındaki mesafe pve geçen kapısı olan q, 5'ten büyür, biz arasında bir köşe geçti olup olmadığını belirlemeye çalışır qve p: Biz arasındaki açıyı karşılaştırmak vq(yani gelen vektör viçin q) genel yönü olduğunu, son kontrol noktasına ulaştığımızda yürüdüğümüz çokgenin bir tarafı qpve son kontrol noktası ile mevcut konum arasındaki yer değiştirme. Açı yaklaşık 10 ° 'den büyükse, çokgenin farklı bir kenarı boyunca yürüdüğümüz, tepe noktası sayısını artırdığımız vve mevcut tepe noktasını olarak ayarladığımız sonucuna varıyoruz p. Her kontrol noktasında, bir tepe noktası tespit edip etmememizden bağımsız olarak q, son kontrol noktasınıp. Bu onoktaya, başlangıç noktasına dönene ve bulunan köşe sayısını döndürene kadar devam ediyoruz (başlangıç noktasından beri tepe noktası sayısının başlangıçta 1 olduğunu unutmayın o, kendisi bir tepe noktasıdır .)
Aşağıdaki resimler algılanan köşeleri göstermektedir. Alarak geldiğini hatırlatırız pgerçek tepe muhtemelen bir yerlerde son kontrol noktasında arasındadır, çünkü yeni tepe noktası konumunda olarak, her kontrol noktasında, mevcut konumu, optimum değildir qve pçevre boyunca. Gördüğünüz gibi, ilkinden başka tüm köşeler (genellikle sağ alt köşe) biraz kapalı. Bunu düzeltmek daha fazla bayta mal olabilir, ancak bu olduğu gibi yeterince iyi çalışıyor gibi görünüyor. Bununla birlikte, sadece dört test vakasına uymamak biraz zor.
