Mathematica, 166137 bayt
l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]
Daha okunabilir versiyon:
l := {i, j}; s = Sign;
f[p_, q_, h_, w_] :=
Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
Abs@Mean[
s@Det@{p - l + #, p - q} & /@
Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]
Bu, adlı bir işlevi tanımlar f
. Girdi ve çıktı özelliklerini oldukça liberal olarak yorumladım. İşlev f
formatta girdi alır f[{x0, y0}, {x1, y1}, height, width]
ve ızgara sol üst köşeden başlayarak 1 dizine eklenir. Çıktılar
çizgi 1
s olarak ve arka plan 0
s olarak görüntülenir (burada için gösterilmiştir f[{2, 6}, {4, 2}, 5, 7]
). Bir Mathematica matrisi dönüm görevi 1
s ve 0
bir dizeye s #
s ve .
ben sadece standart yöntemi kullanmak böylece, daha önce birçok zorluklar içinde golfed olmuştur gösterdi, fakat bunu İlginç bir şey ekler sanmıyorum.
Açıklama:
Genel fikir, çizgi bir pikselden geçerse, pikselin dört köşesinden en az birinin çizginin üstünde ve en az birinin altında olmasıdır. Vektörler ( {x0,y0}
köşeden) ve ( {x0,y0}
- {x1,y1}
) arasındaki açıyı inceleyerek bir köşenin çizginin üstünde mi yoksa altında mı olduğunu kontrol ederiz : bu açı pozitifse, köşe yukarıdadır ve açı negatifse köşe aşağıdadır.
İki vektörleri varsa {a1,b1}
ve {a2,b2}
aralarındaki açı matrisinin belirleyici işareti bularak pozitif veya negatif olması durumunda kontrol edebilmemiz {{a1,b1},{a2,b2}}
. (Bunu yapmak için kullandığım eski yöntem, karmaşık sayıların aritmetiğini kullandı, bu da çok ... karmaşıktı.)
Bunun kodda çalışma şekli şöyledir:
{p-l+#,p-q}&/@Tuples[.5{1,-1},2]
dört vektörleri alır {x0,y0}
ve pikselin, dört köşe ile ( l:={i,j}
daha önce tanımlanan piksel koordinatları), ve aynı zamanda arasında vektör {x0,y0}
ve {x1,y1}
.
s@Det@...
çizgi ile dört köşe arasındaki açıların işaretlerini bulur (kullanarak s=Sign
). Bunlar -1, 0 veya 1'e eşit olacaktır.
Abs@Mean[...]<.6
bazı açıların pozitif, bazıları negatif olduğunu kontrol eder. Bu özelliğe sahip işaretlerin 4 tuplesinin hepsi -0.5 ile 0.5 (dahil) arasında araçlara sahiptir, bu nedenle <
yerine bir bayt kaydetmek için 0.6 ile karşılaştırırız <=
.
Hala bir sorun var: Bu kod, hattın her iki yönde de sonsuza kadar uzandığını varsayar. Bu nedenle , çizgiyi, çizginin uç noktaları ile tanımlanan dikdörtgenin içinde ve dışında 1-Max[s[p-l]s[q-l],0]
bulunan çarpma (deneme yanılma yoluyla bulunur) 1
ile kırpmamız 0
gerekir.
Kodun geri kalanı bu piksellerin bir ızgarasını yapar.
(Bonus olarak, burada 181 bayt için tamamen farklı bir yöntemle daha önceki bir girişim :)
Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&