Follow up post here:​
Computational geometry modeling of the neolithic circular ditch in Vinoř, Prague
​https://community.wolfram.com/groups/-/m/t/3710432
Inspired by a photo of the famous Bronze age Nebra Sky Disk [2] and a recent Wolfram Community post about the nearby Goseck Circle [3], the author recently developed a deep curiosity into Central European Neolithic Circular Ditches [1] or roundels and the widely debated archaeoastronomical interpretation of the azimuthal orientation of their entrances. These monumental earthworks buildings, buried for centuries under crop fields, are spread over a quite large area in Central Europe [4], comprising about 180 sites among modern Austria, Hungary, Czech Republic, Slovakia, Poland and Germany, as shown in this picture.
Such structures are called in German Kreisgrabenanlagen, so the acronym KGA will be often used in this post for brevity [5]. They date back to the 5th millenium BC, about 2000 years before the highly acclaimed stone megaliths in British Islands, such as Stonehenge and New Grange. During this period the spread of agriculture took definitely place in the Continent with the first proto-Indoeuropean people coming from the Eurasian steppes.
Archeological investigations started since 1886 with the first discovery of a Neolithic enclosure in Krpy (Bohemia), but quickly increased from the 1960s thanks to magnetometer-based prospections and aerial survey photography. Remarkably, it was found that orientation towards solstices at sunrise and sunset is quite common for KGAs in Bavaria (e.g. Ippesheim, district of Bad Windsheim, Bavaria) alongside Saxony [3] and Poland [5, 6], while KGAs in Bohemia, Hungary and Slovakia were often related to lunistices [10, 13]. The astronomical interpretation has been more controversial for Austrian sites, where very few KGAs with definitely solar and lunar orientation were identified alongside several ones with no clear astronomical orientation, probably just dictated by terrain slope directions down the valleys [7-9].
This can be explained by the argument that sun and moon cycles were not so easy to be tracked by Neolithic observers during winter cloudy days or bad weather conditions in the Alps and Central Europe [6]. However, it is now generally accepted that KGA served as cult centers with social and religious purposes as well as astronomical observatories with lunisolar calendar function [1, 5, 6]. This is a testament to the still underrated astronomical knowledge of our Neolithic ancestors, who were actually able to keep trace of sun and moon path cycles for decades across centuries, although without sofisticated technology.
In this post, some user-contributed functions from Wolfram Function repository will be used to build generic 3D graphical models for Neolithic rondels, whose entrance gates point towards relevant astronomical events (solstices, equinoxes or lunistices).
Thanks to the excellent coding work published in the latest Wolfram Summer School 2025 [11] and the built-in astronomy-related functions in Mathematica, it is possible to devise within a few code lines a flexible 3D visualization setting showing the geometrical matching between the azimuthal angle for each KGA gate and the actual sun or moon position at the time of its foundation (roughly between 49th and 46th century BC).
Therefore, this post can be intended as a tutorial for building up simple and portable archeoastronomical simulations with Wolfram Language, before switching to advanced and dedicated astronomy and archeological simulation software such as Stellarium [12].

Geometrical Modeling of Neolithic Circular Ditches with palisade

