I i i: 220 richting punten die dicht bij elkaar liggen, ook in het com puterbestand dicht bij elkaar zijn terug te vinden. Bij een eigen uitwerking van deze methode is niet gebleken dat deze methode betere resultaten zou geven dan de zelf ontwikkelde werkwijze die hierna wordt aangegeven. Voor de hier bedoelde toepassing, waarbij het in eerste instantie alleen van belang is de juiste coördinaten van knikpunten te vinden aan de hand van benaderde waar den, is een snelle werkwijze ontwikkeld. Daarbij wordt in twee fasen gewerkt. Bij de eerste fase, die voor een kaart- blad slechts één keer behoeft te worden toegepast, wor den de coördinaten van de punten gesorteerd op de X- waarde ervan en wordt een nieuw bestand vervaardigd van deze coördinaten. Hoewel na het starten van het be treffende onderdeel van het programma de aanwezigheid van de operateur niet van belang is, is het toch gunstig voor dit sorteren ook een snelle werkwijze toe te passen. Dit wordt mede veroorzaakt door het feit dat bij de sorte ring veelal een groot aantal coördinaten wordt betrokken. Bij eenvoudige sorteerroutines neemt de rekentijd toe met het kwadraat van de toename van het aantal te sorte ren waarden. Is het aantal punten bijvoorbeeld 100 keer zo groot als daarvoor, dan wordt in die situatie de reken tijd 10 000 keer zo groot. Reeds jaren wordt op verschillende plaatsen aandacht geschonken aan het zoeken van een snelle sorteerrou- tine. Toch zijn slechts twee methoden het meest interes sant. De eerste methode, door Shell [1959] ontwikkeld, vraagt in het geheel geen extra geheugenruimte voor het opslaan van tussenresultaten en is bij de schrijver favo riet door het feit dat de lengte van het eigenlijke sorteer- gedeelte van een programma, waarin deze werkwijze is verwerkt, zo gering is. Zie hiervoor ook de fig. 2 en 3. De tweede methode, die bekend staat onder de naam „Quicksort", is ontwikkeld door Hoare [1962] en is veelal iets, doch niet spectaculair, sneller dan de eerste. Deze methode wordt op verschillende wijzen gebruikt. Hierbij kan „recursief" programmeren worden toegepast, waar bij een routine dezelfde routine weer aanroept. Ten einde ook weer de stappen terug te kunnen maken, wordt op de zogenaamde „stack" in de computer een lijst bijgehou den. Een taal als FORTRAN kent de mogelijkheid van recursief programmeren niet. De „stack" wordt dan ver vangen door een lijst waarin enkele waarden tijdelijk wor den opgeslagen. De lengte van deze lijst is echter be perkt, zodat daarvoor slechts een klein gedeelte van de geheugenruimte van de computer behoeft te worden ge reserveerd. Zowel bij de methode van Shell als van Hoare neemt de rekentijd toe met ongeveer het aantal te sorte ren waarden vermenigvuldigd met de logaritme van dit aantal. Is het aantal waarden, zoals in bovenstaand voor beeld, 100 keer zo groot als daarvoor, dan is de rekentijd slechts ongeveer 200 keer zo groot. Het is goed bij het sorteren van de coördinaten op de X- waarde bij gelijke X-waarde te sorteren op de Y-waarde. Na het sorteren kunnen dan gemakkelijk de meervoudig vastgelegde waarden van een punt worden vervangen door één enkele opslag ervan. Voor het terugvinden van de juiste coördinaten van een punt is het immers niet nodig te weten dat een punt in meerdere lijnen voorkomt. Digitaliseren in een gescand kaartbeeld Voor de verdere bewerkingen wordt nu beschikt over twee bestanden. Het eerste bestand is uit de scanning ontstaan, het tweede bestand is het bestand met punten die gesorteerd zijn op de X-coördinaat. Dit kan ook een bestand zijn waarin geen coördinaten staan, doch waarin is aangegeven hoe een punt in het eerst genoemde be stand is terug te vinden! Bij het afbeelden van de figuratie op het beelscherm worden beide bestanden ingelezen. Het eerste wordt gebruikt om de verbindingen tussen de punten te visualiseren, het tweede om de punten te markeren en om in te zoeken. Nadat een punt waarvan de „juiste" coördinaten in het tweede bestand dienen te worden gevonden, bij benade ring op het beeldscherm is aangewezen, dient de compu ter in dat bestand naar de juiste coördinaten van het punt te zoeken. Bij dit zoeken in een gesorteerde reeks getal len wordt gebruik gemaakt van een techniek die wordt aangeduid met de term „binair" zoeken. Recent heeft Van der Schans [1989] deze methode ook aangeduid. De methode van werken is zeer logisch. Eerst wordt van de op het scherm na transformatie van de coördinaten naar RD-coördinaten gemeten coördinaat een waarde afgetrokken, die verband heeft met de tolerans waar binnen wordt gezocht. Een transformatie die nodig is om dat het beeld met een zekere schaalfactor en met een zekere verschuiving is gerealiseerd. Stel dat het bestand uit 25 000 punten bestaat. De eerste stap is daarna om te kijken wat de X-waarde van de coördinaat is van het punt #include (stdio.h) Sorteren van coördinaten op X-coördinaat en bij gelijke X-waarde op Y-coördinaat Versie in C. *1 main typedef struct long x; long y; coord; coord h,xy[40]; int i,j,l,m,nm; static int n=40; FILE *fp; fp-fopen("datin","r"); for (i=0;i(n;i fscanf(fp,"%ld",&xy[i].x); fscanf(f p,%ld ,&xy[i j .y); fclose(fp); Sorteren: m-1; do m»2*m; while (m<=n); do m (m-1)/2; nm n m; for (i-0;i(nm;l 18: l=j m; if (xy[l].x)xy[j].x)continue; if (xy[l).x- »xy[j].x) Gelijke X-waarde aangetroffen. if (xy[l].y)xy[j].y)continue; h-xyü); xyül-xyjl]; xyjl] h; j=j~m; if (j}=0)goto 18; while (m)l); Het resultaat: for (i=0;Kn;i+ +)printf("%91d%9ld\n",xy[i].x,xy[ij.y); exit(0); Fig. 3. Uitlijsting van het sorteren van veertig coördinaten met de sorteerroutine SHELL in C. Het eerste element van de array heeft, zoals bij de programmeertaal C gebruikelijk, het volgnummer 0. NGT GEODESIA 90 - 5

Digitale Tijdschriftenarchief Stichting De Hollandse Cirkel en Geo Informatie Nederland

(NGT) Geodesia | 1990 | | pagina 20