Düz Çizgi Çiz


15

Düz bir çizgi içeren basit bir ASCII sanat resmi çizin. Bu benzeyen bu ve bu ancak farklı özelliklere sahip.

Giriş

Bu giriş biçimini kodunuza uyacak şekilde değiştirebilirsiniz.

  • tamsayı width
  • tamsayı height
  • tamsayı x0
  • tamsayı y0
  • tamsayı x1
  • tamsayı y1

Çıktı

Piksel bir çizgi içeren belirli genişlik ve yükseklik dolgulu ASCII art görüntü (x0, y0)pikseline (x1, y1).

Herhangi bir standart metin çıktısı biçimi kabul edilebilir, ancak yerleşik çizgi çizim işlevlerini kullanmayın.

ayrıntılar

#Arka plan farklı bir karakterle (örneğin .) doldurulurken, çizgi tek bir yazdırılabilir karakter (örneğin ) kullanılarak çizilmelidir . Görüntü boyutunun doğru olması için gerekli arka karakterleri yazdırmalısınız.

Piksel koordinatları 0 dizinli veya 1 dizinli olabilir ve görüntünün herhangi bir köşesinde başlayabilir. Çizgi, başlangıç ​​ve bitiş piksellerinin merkezlerini bağlayan 0 genişlikli bir alt piksel çizgisi düşünülerek çizilmelidir. Çizginin girdiği her piksel doldurulmalıdır.

Kazanan

Her zamanki kod golf kuralları. En kısa kod kazanır.

Örnekler

IN: width, height, x0, y0, x1, y1

IN: 7, 6, 0, 0, 6, 5
OUT:
.....##
....##.
...##..
..##...
.##....
##.....

IN: 3, 3, 1, 1, 1, 1
OUT:
...
.#.
...

IN: 3, 3, 0, 2, 2, 0
OUT:
#..
.#.
..#

IN: 6, 3, 0, 0, 5, 2
OUT:
....##
.####.
##....

IN: 4, 4, -1, -1, 0, 3
OUT:
#...
#...
#...
....

4
"PPCG'ye Hoş Geldiniz" derdim ama burada neredeyse benim kadar uzun süre kayıt oldunuz. :-) Güzel ilk meydan okuma!
AdmBorkBork

Boşluk yerine gerçek noktalar çıkarabilir miyiz? ya da boşluklar dışında herhangi bir karakter? (sondaki <character> s dahil hala
varsayalım

Elbette! Düzenlemeleri yapacağım
Curtis Bechtel

1
@AlbertRenshaw Aslında, Wikipedia'da Curve'a baktığımda şunu belirtiyor: " Matematikte, bir eğri ( eski metinlerde eğri çizgi olarak da adlandırılır ), genel olarak, bir çizgiye benzer, ancak düz olması gerekmeyen bir nesnedir . "; )
Kevin Cruijssen

1
@KevinCruijssen Bir çizginin düz olması gerektiğini ima etmek , değil mi? ;)
Albert Renshaw

Yanıtlar:


2

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 fformatta girdi alır f[{x0, y0}, {x1, y1}, height, width]ve ızgara sol üst köşeden başlayarak 1 dizine eklenir. Çıktılar

Örnek çıktı

çizgi 1s olarak ve arka plan 0s 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 1s ve 0bir 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[...]<.6bazı 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) 1ile kırpmamız 0gerekir.

Çizgiyi dikdörtgenle kırpma

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

1
Şimdi bitti, öğle yemeği zamanı! (18: 30'da…)
Bir ağaç değil

1

CJam, 122 bayt

{),V>{[I\]E.*A.+}/}:F;l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:D[0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fID~\:I;F]{_Wf>\S.<+:*},{~_3$=@0tt}/N*

Çevrimiçi deneyin

Bu temelde daha önce başka zorluklar için yazdığım iki cevabı birleştirir (esas olarak 2. bir fonksiyonun hesaplamaları l).
(0, 0) doğal olarak ifadedeki örnekler gibi sol alt köşedir, sol üst köşedir.

Genel bakış:

{),V>{[I\]E.*A.+}/}:F;belirli bir x koordinatı için tüm piksellerin (koordinat çiftleri) oluşturulmasına yardımcı olan F işlevini tanımlar
l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:Dve girdiyi okur ve işler
0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fIve sonuncusu hariç tüm x koordinatları üzerinde yinelenen bir nokta matrisi oluşturur ve karşılık gelen tüm pikselleri üretir
D~\:I;F. son x koordinatı
{_Wf>\S.<+:*},yalnızca görüntünün içinde görünmesi gereken pikselleri tutar
{~_3$=@0tt}/ve her piksel
N*ekran için yeni satır karakterleriyle matrise katılır.

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.