Que voyez-vous dans un inkspot? Génération Rorschach '[fermé]

12

J'aimerais donc que vous tentiez de générer des images Rorschach comme l'image ci-dessous:

Fake Rorschach Picture

Voici un lien vers d'autres sources d'inspiration.

Il s'agit d'un concours de popularité, mais je dirai que les couleurs sont probablement plus populaires que le noir et blanc, ainsi que les textures.

Les images Rorschach sont créées en pliant du papier avec de l'encre, donc un critère est la symétrie.

L'art ASCII est valide, mais sera soumis aux mêmes critères que ci-dessus.

Pureferret
la source
1
Alors, quel est-il, code-golf ou concours de popularité?
David Wilkins
2
<quote Richard Feynman> Il y a une tache d'encre vide de sens, et les autres vous demandent ce que vous pensez que vous voyez, mais quand vous leur dites, ils commencent à se disputer avec vous! </quote>
user80551
2
Déjà ici :) mathematica.stackexchange.com/a/4224/193
Dr. Bélisaire
1
J'aimerais voir un stéréogramme pour ça.
Justin
1
Cela m'a rappelé sur une photo que j'ai vue récemment
VX

Réponses:

11

Fortran 95

Ce code est assez gros, mais il produit un joli résultat ASCII (ish):

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

Le code est entièrement commenté, mais l'idée de base est qu'il génère une matrice avec des valeurs comprises entre 0 et 3, représentant la quantité d'encre à cet endroit. Il y a 7 grandes taches d'encre (une tache avec une valeur 3 entourée de valeurs 2) et beaucoup de petits "scintillements" (valeur 1). Cette matrice est ensuite convertie en une matrice de caractères, en utilisant la conversion suivante:

0 =  
1 = .
2 = +
3 = @

Voici un résultat:

 +++      .  .      +++ 
 +@++++   .  .   ++++@+ 
 ++++@+.        .+@++++ 
   .+++   ++++   +++.   
          +@@+          
. .   . +++@@+++ .   . .
.       +@++++@+       .
     ++++++  ++++++     
     +@+        +@+     
.    ++++      ++++    .
   .  +@+      +@+  .   
  .  .+++.    .+++.  .  
 . .   .        .   . . 
    .    .    .    .    
   .   ..      ..   .   
 .                    . 
gilbertohasnofb
la source
1
FORTRAN! Un favori personnel.
Pureferret
2
Je vous remercie! Habituellement, le code pour débutants Fortran + n'a aucune chance ici, mais mon garçon, j'ai beaucoup appris sur la programmation depuis que j'ai commencé à participer à ce site!
gilbertohasnofb
1
! FORTRAN est le roi des listes à mes yeux, et ce ne sont que des listes, donc je ne vois pas comment vous pourriez vous tromper.
Pureferret
1
Fortran n'est pas si chaud pour la brièveté, mais les performances sont à point.
Jonathan Van Matre
12

Python

Pas tout à fait le meilleur ou le plus fluide, mais voici une solution 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")

Il fait juste un "chemin errant" pour un blot, et en fait plusieurs.

Un exemple d'utilisation:

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

Et quelques exemples d'images: blot1 blot2

Wpapsco
la source
Bienvenue chez PPCG! Nous encourageons les affiches à faire un en-tête bien visible indiquant la langue utilisée. Pour ce faire, vous pouvez utiliser la syntaxe Markdown dans l'éditeur, par exemple## Python
Jonathan Van Matre
5
Peut-être qu'au lieu de simples pixels, vous pouvez utiliser des disques (de taille aléatoire).
Howard
1
Bienvenue! Vous avez ici de très bons résultats.
gilbertohasnofb