Що ви бачите в Inkspot? Покоління Роршаха '[закрито]


12

Тому я хотів би, щоб ви спробували генерувати зображення Rorschach, як зображено нижче:

Підроблена картина Роршаха

Ось посилання на подальше натхнення.

Це конкурс на популярність, але я скажу, що кольори, швидше за все, будуть популярнішими, ніж чорний і білий, а також текстури.

Зображення Роршаха створюються складанням паперу з чорнилом за таким критерієм - симетрія.

Мистецтво ASCII є дійсним, але воно підпадає під ті ж критерії, що і вище.


1
так що це, код-гольф чи популярність-конкурс?
Девід Уілкінс

2
<цитата Річарда Фейнмана> Є безглуздий чорнильний блок, а інші запитують у вас, що ви думаєте, що бачите, але коли ви їм скажете, вони починають сперечатися з вами! </quote>
user80551


1
Я хотів би побачити для цього стереограму .
Джастін

1
Це нагадало мені на фотографії, яку я нещодавно бачив
VX

Відповіді:


11

Фортран 95

Цей код є великим, але він дає хороший (іш) ASCii результат:

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

Код повністю коментується, але основна ідея полягає в тому, що він генерує матрицю зі значеннями від 0 до 3, що представляє кількість чорнила в цьому місці. Є 7 великих плям чорнила (пляма зі значенням 3, оточене значеннями 2) та багато маленьких «блискіток» (значення 1). Потім ця матриця перетворюється в матрицю символів, використовуючи таке перетворення:

0 =  
1 = .
2 = +
3 = @

Ось результат:

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

1
FORTRAN! Особистий фаворит.
Pureferret

2
Дякую! Зазвичай код Fortran + для початківців тут не має шансів, але хлопче, чи багато я дізнався про програмування з моменту початку участі в цьому сайті!
gilbertohasnofb

1
! FORTRAN - король списків на моїх очах, і це лише списки, тому я не бачу, як ти можеш піти не так.
Pureferret

1
Фортран не настільки гарячий для стислості, але продуктивність на увазі.
Джонатан Ван Матре

12

Пітон

Не зовсім найкраще чи найгладше, але ось рішення пітона:

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

Це просто робить "мандрівний шлях" для блоту і робить кілька таких.

Приклад використання:

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

І кілька прикладів зображень: блот1 блот2


Ласкаво просимо до PPCG! Ми рекомендуємо плакатам скласти помітний заголовок із зазначенням мови, якою вони користувалися. Ви можете використовувати синтаксис Markdown у редакторі для цього, наприклад## Python
Джонатан Ван Матре

5
Можливо, замість одиничних пікселів ви можете використовувати (випадкові розміри) диски.
Говард

1
Ласкаво просимо! Тут у вас є дуже приємні результати.
gilbertohasnofb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.