Was sehen Sie in einem Tintenfleck? Generation Rorschach '[geschlossen]

12

Ich möchte, dass Sie versuchen, Rorschach-Bilder wie das folgende zu generieren:

Gefälschtes Rorschach Bild

Hier ist ein Link zu weiteren Inspirationen.

Dies ist ein Beliebtheitswettbewerb, aber ich werde sagen, dass Farben wahrscheinlich beliebter sind als Schwarz und Weiß sowie Texturen.

Rorschach-Bilder werden durch Falten von Papier mit Tinte erstellt, sodass ein Kriterium die Symmetrie ist.

ASCII-Kunst ist gültig, unterliegt jedoch den gleichen Kriterien wie oben.

Pureferret
quelle
1
also was ist das, code-golf oder popularitätswettbewerb?
David Wilkins
2
<quote Richard Feynman> Es gibt einen bedeutungslosen Tintenklecks, und die anderen fragen dich, was du denkst, was du siehst, aber wenn du es ihnen sagst, fangen sie an, mit dir zu streiten! </ quote>
user80551
2
Bereits hier :) mathematica.stackexchange.com/a/4224/193
Dr. belisarius
1
Ich würde gerne ein Stereogramm dafür sehen.
Justin
1
Es erinnerte mich an ein Bild, das ich kürzlich gesehen hatte
VX

Antworten:

11

Fortran 95

Dieser Code ist ziemlich groß, erzeugt aber ein nettes (ish) ASCii-Ergebnis:

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

Der Code ist vollständig kommentiert, aber die Grundidee ist, dass eine Matrix mit Werten zwischen 0 und 3 generiert wird, die die Tintenmenge in diesem Punkt darstellt. Es gibt 7 große Tintenflecken (ein Fleck mit dem Wert 3, umgeben von den Werten 2) und viele kleine "Funkeln" (Wert 1). Diese Matrix wird dann mit der folgenden Konvertierung in eine Zeichenmatrix konvertiert:

0 =  
1 = .
2 = +
3 = @

Hier ist ein Ergebnis:

 +++      .  .      +++ 
 +@++++   .  .   ++++@+ 
 ++++@+.        .+@++++ 
   .+++   ++++   +++.   
          +@@+          
. .   . +++@@+++ .   . .
.       +@++++@+       .
     ++++++  ++++++     
     +@+        +@+     
.    ++++      ++++    .
   .  +@+      +@+  .   
  .  .+++.    .+++.  .  
 . .   .        .   . . 
    .    .    .    .    
   .   ..      ..   .   
 .                    . 
Gilbertohasnofb
quelle
1
FORTRAN! Ein persönlicher Favorit.
Pureferret
2
Vielen Dank! Normalerweise hat Fortran + Anfängercode hier keine Chance, aber Junge, habe ich viel über Programmierung gelernt, seit ich an dieser Seite teilnehme!
Gilbertohasnofb
1
! FORTRAN ist in meinen Augen der König der Listen, und dies sind nur Listen, damit ich nicht sehe, wie Sie etwas falsch machen können.
Pureferret
1
Fortran ist der Kürze halber nicht so heiß, aber die Leistung ist auf den Punkt.
Jonathan Van Matre
12

Python

Nicht ganz die beste oder glatteste, aber hier ist eine Python-Lösung:

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

Es macht nur einen "Wanderweg" für einen Fleck und macht mehrere davon.

Eine Beispielanwendung:

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

Und einige Beispielbilder: blot1 blot2

Wpapsco
quelle
Willkommen bei PPCG! Wir empfehlen den Postern, einen hervorgehobenen Header zu erstellen, in dem die von ihnen verwendete Sprache angegeben ist. Sie können dazu im Editor die Markdown-Syntax verwenden, z. B.## Python
Jonathan Van Matre
5
Möglicherweise können Sie anstelle von einzelnen Pixeln Festplatten mit zufälliger Größe verwenden.
Howard
1
Herzlich willkommen! Sie haben hier einige sehr schöne Ergebnisse.
Gilbertohasnofb