dinsdag, 11 augustus 2020 15:30

Rekenen aan een vervormde kaart

Beoordeel dit item
(0 stemmen)

Waarom / doel van de activiteit

De weg vinden met een kaart, die door een coordinatentransformatie vervormd is. 

Beschrijving van de activiteit

Kaartlezen kan iedereen, maar kun je het nog steeds als de kaart vervormd is? Je krijgt een kaart die via een bepaalde transformatie vervormd is, en de coordinaten van de punten waar je heen moet. Vervolgens moet je uitrekenen waar deze coordinaten op de kaart te vinden zijn, en er vervolgens heen lopen. Dit laatste kan nog best lastig zijn als alle wegen zijn uitgerekt en vervormd!

De kaart maken

Zelf heb ik bij de transformatie in poolcoordinaten gewerkt, met een cirkelvormige kaart, waarbij de projectie p' van punt p als volgt eruit zag: 

p' = (r',φ') = (r, φ+(r/R)*π)

Dit zorgt ervoor dat de punten op de rand van de kaart (op r=R) 180 graden (oftewel pi radialen) gedraaid worden. De punten in het midden (op r=0) worden niet gedraaid. Daartussen gaat de draaihoek lineair: de punten op r=R/2 worden dus 90 graden gedraaid, die op r=R/4 45 graden, enz. Dit is maar een voorbeeld, elke andere transformatie is mogelijk. (Om vervelend te doen, heb ik er helemaal op het eind ook voor gezorgd dat het noorden niet staat waar verwacht, dus de hele kaart nog eens gedraaid)

Om dit te maken, heb ik een kaart uit Google Maps geknipt (andere kaarten kunnen natuurlijk ook) en deze in Python bewerkt met behulp van de package OpenCV. Hiermee kun je een afbeelding importeren als een 2D-array van pixels, met als pixelwaarde de kleurwaarde. Ook heb ik gebruik gemaakt van numpy, een package dat werken met matrices en vectoren makkelijker maakt. 

Helaas is mijn transformatie niet linear. Eerst heb ik een leeg 2D array gemaakt waar de pixelwaardes op afgebeeld gaan worden. Ik ben door alle pixels heen gegaan met een for-loop, en heb vervolgens voor iedere pixel een rotatietransformatie uitgevoerd, met behulp van rotatiematrix M(θ)=( (cos(θ), -sin(θ)), (sin(θ), cos(θ))), zie rotatie matrix. Bij iedere pixel moest ik deze matrix dus weer opnieuw maken, mogelijk bestaat er een handigere manier. Voor iedere pixel p heb ik de kleurwaarde van die pixel gekopieerd naar pixel p' op de lege array, waarbij (in cartesische coordinaten hier) p' = (x', y') = M(π*sqrt(x^2+y^2)/R)*p. De lege array, die inmiddels dus gevuld is, heb ik weggeschreven naar een bestand, dit is de kaart. 

Deze kaart is vrijwel onleesbaar, omdat door afronding sommige pixels op dezelfde plaats zijn beland, terwijl andere pixels leeg zijn gebleven. Dit is op te lossen door in Gimp of Photoshop het contrast (of iets dergelijks) flink omhoog te gooien.

Vervolgens is het wel nodig om het coordinatenbereik van de originele kaart duidelijk te maken, en, afhankelijk van de groep, ze wat verder op weg te helpen. Let wel op: het verschil in (oost-west)coordinaten tussen twee horizontale punten anders is dan het verschil in(oost-west)coordinaten tussen twee horizontale punten anders is dan het verschil in (noord-zuid)coordinaten tussen twee verticale punten. Dat betekent dat de afstand tussen punten N51.9 E6 en N52 E6 anders is dan de afstand tussen N52 E5.9 en N52 E6.

Zie in de bijlage het blaadje wat ik uiteindelijk heb uitgedeeld, met een voorbeeldkaart, en een blaadje met extra hints

Benodigd materiaal

Een computer

Veiligheid

-

Tips

Het duurt vrij lang voordat je op weg kunt, hou daar rekening mee

Het kan leuk zijn de punten al op de vervormde kaart te tekenen, en dus het rekenwerk weg te laten, lopen op zo'n kaart is al een uitdaging op zich.

Lees 2217 keer Laatst aangepast op zondag, 15 mei 2022 11:44
Log in om reacties te plaatsen