Bir mürekkep noktasında ne görüyorsun? Rorschach üretimi '[kapalı]


12

Bu yüzden aşağıdaki görüntü gibi Rorschach görüntüleri oluşturmaya çalışmanızı istiyorum:

Sahte Rorschach Resmi

İşte olan bağlantısını daha da ilham.

Bu bir popülerlik yarışmasıdır, ancak renklerin siyah ve beyazdan ve dokulardan daha popüler olacağını söyleyeceğim.

Rorschach görüntüleri kağıda mürekkeple katlanarak oluşturulur, böylece bir kriter simetri olur.

ASCII sanatı geçerlidir, ancak yukarıdaki kriterlere tabi olacaktır.


1
Peki hangisi, kod golfü veya popülerlik yarışması?
David Wilkins

2
<quote Richard Feynman> Anlamsız bir mürekkep lekesi var ve diğerleri size gördüğünüzü düşündüğünüzü soruyor, ama onlara söylediğinizde sizinle tartışmaya başlıyorlar! </quote>
user80551


1
Bunun için bir stereogram görmek isterim .
Justin

1
Bana son zamanlarda gördüğüm bir resim hatırlattı
VX

Yanıtlar:


11

Fortran 95

Bu kod biraz büyük, ama güzel bir (ish) ASCii sonucu üretir:

program Rorschach
implicit none

integer :: i, j, k, l, N, seed
integer, dimension (24) :: i_zero, j_zero
real :: aux
integer, dimension (17,12) :: matrix_I = 0
character, dimension (17,12) :: matrix_C

! random seed according to system clock
call SYSTEM_CLOCK(count=k)
call RANDOM_SEED(size=N)
allocate(seed(N))
seed=k+37*(/ (i - 1, i = 1, n) /)
call RANDOM_SEED(PUT=seed)

! generating 7 random points
do i=1,7
  call RANDOM_NUMBER(aux)
  i_zero(i) = 15 * aux + 2 ! range = 2-16
  call RANDOM_NUMBER(aux)
  j_zero(i) = 11 * aux + 2 ! range = 2-12
enddo

! generating 7 large spots of ink
do i=1,7
  matrix_I(i_zero(i),j_zero(i)) = 3 ! central points have ink value 3
  do k=-1,1
    do l=-1,1
      if (.NOT.((k==0) .AND. (l==0))) then ! immediate neighbours...
        if ( (((i_zero(i)+k)<=17).OR.((i_zero(i)+k)>0)) .AND. (((j_zero(i)+l)<=12).OR.((j_zero(i)+l)>0)) ) then ! ... that are inside the designed area ...
            if (matrix_I(i_zero(i)+k,j_zero(i)+l) < 2) matrix_I(i_zero(i)+k,j_zero(i)+l) = 2 ! ... and that do not have ink value larger than 2 will be attributed as 2
        endif
      endif
    enddo
  enddo
enddo

! generating N little sparkles of ink
call RANDOM_NUMBER(aux)
N = int(11 * aux) + 20 ! N = 20-30

i = 0
do while (i <= N)
  call RANDOM_NUMBER(aux)
  i_zero(i) = 16 * aux + 1 ! range = 1-17
  call RANDOM_NUMBER(aux)
  j_zero(i) = 11 * aux + 1 ! range = 1-12
  if (matrix_I(i_zero(i),j_zero(i)) < 1) then ! if the selected point already has more ink than 1, then cycle the loop
    matrix_I(i_zero(i),j_zero(i)) = 1
    else
      cycle
  endif
  i = i + 1
enddo

! converting matrix of integers into matrix of characters
do i=1,17
  do j=1,12
    select case(matrix_I(i,j))
      case(0)
      matrix_C(i,j) = " "
      case(1)
      matrix_C(i,j) = "."
      case(2)
      matrix_C(i,j) = "+"
      case(3)
      matrix_C(i,j) = "@"      
    end select
  enddo
enddo

