Racetrack Playa is een schilderachtig opgedroogd meer in Death Valley National Park (Californië, VSA). Dit uitzonderlijk vlak en horizontaal meer ligt op 1130 m boven de zeespiegel en is aan de noordkant slechts 4 cm hoger dan aan de zuidkant. Tijdens perioden van zware regenval vloeit water uit de bergen naar Racetrack Playa, waar het kortstondig een ondiep meer vormt. De hete woestijnzon doet het dunne laagje water snel verdampen, waardoor een zachte gladde modderlaag overblijft. Bij het opdrogen krimpt en scheurt de modder tot een mozaïekpatroon van aaneengesloten veelhoeken.

Het meer is vooral bekend omwille van een mysterieus geologisch fenomeen van “zeilende rotsblokken” die bewegen zonder interventie van mensen of dieren en daarbij lange sporen in de zachte grond achterlaten. Rotsblokken met een ruwe onderkant laten rechte gegroefde sporen na, terwijl rotsen met een platte onderkant de neiging hebben om af te dwalen. Soms kantelen de rotsblokken en komen daarbij met een andere zijde op de grond te liggen, waardoor ze plots een ander spoor achterlaten. De sporen verschillen zowel in richting als in lengte. Rotsblokken die in elkaars buurt liggen, kunnen bijvoorbeeld eerst een tijdje parallel bewegen en daarna plotseling naar links of naar rechts uitwijken, of zelfs rechtsomkeer maken.

Een zeilend rotsblok in Racetrack Playa.

De sporen werden voor het eerst waargenomen en bestudeerd aan het begin van de twintigste eeuw. Daaruit bleek onder andere dat de rotsblokken eens om de twee à drie jaar bewegen en dat hun sporen doorgaans drie à vier jaar zichtbaar blijven. Er zijn in de loop der jaren heel wat uiteenlopende theorieën aangebracht om het bewegen van de rotsblokken te verklaren. Zo dacht men bijvoorbeeld dat de rotsblokken voortgedreven werden door sterke winterwinden (tot 145 kilometer per uur), door drijvende ijsschotsen die zich aan het wateroppervlak vormen of door ijskragen die rond de stenen groeien en als een soort parachute fungeren.

Tijdens de winter van 2013-2014 slaagden geologen van het Scripps Institute of Oceanography1 er uiteindelijk in om de bewegingen van de rotsblokken te registeren met behulp van GPS en time-lapse-fotografie2. Op 20 december 2013 konden ze minstens 60 bewegende rotsblokken waarnemen, waarvan sommige zich tussen december 2013 en januari 2014 tot 224 meter verplaatsten in verschillende fasen. Hun studie weerlegde eerdere hypothesen die de bewegingen toeschreven aan de wind of aan dikke ijslagen die rotsen voortstuwen. In plaats daarvan stelden ze vast dat de rotsblokken bewegen wanneer een ijslaag van slechts een paar millimeter dik begint te smelten tijdens perioden met lichte wind. Als deze flinterdunne ijsvliezen over het smeltwater schuiven, kunnen ze de rotsblokken meevoeren tot maximaal vijf meter per minuut. Hoe massieve rotsblokken van honderden kilogrammen bewegen en waarom er soms stenen ontbreken op het einde van een spoor blijft voorlopig een raadsel.

Opgave

In deze opgave stellen we een rotsblok voor als een balkvormig object. Het blok ligt altijd op het grondvlak (XY-vlak) van een driedimensionale ruimte met een vast assenstelsel zoals aangegeven in onderstaande figuur. Het blok wordt steeds bekeken vanuit een standpunt langs de positieve X-as in de richting van het YZ-vlak. Het voorvlak van het blok ligt altijd parallel met het YZ-vlak. De afmetingen van het blok worden beschreven door zijn breedte \(B \in \mathbb{N}_0\) (gemeten langs de X-as), lengte \(L \in \mathbb{N}_0\) (gemeten langs de Y-as) en hoogte \(H \in \mathbb{N}_0\) (gemeten langs de Z-as). De positie van het blok wordt beschreven aan de hand van de positie van het hoekpunt \((x,y)\) linksonder in het voorvlak (in de figuur aangeduid met een zwarte stip), waarbij geldt dat \(x, y \in \mathbb{Z}\).

