잉크 팟에서 무엇을 보십니까? 로르 샤흐 세대 '[폐쇄]


12

아래 이미지와 같은 Rorschach 이미지를 생성하려고합니다.

가짜 심리 사진

더 많은 영감을 얻을 수 있는 링크 가 있습니다.

이것은 인기있는 경연 대회이지만, 색상은 질감뿐만 아니라 흑백보다 인기가 높을 것이라고 말할 것입니다.

심리 이미지는 잉크로 종이를 접어서 만들어 지므로 한 가지 기준은 대칭입니다.

ASCII 아트는 유효하지만 위와 동일한 기준이 적용됩니다.


1
그렇다면 코드 골프 또는 인기 경연 대회는 어느 것입니까?
David Wilkins

2
<quote Richard Feynman> 무의미한 잉크 블랏이 있으며 다른 사람들은 당신이 생각하는 것을 묻지 만, 말을하면 말다툼을 시작합니다! </ quote>
user80551


1
나는 이것에 대한 입체 사진 을보고 싶습니다 .
Justin

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
포트란! 개인적인 마음에 드는 것.
Pureferret

2
감사합니다! 일반적으로 Fortran + 초보자의 코드는 여기에 우연이 아니지만 소년,이 사이트에 참여하기 시작한 이후 프로그래밍에 대해 많은 것을 배우고 있습니다!
gilbertohasnofb

1
! FORTRAN은 내 눈의 목록의 왕이며, 이것은 목록 일뿐이므로 어떻게 잘못 될 수 있는지 알 수 없습니다.
Pureferret

1
포트란은 간결함을 위해 너무 뜨겁지 않지만 성능은 적절합니다.
Jonathan Van Matre 2014 년

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
Jonathan Van Matre

5
단일 픽셀 대신 (임의 크기의) 디스크를 사용할 수 있습니다.
Howard

1
어서 오십시오! 여기에 아주 좋은 결과가 있습니다.
gilbertohasnofb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.