! printing it on the screen + its reflection
do i=1,17
  do j=1,12
    write(*,"(A1)",advance="NO") matrix_C(i,j)
  enddo
  do j=12,2,-1
    write(*,"(A1)",advance="NO") matrix_C(i,j)
  enddo
  write(*,"(A1)") matrix_C(i,1)
enddo

end program Rorschach

Kod tamamen yorumlanır, ancak temel fikir, o noktadaki mürekkep miktarını temsil eden 0 ile 3 arasında değerlere sahip bir matris oluşturmasıdır. 7 büyük mürekkep lekesi (2 değeriyle çevrili 3 değeri olan bir nokta) ve çok sayıda küçük "parıldıyor" (değer 1) vardır. Bu matris daha sonra aşağıdaki dönüşüm kullanılarak bir karakter matrisine dönüştürülür:

0 =  
1 = .
2 = +
3 = @

İşte bir sonuç:

 +++      .  .      +++ 
 +@++++   .  .   ++++@+ 
 ++++@+.        .+@++++ 
   .+++   ++++   +++.   
          +@@+          
. .   . +++@@+++ .   . .
.       +@++++@+       .
     ++++++  ++++++     
     +@+        +@+     
.    ++++      ++++    .
   .  +@+      +@+  .   
  .  .+++.    .+++.  .  
 . .   .        .   . . 
    .    .    .    .    
   .   ..      ..   .   
 .                    . 

1
FORTRAN! Kişisel bir favori.
Pureferret

2
Teşekkür ederim! Genellikle Fortran + acemi kodu burada bir şans değil, ama oğlum, bu siteye katılmaya başladığımdan beri programlama hakkında çok şey öğreniyorum!
gilbertohasnofb

1
! FORTRAN gözlerimdeki listelerin kralı ve bu sadece listeler, bu yüzden nasıl yanlış gidebileceğinizi göremiyorum.
Pureferret

1
Fortran kıskançlık için çok sıcak değil, ancak performans noktasında.
Jonathan Van Matre

12

piton

En iyi veya en pürüzsüz değil, ama burada bir python çözümü:

from PIL import Image
import random
import sys

imgsize = (int(sys.argv[1]), int(sys.argv[2]))
color = (0, 0, 0)
img = Image.new("RGB", imgsize, "white")

for j in range(0,int(sys.argv[3])):
    start = (random.randrange(0, imgsize[0]/2), random.randrange(0, imgsize[1]))
    point = start
    img.putpixel(point, color)

    blotsize = random.randrange(0, int(sys.argv[4]))
    for i in range(blotsize):
        directions = [(point[0], point[1]+1), (point[0], point[1]-1), (point[0]+1, point[1]), (point[0]-1, point[1])]
        toremove = []
        for direction in directions:
            if direction[0]>=(imgsize[0]/2) or direction[1]>=imgsize[1] or direction[0]<0 or direction[1]<0:
                toremove.append(direction)
        for d in toremove:
            directions.remove(d)
        point = random.choice(directions)
        img.putpixel(point, color)

cropped = img.crop((0, 0, imgsize[0]/2, imgsize[1]))
img = img.transpose(Image.FLIP_LEFT_RIGHT)
img.paste(cropped, (0, 0, imgsize[0]/2, imgsize[1]))

img.save("blot.png")

Sadece bir leke için "gezici bir yol" yapar ve bunlardan birkaçını yapar.

Örnek bir kullanım:

py inkblot.py width height blots blotsize
py inkblot.py 512 512 20 10000

Ve bazı örnek resimler: blot1 blot2


PPCG'ye Hoşgeldiniz! Posterleri, kullandıkları dili belirten önemli bir başlık yapmaya teşvik ediyoruz. Bunu yapmak için editördeki Markdown sözdizimini kullanabilirsiniz, örn.## Python
Jonathan Van Matre

5
Belki tek piksel yerine (rastgele boyutlu) diskler kullanabilirsiniz.
Howard

1
Hoşgeldiniz! Burada çok güzel sonuçlarınız var.
gilbertohasnofb
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.