Georg Nees (1926 - 2016) was a pioneer of computer art. He studied mathematics, physics and philosophy in Erlangen and Stuttgart. In 1977, he was appointed Professor of Applied computer science at the University of Erlangen, Germany.

Nees is one of the "3N" computer pioneers, an abbreviation that has become acknowledged for Frieder Nake, Georg Nees and Michael Noll, whose graphics were created with mainframe computers. Their works have been shown in countless group exhibitions worldwide.

Victoria & Albert Museum

In 1968 Nees started his collaboration with the architect Ludwig Rase for the Siemens Pavilion at the Hannover Industrial Fair in 1970. One of the drawings was printed as a poster for the 35th Venice Biennale in 1970.

enter image description here

Georg nees, Drawing of the Siemens Pavillion, 1970

My favourite artwork of Georg Ness is Ellipsoide 4, created in 1986 - two years before Mathematica saw the light of day.

enter image description here

Georg Ness, Ellipsoide 4, 1986

Nees used ALGOL to create his graphics libraries and for controlling a ZUSE Z64 flatbed drawing machine.

enter image description here


"Schotter" (gravel), probably his best-known work, begins with a standard row of 12 squares and gradually increases the magnitude of randomness in the rotation and placement of the squares. The art piece was created in 1968 on a Siemens-System 2002 and plotted with the Z64 shown above.

enter image description here

Georg Nees, Schotter (gravel), 1968

Two years earlier, in 1966, Nees produced K27:

enter image description here

Georg Nees, K27, 1966

My question

After almost 60 years: How many lines of Mathematica code do we need today to reproduce "Schotter" or "K27" ?


Algol code of Nees' original Schotter-generator (thanks to Alex Trounev)


  • 3
    $\begingroup$ Not sure who downvoted and why. I did the ThumbsUp because it's a nice question. Also, in case the person who downvoted sees this, it's more constructive to leave a comment, unless the question is obviously low-quality or spam or.... This one is not. $\endgroup$
    – bmf
    Feb 18 at 9:51
  • 5
    $\begingroup$ We expect from all users (especially newcomers) that they show their own effort and include the code in the question. This one does not – hence the downvote, as the tooltip on the button clearly says "This question does not show any research effort;" $\endgroup$
    – Domen
    Feb 18 at 11:24
  • 7
    $\begingroup$ @Domen Some are just too much fun to apply rules strictly. $\endgroup$ Feb 18 at 15:38
  • 5
    $\begingroup$ Effort can be shown by writing a detailed, documented and interesting question. $\endgroup$ Feb 18 at 20:42
  • 3
    $\begingroup$ @eldo In this free book on page 49 there is Algol code for Schotter“ agis.informatik.uni-bremen.de/sgrabowski/material/… $\endgroup$ Feb 19 at 0:43

4 Answers 4


Here is a proposal for K27. We first create e regular grid. Then we displace randomly every point proportional to its distance from the middle.

rand = 3.5;
meshf[grid_] := Join[Line /@ grid, Line /@ Transpose[grid]];
nx = 10; ny = 15;
grid = Table[{x, y} + 
    rand/(1 + Norm[{x, y}])  RandomReal[{-1, 1}, 2], {y, -ny, 
    ny}, {x, -nx, nx}];
mesh = meshf[grid];
Graphics[mesh, AspectRatio -> Automatic]

enter image description here


A quick,fun approach :

nx = 5; ny = 24;
     Translate[Rectangle[{#1, -#2}, 1 + {#1, -#2}]
      , #2/ny RandomReal[{0, 1}, {2}]]
     , 10 #2/ny RandomReal[{-1, 1}] Degree] &, {nx, ny}]  //
  {EdgeForm[Black], FaceForm[Opacity[.1]], #} & //

enter image description here

  • 2
    $\begingroup$ +1, With nx = 12, EdgeForm[Gray] and FaceForm[Opacity[0]] I get perfect reproductions. $\endgroup$
    – eldo
    Feb 18 at 10:33
  • $\begingroup$ a variation: schotter[nx_, ny_] := Graphics[ Array[{EdgeForm[GrayLevel[(#2 + 2)/ny]], FaceForm[Opacity[.9 - (#2 - 1)/ny]], Rotate[Translate[Rectangle[{#1, -#2}, 1 + {#1, -#2}], #2/ny RandomReal[{0, 1}, {2}]], 10 #2/ny RandomReal[{-1, 1}] Degree]} &, {nx, ny}, 0]]; Animate[Show[schotter[12, y], PlotRange -> {{-2, 13}, {-25, 2}}, {y, 1, 24, 1}] $\endgroup$
    – kglr
    Feb 19 at 3:05
  • 1
    $\begingroup$ Please don't use JPG for non-photographic images. JPG uses a lossy compression algorithm that (when applied reasonably) does not affect the visual appearance of a photograph noticeably. But when applied to graphs, diagrams, screenshots, images of text etc., JPG typically causes severe artefacts that are very noticeable indeed. For this kind of images (i.e., non-photographic images), PNG is a much better choice. PNG employs a lossless compression algorithm and is specifically designed for this kind of graphics. $\endgroup$ Feb 19 at 9:48
  • For K27,maybe use "MeshTools" for QuadMesh.
ResourceFunction["GitHubInstall"]["c3m-labs", "MeshTools"];
region = DiscretizeGraphics[Rectangle[{0, 0}, {3, 4}]];
meshTri = 
   ToElementMesh[region, "MeshOrder" -> 1, MaxCellMeasure -> .05];
meshQuad = SmoothenMesh@TriangleToQuadMesh@meshTri;
reg = MeshRegion[meshQuad];
polys = MeshPrimitives[reg, MeshCellIndex[reg, {2, "Interior"}]];
Graphics[{FaceForm[], EdgeForm[Gray], polys}]

enter image description here

  • For K27 -> Schotter.
Graphics[{EdgeForm[Gray], FaceForm[], 
      RandomReal[{0, .02}]*((y - Last@RegionCentroid[polys[[i]]])/y)]@*
     TranslationTransform[{RandomReal[{-.01, .01}], -RandomReal[{0, \
.3}]}*((y - Last@RegionCentroid[polys[[i]]])/y)^2]], {i, 1, 

enter image description here


K27, using GridGraph


With[{g = GridGraph[{25, 17}, VertexSize -> 0], d = 7, r = .75, c = RGBColor[.7, .7, .6]}, 
 Graph[g, VertexCoordinates -> 
   MapThread[#1 -> #2 + Boole[($l = Length[FindShortestPath[g, #1, First@GraphCenter[g]]]) < d] 
      RandomReal[2 {-$l, $l}/d, 2] &
    , {VertexList@g , Map[# + RandomReal[r, 2] &, GraphEmbedding[g]]}]
, VertexStyle -> c, BaseStyle -> EdgeForm[None], EdgeStyle -> c]]

enter image description here


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.