Beschrijving van de afmetingen en positie van een balkvormig object in een driedimensionale ruimte met vast assenstelsel. De afmetingen van het object worden beschreven door de breedte $B$, de lengte $L$ en de hoogte $H$. De positie van het object wordt beschreven aan de hand van het hoekpunt linksonder in het voorvlak, dat wordt aangegeven met een zwarte stip. Op de figuur ligt dit hoekpunt in de oorsprong $(0, 0)$ van het grondvlak.

De oppervlakte \(A\) van het rotsblok wordt gegeven door: \(A = 2(L\cdot B + L\cdot H + H\cdot B)\)

Het volume \(V\) wordt gegeven door: \(V = L\cdot H\cdot B\)

De lengte van de binnendiagonale lijn \(d\) wordt gegeven door:\(d = \sqrt{L^2 + H^2 + B^2}\)

Er zijn twee manieren waarop het rotsblok kan bewegen: schuiven of kantelen. Het rotsblok kan over zijn volledige lengte naar links of naar rechts schuiven, of kan over zijn volledige breedte naar voor of naar achter schuiven. Dit wordt geïllustreerd in onderstaande figuren.

Het blok wordt over zijn volledige lengte naar rechts verschoven.Het blok wordt over zijn volledige breedte naar voor verschoven.

Het rotsblok kan ook naar links, rechts, voor of achter kantelen. Dit wordt geïllustreerd in onderstaande figuren.

Het blok wordt naar rechts gekanteld.Het blok wordt naar voren gekanteld.

Gevraagd wordt om een klasse Blok te definiëren waarmee rotsblokken kunnen voorgesteld worden die afmetingen en een positie hebben zoals hierboven beschreven, en die ook op de twee aangegeven manieren kunnen bewegen. Deze klasse moet minstens de volgende methoden ondersteunen:

Voorbeeld

> const rots = new Blok(5, 2, 3);
> rots.toObject();
{ lengte: 5, hoogte: 2, breedte: 3, positie: [ 0, 0 ] }
> rots.oppervlakte();
62
> rots.volume();
30
> rots.diagonaal();
6.164414002968976
> const rots2 = rots.schuif('R');
> rots2.toObject();
{ lengte: 5, hoogte: 2, breedte: 3, positie: [ 0, 5 ] }
> rots.schuif('V').toObject();
{ lengte: 5, hoogte: 2, breedte: 3, positie: [ 3, 5 ] }
> rots.kantel('L').toObject();
{ lengte: 2, hoogte: 5, breedte: 3, positie: [ 3, 3 ] }
> rots.kantel('A').toObject();
{ lengte: 2, hoogte: 3, breedte: 5, positie: [ 0, 3 ] }
> rots.kantel('A').schuif('L').kantel('L').schuif('A').toObject();
{ lengte: 5, hoogte: 2, breedte: 3, positie: [ -8, -4 ] }
> rots.zeil('SA').toObject();
{ lengte: 5, hoogte: 2, breedte: 3, positie: [ -11, -4 ] }
> rots.zeil('KR').toObject();
{ lengte: 2, hoogte: 5, breedte: 3, positie: [ -11, 1 ] }
> rots.zeil('SVSVKLSLKAKASRSVKRKVKRKRSASV').toObject();
{ lengte: 2, hoogte: 3, breedte: 5, positie: [ -2, 6 ] }

> rots.kantel('X');
AssertionError: ongeldige richting
> rots.zeil('XY');
AssertionError: ongeldige beweging
> rots.zeil('KY');
AssertionError: ongeldige richting