In this picture [4] some magnetograms typical for Austrian KGAs are collected; these structures may involve mostly two semicircular ditches with opposite gates forming a circle or up to three circuits of ditches interrupted with 3-to-5 entrances at cardinal or astronomically-oriented points. In most cases, an internal (single or double timber) palisade is present with corresponding openings aligned with the KGA gates.
In order to build a simplified but realistic KGA with arc shaped ditches, the functions Disk3D and Annulus3D were extremely useful, whereas SplineCircle is needed for modeling the palisade profile. All of them are available from the Wolfram Function Repository.
In[]:=
Annulus3dKGA=ResourceFunction["Annulus3D"];​​Disk3dKGA=ResourceFunction["Disk3D"];
This is a 3D model for a KGA made of two semicircular ditches with opposite entrance gates (e. g. Pranhartsberg 2, Lower Austria) .
In[]:=
lawn180={{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.15}},{3/2,2},{0,2π}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.15}},{1.15,1.35},{π+0.2,2π-0.2}]},(*entrancegates*){EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.15}},{1,1.5},{-0.1,0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.15}},{1,1.5},{π-0.1,π+0.1}]},{Green,Annulus3dKGA[{{0,0,0},{0,0,0.15}},{1.15,1.35},{0+0.2,π-0.2}]},FaceForm[Green],EdgeForm[Green],Cylinder[{{0,0,0},{0,0,0.15}},1],LightBrown,Disk3dKGA[{0,0,0},{3/2,3/2}]};
In[]:=
Graphics3D[lawn180,ViewPoint{1,-1,1},Boxed->False]
Out[]=
To model the circle on which the palisade is built on, SplineCircle is needed for drawing a circle in 3D space. Then one cylinder modeling a single stick of the palisade is placed on each mesh of the discretized circular region, as follows
In[]:=
sc=Graphics3DResourceFunction["SplineCircle"][{0,0,0},{0.95,0.95}],
;​​reg=DiscretizeGraphics[sc,MaxCellMeasure0.5,MeshCellShapeFunction->(0->(Ball[{#},0.02]&)),MeshCellLabel->{1"Index"}];​​dataall=MeshCoordinates[reg][[All,1;;3]];​​dataopened=Delete[MeshCoordinates[reg][[All,1;;3]],{{1},{48},{49},{24},{25}}(*openingscorrespondingtooppositegates*)];​​fence=Flatten[MapIndexed[{Cylinder[{#1,#1+{0,0,1.25}/5},0.02]}&,dataopened,{1}][[All]]];
In[]:=
Graphics3D[{fence,lawn180},ViewPoint{0,0,1},Boxed->False]
Out[]=

A generic KGA model for relevant astronomical events

Astronomical aspects of KGAs of Lower Austria in relationship with calendar dates have been specifically discussed in literature [9]. Here, a very useful table can be found for azimuth angles of the sun at relevant dates of the year for an average latitude of 48.5°, which are particularly relevant in Western culture. Note that for certain rows the originary Celtic festivity name is reported alongside the current civil denomination, which can be easily related to Christian festivities.
The table below summarizes the relevant data of [9] which can in turn be retrieved with Wolfram built-in function FindAstroEvent.
Within a few degrees they can be valid for all KGAs in Central Europe.
In[]:=
TextGrid[{{"Astronomical \n Event","Azimuth \n Sunrise","Azimuth \n Sunset"," Julian \n Calendar","Gregorian \n Calendar","Conventional \n Calendar"},{"Spring Equinox",89Degree,271Degree,"29.4","23.3","21.3"},{"Beltane May Day",63Degree,297Degree,"15.6","9.5","7.5"},{"Summer Solstice",51Degree,309Degree,"31.7","24.6","22.6"},{"Lugnasad August Day",63Degree,297Degree,"14.9","8.8","6.8"},{"Autumn Equinox",89Degree,271Degree,"28.10","21.9","19.9"},{"Samhain November 1st",115Degree,245Degree,"11.12","4.11","2.11"},{"Winter Solstice",127Degree,233Degree,"26.1","19.12","17.12"},{"Imbolg February 1st",115Degree,245Degree,"13.3","4.2","2.2"}},Frame->All,Alignment->Center,Spacings{Automatic,1.0}]
Out[]=
Astronomical Event
Azimuth Sunrise
Azimuth Sunset
Julian Calendar
Gregorian Calendar
Conventional Calendar
Spring Equinox
89°
271°
29.4
23.3
21.3
Beltane May Day
63°
297°
15.6
9.5
7.5
Summer Solstice
51°
309°
31.7
24.6
22.6
Lugnasad August Day
63°
297°
14.9
8.8
6.8
Autumn Equinox
89°
271°
28.10
21.9
19.9
Samhain November 1st
115°
245°
11.12
4.11
2.11
Winter Solstice
127°
233°
26.1
19.12
17.12
Imbolg February 1st
115°
245°
13.3
4.2
2.2
The azimuth angles for the sun positions at sunrise and sunset during solstices were extracted to build a more refined model of a KGA with gates pointing to these directions and a double timber palisade. In some KGAs specific openings corresponding to the equinox sunrise were also identified. The reader is invite to modify the model KGA to add this feature, accordingly.
In[]:=
angleSummSolsRise=51/180*π;angleSummSolsSet=309/180*π;​​angleWintSolsRise=127/180*π;angleWintSolsSet=233/180*π;
In[]:=
sc1=Graphics3DResourceFunction["SplineCircle"][{0,0,0},{0.95,0.95}],
;​​reg1=DiscretizeGraphics[sc1,MaxCellMeasure0.5,MeshCellShapeFunction->(0->(Ball[{#},0.02]&)),MeshCellLabel->{1"Index"}];​​dataall1=MeshCoordinates[reg1][[All,1;;3]];​​dataopened1=Delete[MeshCoordinates[reg1][[All,1;;3]],{{31},{32},{17},{18},{7},{8},{41},{42}}(*openingscorrespondingtooppositegates*)];​​fence1=Flatten[MapIndexed[{Cylinder[{#1,#1+{0,0,1.25}/5},0.02]}&,dataopened1,{1}][[All]]];​​(*additionalinnerfence*)​​scinner=Graphics3DResourceFunction["SplineCircle"][{0,0,0},{0.75,0.75}],
;​​reginner=DiscretizeGraphics[scinner,MaxCellMeasure0.5,MeshCellShapeFunction->(0->(Ball[{#},0.02]&)),MeshCellLabel->{1"Index"}];​​dataallinner=MeshCoordinates[reginner][[All,1;;3]];​​dataopenedinner=Delete[MeshCoordinates[reginner][[All,1;;3]],{{31},{32},{17},{18},{7},{8},{41},{42}}(*openingscorrespondingtooppositegates*)];​​fenceinner=Flatten[MapIndexed[{Cylinder[{#1,#1+{0,0,1.25}/5},0.02]}&,dataopenedinner,{1}][[All]]];
Final 3 D model
In[]:=
KGAgen={fence1,fenceinner,(*tomakeitmorepopulatedwithsticks*)Rotate[fenceinner,4Degree,{0,0,1}],{Green,Cuboid[{-2,-2,0.09},{2,2,0.09}]},{(*joint2*)EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.0,1.85},{angleWintSolsSet-0.05,angleWintSolsSet+0.05}]},{(*joint1*)EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.0,1.85},{angleSummSolsSet-0.05,angleSummSolsSet+0.05}]},(*firstroundel*){EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.15,1.35},{angleWintSolsSet+0.1,angleSummSolsSet-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.15,1.35},{angleWintSolsRise+0.1,angleWintSolsSet-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.15,1.35},{angleSummSolsRise+0.1,angleWintSolsRise-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.15,1.35},{angleSummSolsSet+0.1,angleSummSolsRise-0.1}]},​​(*2ndroundel*){EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.45,1.65},{angleWintSolsSet+0.1,angleSummSolsSet-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.45,1.65},{angleWintSolsRise+0.1,angleWintSolsSet-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.45,1.65},{angleSummSolsRise+0.1,angleWintSolsRise-0.1}]},{EdgeForm[Green],Green,Annulus3dKGA[{{0,0,0},{0,0,0.1}},{1.45,1.65},{angleSummSolsSet+0.1,angleSummSolsRise-0.1}]},{EdgeForm[Green],LightBrown,Disk3dKGA[{0,0,0.1},{1.85,1.85}]},{FaceForm[Green],EdgeForm[Green],Cylinder[{{0,0,0},{0,0,0.1}},1]}};
In[]:=
Graphics3D[KGAgen,ViewPoint{0,1,1},Boxed->False]
Out[]=

Quick modeling of a simple realistic roundel

To get the azimuthal orientation of the roundel Pranhartsberg 2 in Lower Austria, both fence and lawn are rotated by the measured value of 51°.
This value can be inferred by a quick image analysis of the corresponding magnetogram image as shown below. This was chosen as it is one of the few Austrian roundels with a clearly recognizable astronomical orientation of its openings: sunset at summer solstice in NW gate and sunrise at winter solstice in SE gate.
In[]:=
currentKGA=
;centroidKGAmesh=RegionCentroid[ImageMesh[EdgeDetect[currentKGA,9.9,0.1]]];Show[{currentKGA,Graphics[{Orange,Arrowheads[{-.05,.05}],Rotate[Arrow[{centroidKGAmesh-{0,180},centroidKGAmesh+{0,180}}],51Degree],Orange,PointSize[0.02],Point[centroidKGAmesh]}]},ImageSize->Medium]
Out[]=
While the graphical matching with the magnetogram is perfect for the NW gate, the little azimuthal deviation at SE gate was explained with terrain collapse as explained in the corresponding above link for the KGA (also retrievable from [5]).
Here is the 3D graphical model of the considered rondel.

Solstices for a simple Neolithic enclosure in Austria

The code from the WSSS25 [11] was slightly adapted to replace some elements (like central lawn and inner fence) of the KGA in place of the original cuboid in the skyPathPlot module and adjust the 3D view orientation angle, in order to better show the astronomical orientation of the KGA palisade gates with solstice events at sunrise and sunset computed for the Neolithic date 4700 BC at the model latitude of Pranhartsberg location (48.5°) in Lower Austria.
This confirm the geometrical consistence between the simulator in skyPathPlot and the azimuth angles used for the KGA side openings.
For the specific case of Pranhartsberg 2 the corresponding plots can be obtained as follows

Lunar standstills in Neolithic rondels of Bohemia and Slovakia

The 2004 paper by Pavuk and Karlovsky [10] contains very detailed information related to the azimuth angles of the entrances of several KGAs in Bohemia and Slovakia which belong to the Lengyel culture [4]. Some relevant cases were found having openings oriented to lunar standstills or lunistices [13]. Additionally, a list of mid-Neolithic dates for major and minor lunar standstill events can be found, which is quite helpful for checking monthly lunistice events (Tab. 5 on page 30 of [10]).
The example of roundel Svodín 2 in Southern Slovakia is quite remarkable (Fig. 3 in [10]) since its doors are exactly oriented towards NE (45°), NW (315°), SE (135°) and SW (225°) directions and were related by the prominent Slovak archeologist Viera Nìmejcová-Pavúková in 1995 to the moonrise (eastern side) and the moonset (western side) at major lunar standstills. A recent 3D reconstruction of this archeological monument can be found here.
In the following, monthly lunistices are computed for the major Lunar standstill occurring in 4696 BC, which is highlighted in bold in the previously mentioned table of Neolithic lunistice events. Events of extreme declinations (> 29° or < -30°) are selected and the angular positions of the moon on the horizon at the corresponding location are computed for each event. It is found within an error of less than 5° that the predictions of the moon azimuth at its rise and set are in very good agreement with the archeologist’s intuition (45°, 315°, 135°, 225°). Note that in such simplified computation scheme the refractive effect of the Earth atmosphere on the moonlight has not been taken into account, which explains the slight numerical deviations of the Moon azimuth from the expected values (45°, 315°, 135°, 225°).
In order to achieve a good azimuthal matching in the 3D model one just needs to draw gates with a bit enlarged openings.

Extreme monthly lunar standstill events at positive declination

Computation of azimuths at moonrise and moonset

​

Extreme monthly lunar standstill events at negative declination

Computation of azimuths at moonrise and moonset

​

3D visualization of the Moon position at major lunar standstills for the Svodín 2 KGA model

Summary

A tutorial for building 3D graphical sketches of circular Neolithic ditches has been presented on the basis of native and contributed Wolfram Language functions to show their versatility for archaeoastronomy. As featured examples, two models for circular Neolithic ditches both from Lengyel culture were presented, the first oriented towards solstice events and the latter towards major lunistices, with excellent agreement to documented archeological data.

References

[1] https://en.wikipedia.org/wiki/Neolithic_circular_enclosures_in_Central_Europe
[2] https://en.wikipedia.org/wiki/Nebra_sky_disc
[3] https://community.wolfram.com/groups/-/m/t/3452494
[4] https://www.mdpi.com/2072-4292/14/11/2657
[5] https://de.wikipedia.org/wiki/Kreisgrabenanlage (note: this Wiki link in German provides a curated list of roundels by country with detailed description)
[6] https://link.springer.com/article/10.1007/s10816-024-09669-2 (Open Access)
[7] https://astrosim.univie.ac.at/
[8] W. Neubauer, I. Kowatschek, Älter als Stonehenge: Rätselhafte Monumente in Österreich, Kral Verlag (2023)
[9] Mittelneolithische Kreisgrabenanlagen in Niederösterreich (Open Access PDF edition)
[10] https://www.karlovsky.info/publications/Pavuk_Karlovsky_Germania86_2.pdf
[11] https://community.wolfram.com/groups/-/m/t/3496335
[12] https://doi.org/10.1558/jsa.17822 (ArXiv preprint also available)
[13] https://en.wikipedia.org/wiki/Lunar_standstill
[14] Neolithic wooden circular ditch image, Museum Quintana, part of the lead image of this post https://en.wikipedia.org/wiki/File:Museum_Quintana_-_Unternberg_1.jpg

CITE THIS NOTEBOOK

Archaeoastronomy with Wolfram Language: 3D modeling of Neolithic circular ditches in Central Europe​
By Jessica Alfonsi​
Wolfram Community, STAFF PICKS, January 9, 2026
​https://community.wolfram.com/groups/-/m/t/3603965