Apa yang Anda lihat di inkspot? Generasi Rorschach '[ditutup]

12

Jadi saya ingin Anda membuat gambar Rorschach seperti gambar di bawah ini:

Gambar Rorschach Palsu

Berikut ini tautan ke inspirasi lebih lanjut.

Ini adalah kontes popularitas, tetapi saya akan mengatakan bahwa warna cenderung lebih populer daripada hitam dan putih, serta tekstur.

Gambar Rorschach dibuat dengan melipat kertas dengan tinta sehingga salah satu kriteria adalah simetri.

Seni ASCII valid, tetapi akan tunduk pada kriteria yang sama seperti di atas.

Pureferret
sumber
1
jadi yang mana itu, golf kode, atau kontes popularitas?
David Wilkins
2
<quote Richard Feynman> Ada noda tinta yang tidak berarti, dan yang lain bertanya kepada Anda apa yang Anda pikir Anda lihat, tetapi ketika Anda memberi tahu mereka, mereka mulai berdebat dengan Anda! </quote>
user80551
2
Sudah ada di sini :) mathematica.stackexchange.com/a/4224/193
Dr. belisarius
1
Saya akan senang melihat stereogram untuk ini.
Justin
1
Itu mengingatkan saya pada gambar yang saya lihat baru
VX

Jawaban:

11

Fortran 95

Kode ini agak besar, tetapi menghasilkan hasil ASCii (ish) yang bagus:

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

Kode sepenuhnya dikomentari, tetapi ide dasarnya adalah bahwa ia menghasilkan matriks dengan nilai antara 0 dan 3, mewakili jumlah tinta di tempat itu. Ada 7 bercak besar (bercak dengan nilai 3 dikelilingi oleh nilai 2) dan banyak "kilau" kecil (nilai 1). Matriks ini kemudian dikonversi menjadi matriks karakter, menggunakan konversi berikut:

0 =  
1 = .
2 = +
3 = @

Ini hasilnya:

 +++      .  .      +++ 
 +@++++   .  .   ++++@+ 
 ++++@+.        .+@++++ 
   .+++   ++++   +++.   
          +@@+          
. .   . +++@@+++ .   . .
.       +@++++@+       .
     ++++++  ++++++     
     +@+        +@+     
.    ++++      ++++    .
   .  +@+      +@+  .   
  .  .+++.    .+++.  .  
 . .   .        .   . . 
    .    .    .    .    
   .   ..      ..   .   
 .                    . 
gilbertohasnofb
sumber
1
FORTRAN! Favorit pribadi.
Pureferret
2
Terima kasih! Biasanya kode pemula Fortran + tidak ada kesempatan di sini, tapi nak, sudahkah saya belajar banyak tentang pemrograman sejak saya mulai berpartisipasi di situs ini!
gilbertohasnofb
1
FORTRAN adalah raja daftar di mata saya, dan ini hanya daftar jadi saya tidak melihat bagaimana Anda bisa salah.
Pureferret
1
Fortran tidak begitu panas untuk singkatnya, tetapi kinerjanya tepat.
Jonathan Van Matre
12

Python

Bukan yang terbaik atau yang paling halus, tapi inilah solusi python:

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")

Itu hanya membuat "jalan mengembara" untuk noda, dan membuat beberapa dari mereka.

Contoh penggunaan:

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

Dan beberapa contoh gambar: blot1 blot2

Wpapsco
sumber
Selamat datang di PPCG! Kami mendorong poster untuk membuat tajuk terkemuka yang menunjukkan bahasa yang mereka gunakan. Anda dapat menggunakan sintaks Markdown di editor untuk melakukannya, misalnya## Python
Jonathan Van Matre
5
Mungkin alih-alih piksel tunggal Anda dapat menggunakan disk (ukuran acak).
Howard
1
Selamat datang! Anda memiliki beberapa hasil yang sangat bagus di sini.
gilbertohasnofb