voorstellen van vlakke figuren in javausers.telenet.be/tijldb/thesis/scriptie.pdf · voorstelling...

84
Universiteit Gent Faculteit Toegepaste Wetenschappen Vakgroep Wiskundige Analyse Voorzitter: Prof. Dr. R. Van Keer Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper Afstudeerwerk ingediend tot het behalen van de graad van licentiaat in de informatica, optie: numerieke informatica Academiejaar 2000{2001

Upload: others

Post on 22-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Universiteit Gent

Faculteit Toegepaste Wetenschappen

Vakgroep

Wiskundige Analyse

Voorzitter: Prof. Dr. R. Van Keer

Voorstelling van vlakke ¯guren in Java

door Tijl De Backer

Promotor: Prof. Dr. H. De Schepper

Afstudeerwerk ingediend tot het behalen van de graad van licentiaat

in de informatica, optie: numerieke informatica

Academiejaar 2000{2001

Page 2: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Toelating tot bruikleen

De auteur geeft de toelating dit afstudeerwerk voor consultatie beschikbaar te stellenen delen van het afstudeerwerk te copiÄeren voor persoonlijk gebruik. Elk ander gebruikvalt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot deverplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit ditafstudeerwerk.

Tijl De Backer 18 mei 2001

i

Page 3: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Dankwoord

In de eerste plaats wens ik mijn promotor Prof. Dr. H. De Schepper te danken omdat zijhet voor mij mogelijk maakte deze thesis te schrijven.Anderzijds dank ik ook al de andere hulpverleners, zoals daar zijn Prof. Dr. K. Cool-saet, Prof. Dr. V. Fack, Prof. Dr. Ir. H. Tromp, Jethro Seghers, John Van der Veen enJeroen Vantroyen die allen hun steentje bijgedragen hebben om mijn kennis van Java enobjectgeoriÄenteerd programmeren te brengen tot waar zij nu staat. Daarnaast ben ikProf. Dr. C. Thas dankbaar voor het suggereren van interessante en nuttige lectuur overvlakke meetkunde. Hier wens ik ook Chris Cornelis, Peter De Kesel, Robbie De Sutter,Klaartje Goethals, Ellen Hendriks, Wouter Leroy, Peter Raemdonck, Steven Van Buggen-hout, Stephan Van Damme, Sidney Van Damme en Sarah Van Laere te danken voor hunnuttige opmerkingen en secure lectuur.Volgende dankbetuigingen gaan uit naar Prof. Dr. Ir. P. Bergmans, die mij nog vele nieuwegra¯sche technieken heeft aangeleerd.Tot slot mag zeker de persoon niet vergeten worden die het gra¯sche vuur in mij hevigheeft doen ontvlammen: Prof. Dr. H. Serras.

ii

Page 4: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Voorstelling van vlakke ¯guren in Java

doorTijl De Backer

Afstudeerwerk ingediend tot het behalen van de graad van licentiaat in de informatica,optie: numerieke informatica

Academiejaar 2000{2001

Universiteit GentFaculteit Toegepaste Wetenschappen

Promotor: Prof. Dr. H. De Schepper

Samenvatting

In dit werk komen algoritmes aan bod voor:

² het voorstellen van basiskrommen op het scherm

² het uitvoeren van a±ene transformaties

² het berekenen en tekenen van benaderende krommen

² het tekenen van andere meetkundige plaatsen

De broncode is te vinden op de bijgevoegde diskette, of op internet:http://cage.rug.ac.be/»tijl/

Trefwoorden:

clipping, Cohen-Sutherland, Bresenham, a±ene transformaties, B¶ezier, splines, b-splines,meetkundige plaatsen, kegelsneden, quadratrix, Hippias

iii

Page 5: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Inhoudsopgave

1 Inleiding: Clipping in het vlak 11.1 Algoritmes van clipping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 Het algoritme van Cohen-Sutherland . . . . . . . . . . . . . . . . . . 31.1.2 Het middelpuntsalgoritme . . . . . . . . . . . . . . . . . . . . . . . . 31.1.3 Vergelijking van beide algoritmes . . . . . . . . . . . . . . . . . . . . 4

1.2 Gra¯sch programmeren in Java . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.1 Opbouw van de klasse . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.2 Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2.3 Knop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.4 ActionListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.5 Schuifbalk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.2.6 ChangeListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2.7 MouseListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.8 WindowListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.9 Implementatie van het algoritme van Cohen-Sutherland . . . . . . . 111.2.10 Implementatie van de middelpuntsmethode . . . . . . . . . . . . . . 13

2 Voorstellen van lijnstukken 142.1 Parametervoorstelling van een lijnstuk . . . . . . . . . . . . . . . . . . . . . 142.2 Algoritme van Bresenham voor lijnstukken . . . . . . . . . . . . . . . . . . 15

3 Voorstellen van cirkels 183.1 Parametervoorstelling van een cirkel . . . . . . . . . . . . . . . . . . . . . . 183.2 Algoritme van Bresenham voor cirkels . . . . . . . . . . . . . . . . . . . . . 18

4 A±ene transformaties in het vlak 224.1 Inleiding/De¯nities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

4.1.1 Punten, vrije en gebonden vectoren . . . . . . . . . . . . . . . . . . . 224.1.2 A±ene afbeelding in het vlak . . . . . . . . . . . . . . . . . . . . . . 22

4.2 Elementaire transformaties . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.2.1 Elementaire rotatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.2.2 Elementaire translatie . . . . . . . . . . . . . . . . . . . . . . . . . . 244.2.3 Elementaire schaalverandering . . . . . . . . . . . . . . . . . . . . . 24

4.3 Willekeurige transformaties . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.3.1 Rotaties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

iv

Page 6: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

4.3.2 Translaties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.3.3 Spiegelingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.3.4 HomothetieÄen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

5 B¶ezierkrommen 315.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.2 Algoritme van de Casteljau . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.3 B¶eziermatrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.4 Kenmerken van een B¶ezierkromme . . . . . . . . . . . . . . . . . . . . . . . 36

5.4.1 Globaal karakter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.4.2 Verhoging van de orde . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.5 Aaneensluiten van B¶ezierkrommen . . . . . . . . . . . . . . . . . . . . . . . 385.6 Benadering van een cirkel a.d.h.v. een B¶ezierkromme . . . . . . . . . . . . . 42

5.6.1 Benadering via de straal van de cirkel (1e kwadrant) . . . . . . . . . 435.6.2 Benadering via de reeksontwikkeling van cos(¼t2 ) en sin(¼t2 ) (3e kwa-

drant) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.6.3 Exacte voorstelling via een rationale parametervoorstelling (2e kwa-

drant) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

6 Splines 456.1 Lineaire spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.2 Kwadratische spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.3 Kubische splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.4 Opmerkingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.5 Lokaal karakter van de kromme . . . . . . . . . . . . . . . . . . . . . . . . . 48

7 B-Splines 497.1 De¯nitie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

7.1.1 Vergelijking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507.1.2 Genormaliseerde B-Spline basisfuncties . . . . . . . . . . . . . . . . . 507.1.3 Knopenvector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

7.2 Soorten B-Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.3 Lokaal karakter van de kromme . . . . . . . . . . . . . . . . . . . . . . . . . 527.4 NURBS: Non Uniform Rational B-Splines . . . . . . . . . . . . . . . . . . . 52

7.4.1 De¯nitie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527.4.2 Eigenschappen van B-Spline basisfuncties . . . . . . . . . . . . . . . 537.4.3 Voorbeeld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

8 Meetkundige plaatsen 558.1 Statische meetkundige plaatsen . . . . . . . . . . . . . . . . . . . . . . . . . 55

8.1.1 Kegelsneden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558.1.2 "Ellipsachtige" ¯guren . . . . . . . . . . . . . . . . . . . . . . . . . . 588.1.3 B¶ezierkrommen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.1.4 Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.1.5 B-Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

v

Page 7: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

8.2 Dynamische meetkundige plaatsen . . . . . . . . . . . . . . . . . . . . . . . 608.2.1 Cycloijden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.2.2 Trochoijden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618.2.3 De quadratrix van Hippias . . . . . . . . . . . . . . . . . . . . . . . . 618.2.4 De krommen van Lissajous . . . . . . . . . . . . . . . . . . . . . . . 63

9 Opsplitsing en inkleuring van veelhoeken 649.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649.2 Algoritme van opsplitsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659.3 Inkleuring van veelhoeken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

9.3.1 Algemene veelhoeken . . . . . . . . . . . . . . . . . . . . . . . . . . . 659.3.2 Driehoeken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

9.4 Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

A Functionaliteit van de verschillende klassen 68A.1 asteroide.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68A.2 bezier.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68A.3 bezierCirkel.java en bezierCirkel2.java . . . . . . . . . . . . . . . . . . . . . 68A.4 bezierkromme.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69A.5 bezierPlakken.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69A.6 bresenhamCirkel.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69A.7 bresenhamLijnstuk.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.8 bspline.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.9 casteljau.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.10 cirkel.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.11 clipping.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71A.12 cycloijde.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71A.13 gaussJordan.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71A.14 Input.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71A.15 kegelsnede.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72A.16 kgv.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72A.17 lame.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72A.18 lijnstuk.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73A.19 lissajous.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73A.20 nurbs.java en nurbs2.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73A.21 quadratrix.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74A.22 spline.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74A.23 splitsenEnKleuren.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74A.24 transformatie.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75A.25 trochoide.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75A.26 veelhoek.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75A.27 wacht.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

vi

Page 8: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 1

Inleiding: Clipping in het vlak

In deze inleiding worden een aantal elementen van Java besproken, die doorheen de thesisworden gebruikt. Dit gebeurt aan de hand van het programma clipping.java1 (zie A.11),dat op eenvoudige wijze het proces van clipping (snoeien en wissen) in het vlak illustreert.Vooraleer over te gaan tot een bespreking van de verschillende programma-elementen,wordt in x1.1 het onderwerp clipping kort toegelicht, evenals twee basisalgoritmen dievoor deze techniek bestaan.In x1.2 worden dan enige voorgede¯nieerde gra¯sche componenten van Java besproken,die gebruikt worden voor de user-interface van de applicatie: menu's (MenuBar, Menuen MenuItem), knoppen (Button) en schuifbalken (JSlider). Bovendien worden ook eenaantal speciale structuren en methoden behandeld, die moeten toelaten om een actie vande gebruiker, zoals het bewegen van een muis of het aanklikken van een knop, op correctewijze af te handelen (WindowListener, ActionListener, MouseListener en stateChanged).Om de lezer een duidelijker beeld te geven, wordt de code2 van clipping.java hier indetail besproken. Bij de behandeling van andere klassen in volgende hoofdstukken zal ditop een veel beknopter manier gebeuren. We wensen tevens te benadrukken dat deze thesisniet tot doel heeft een alternatieve cursus Java te schrijven; van de lezer wordt dan ookeen basiskennis Java verwacht.

1.1 Algoritmes van clipping

Bij computertoepassingen zal men doorgaans de voorgestelde ¯guren willen beperken toteen afgebakend gebied van het scherm of het Windowsvenster. Zo zal men op een bladpapier ook vermijden om buiten het kader te tekenen. Het proces dat ¯guren beperkt totde gedeelten die gelegen zijn binnen een vooropgesteld kader, noemt men clipping (snoeienen wissen). We behandelen hiervoor twee algoritmen: het algoritme van Cohen-Sutherlanden het middelpuntsalgoritme.Vermits de meeste ¯guren opgebouwd worden uit lijnstukken, zal het erop aankomen vooreen gegeven lijnstuk snel en e±ciÄent te bepalen welk gedeelte ervan binnen het kader ligt.

1overal wordt er verwezen naar bestanden met de extensie .java als zijnde uitvoerbaar; in feite bevatdit bestand de broncode, welke de bedoelde klassen voortbrengt

2enkel representatieve gedeeltes

1

Page 9: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Een lijnstuk is volledig bepaald door de ligging van de twee eindpunten. Is bovendien depositie van de eindpunten met betrekking tot het kader gekend, dan kan men eenduidigbepalen welk gedeelte van het lijnstuk moet voorgesteld worden. Hiertoe gaat men te werkzoals hieronder wordt uiteengezet.Aan elk van beide eindpunten wordt een binaire code toegekend, bestaande uit vier bits,welke corresponderen met mogelijke posities t.o.v. het kader:

4 3 2 1

boven onder rechts links

Is het punt e®ectief boven (resp. onder, rechts van, links van) het kader gelegen, dan krijgtde corresponderende bit de waarde 1, anders 0.Hierbij geldt de afspraak dat de randen van het kader tot het kader behoren.Voor de positie van een lijnstuk t.o.v. het rechthoekig kader onderscheiden we de volgendedrie gevallen:

(i) als de som van alle bits (twee maal vier) nul is, d.w.z. als beide punten het bitpatroon0000 toegewezen kregen, ligt het lijnstuk zeker volledig binnen het kader en moethet dus volledig voorgesteld worden.

(ii) anderzijds, is het inproduct3 van beide bitpatronen niet nul, dan zal het lijnstuk nietmoeten afgebeeld worden, aangezien het product van de eerste (of tweede of derdeof vierde of een combinatie) bits niet nul was, wat wil zeggen dat beide bits niet nulwaren. Dit betekent dat beide eindpunten langs eenzelfde kant van het kader liggen,zodat het lijnstuk er volledig buiten valt.

(iii) in alle andere gevallen is er verder onderzoek nodig aangezien sommige delen vanhet lijnstuk (mogelijks allemaal) buiten het kader vallen.

Om in het laatste geval tot een conclusie te komen, kan men volgende methodes aanwenden:

3hier wordt het punt beschouwd als gecoÄordinatiseerd element van een vierdimensionale ruimte

2

Page 10: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

1.1.1 Het algoritme van Cohen-Sutherland

Figuur 1.1: Clipping volgens de methode van Cohen-Sutherland

Bij dit algoritme maakt men op een systematische manier gebruik van de snijpunten vande drager van het lijnstuk met de representatieve begrenzende rechten van het kader."Systematisch"betekent hierbij in de volgorde van de bits.Op die manier identi¯ceert men herhaaldelijk gedeelten van het lijnstuk die volledig buitenhet kader gelegen zijn en werkt men verder met het overblijvende stuk tot het deelprobleemherleid is tot ¶e¶en van de triviale gevallen.

1.1.2 Het middelpuntsalgoritme

Figuur 1.2: Clipping volgens de middelpuntsmethode

In plaats van de snijpunten met de randen van het kader, berekent men hier het middenvan het lijnstuk, en past het algoritme recursief toe op beide helften. Deze werkwijzewordt herhaald tot men overal ¶e¶en van de triviale gevallen bereikt heeft.

3

Page 11: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

1.1.3 Vergelijking van beide algoritmes

Beide algoritmes hebben een opvallend voordeel. Bij het eerste algoritme dient men in hetslechtste geval vier snijpunten te berekenen (i.e. O(1)), twee4 voor elk grenspunt van derechte. Bij het andere moet men, in het slechtste geval O(log n) middelpunten berekenen(in geval van een lijnstuk dat n pixels groot is). Dit zijn merkelijk meer berekeningen danbij de andere methode. Anderzijds zijn de (binaire) berekeningen wel van een eenvoudigeraard aangezien een deling door twee elke bit ¶e¶en positie naar rechts verschuift.

1.2 Gra¯sch programmeren in Java

Een klasse in Java wordt bijna altijd op eenzelfde, gestructureerde wijze opgebouwd.

1.2.1 Opbouw van de klasse

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

Vooreerst worden enkele 'packages' (bibliotheken) geijmporteerd die gra¯sche klassen enmethoden bevatten. Dit vereenvoudigt de latere 'interface'-aanroepen en beperkt ze inlengte (bv. Graphics g i.p.v. java.awt.Graphics g). Verder dient elk programma opge-bouwd te worden als klasse:

class clipping extends Frame implements ActionListener, ChangeListener

Dit fragment geeft aan dat de klasse, hier clipping, een extensie is van de bestaande klasseFrame. Deze laatste breidt op haar beurt een venster uit en erft haar mogelijke events(welke geregistreerd worden door een WindowListener, x1.2.8) over. Verder wordt hier ookaangegeven dat zowel een ActionListener (x1.2.4) als een ChangeListener (x1.2.6) later inde klasse geijmplementeerd wordt.

public static void main (String[] args)

{

new clipping();

}

Vervolgens dient er, bij het uitvoeren van het programma (java clipping), een modelopgebouwd te worden van de correcte klasse (clipping()).Hier wordt in een eerste stap een eenvoudig Windowsvenster geconstrueerd, met als hoof-ding 'Clipping in het vlak' (via super("...");) op de opgegeven locatie (setBounds(...);) enmet de nieuw aangemaakte lay-out (setLayout(new FlowLayout());). Voor deze toepassingis het wenselijk dat de grootte van het venster constant blijft; dit bekomt men d.m.v. deopdracht this.setResizable(false);.

4maar twee aangezien een punt nooit tegelijk boven en onder het kader kan liggen, of rechts en links

4

Page 12: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

clipping()

{

super("Clipping in het vlak"); // titel aanmaken

setBounds(0,0,600,700); // positie en grootte bepalen

setLayout(new FlowLayout());

this.setResizable(false);

}

1.2.2 Menu

Figuur 1.3: De gecreÄeerde lay-out en menu

Aan het hierboven geconstrueerde venster kunnen een aantal gra¯sche componenten enselectiemethoden worden toegevoegd. Een eerste mogelijkheid is het creÄeren van eenmenu, dat de gebruiker hier toelaat te kiezen tussen de beide geijmplementeerde algo-ritmes. Vanzelfsprekend dient het menu, evenals het venster zelf, gede¯nieerd te wordenin de constructor van de klasse.In tegenstelling tot andere selectiemethoden, is een menu opgebouwd uit verschillendeonderdelen (MenuBar, Menu en MenuItem), welke in deze paragraaf besproken worden.

Eerst wordt een nieuwe menubalk (MenuBar) aangemaakt en aan het venster toegevoegd.

MenuBar mBar = new MenuBar();

setMenuBar(mBar);

Aan deze lege menubalk kunnen vervolgens verschillende Menu's worden toegewezen. Voordeze toepassing is echter slechts ¶e¶en Menu vereist.

Menu meth = new Menu("Methode");

mBar.add(meth);

Nu worden ¶e¶en voor ¶e¶en de MenuItems gecreÄeerd en toegevoegd aan het enige Menu meth.

cos = new MenuItem("Cohen-Sutherland");

mpm = new MenuItem("de middelpuntsmethode");

meth.add(cos);

meth.add(mpm);

5

Page 13: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

cos.addActionListener(this);

mpm.addActionListener(this);

Tot slot wordt elk MenuItem voorzien van een ActionListener, teneinde een mogelijkeactie van de gebruiker - het selecteren van ¶e¶en van beide geijmplementeerde algoritmen - teregistreren en correct af te handelen. De code hiervoor introduceren we voorlopig zonderverdere uitleg; het onderwerp wordt besproken in x1.2.4.Op analoge wijze kan men ook Menu's (dit zijn dan submenu's) aan de Menu's toevoegen,die op hun beurt ook van Menu(Item)s kunnen worden voorzien.

1.2.3 Knop

Figuur 1.4: De toegevoegde knoppen

Behalve het reeds gecreÄeerde Menu, zullen we ook twee knoppen aan de lay-out van hetvenster toevoegen.

Button tKnop = new Button("Teken het lijnstuk");

tKnop.addActionListener(this); // verwijst naar actionPerformed()

add(tKnop);

Button wKnop = new Button("Wis het lijnstuk");

wKnop.addActionListener(this); // verwijst naar actionPerformed()

add(wKnop);

De eerste regel in bovenstaand codefragment creÄeert een dergelijke knop (Button). In detweede regel wordt daaraan een actionListener toegevoegd, om dan tot slot, in de derderegel, de knop (tKnop) aan de lay-out toe te voegen. Op analoge manier wordt ook deandere knop (wKnop) aan de lay-out toegevoegd.De actie die moet worden uitgevoerd bij het indrukken van de knop tKnop, is het tekenenvan een zwarte lijn van begin- tot eindpunt, om vervolgens de gekozen methode voorclipping toe te passen (voor de bespreking van de methoden, resp. code: zie x1.1.1 enx1.1.2, resp. x1.2.9 en x1.2.10). Wanneer de gebruiker geen keuze heeft gemaakt, wordtstandaard het algoritme van Cohen-Sutherland uitgevoerd. Na het beÄeindigen van hetclippingproces kan de gebruiker beslissen het lijnstuk te wissen door de tweede knop,wKnop, in te drukken. Hierdoor wordt de methode wisScherm() opgestart, die op haarbeurt de methodes delRoster(), initRoster() en drawRoster() aanroept. Dit correspondeertmet het feit dat, om het lijnstuk te wissen, alles in het scherm wordt gewist (delRoster()),waarna wat teveel gewist is, opnieuw wordt getekend (initRoster() en drawRoster()).

public void wisScherm()

{

6

Page 14: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

cPunt = 0;

delRoster();

getekend = 0;

}

public void delRoster()

{

g.setColor(Color.white);

g.fillRect(0,121,600,700);

initRoster();

}

public void initRoster()

{

g.setColor(Color.red);

drawRoster();

}

public void drawRoster()

{

g.drawLine(sPos,121,sPos,750);

g.drawLine(0,121+sPos,600,121+sPos);

g.drawLine(600-sPos,121,600-sPos,750);

g.drawLine(0,700-sPos,600,700-sPos);

}

In dit codefragment worden bovendien de variabelen cPunt en getekend op nul gezet, watneerkomt op het verwijderen van de eindpunten uit het geheugen en het herbevestigen vande initiÄele toestand, waarbij nog niets is getekend.

1.2.4 ActionListener

Zoals daarnet gezien, kan (en dient) een ActionListener (te) worden geplaatst op eenMenuItem of een knop (Button). Het aanklikken van een knop of het selecteren van eenMenuItem genereert immers een ActionEvent, wat aan het programma wordt doorgegeven.In het programma moet dan ook code voorzien worden om deze events af te handelen.Dit gebeurt door het implementeren van een ActionListenerinterface, welke ¶e¶en enkelemethode actionPerformed bevat die automatisch wordt opgeroepen wanneer een eventontstaat.

public void actionPerformed(ActionEvent e)

{

if (e.getSource() instanceof MenuItem)

{

if (e.getSource() == cos)

cMet = 0;

7

Page 15: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

else

cMet = 1;

}

else

{

if (e.getActionCommand().equals("Wis het lijnstuk"))

{

wisScherm();

}

if (e.getActionCommand().equals("Teken het lijnstuk"))

{

pauze = 1;

if (cPunt != 2)

return;

g.setColor(Color.black);

g.drawLine(punt[0][0],punt[0][1], punt[1][0],punt[1][1]);

if (cMet == 0)

cohenSutherland();

else

middelPuntsMethode();

getekend = 1;

}

}

}

Hier wordt eerst nagekeken of de actie veroorzaakt is door een MenuItem. Indien dit hetgeval is, wordt de gekozen methode als de te gebruiken methode voor clipping aangeduid(de keuze wordt opgeslaan in cMet (staat voor CurrentMEThod)). In het andere gevalwordt de actie veroorzaakt door ¶e¶en van de knoppen (Button), welke reeds besprokenwerden in de vorige paragraaf.

1.2.5 Schuifbalk

Als derde selectiemethode in deze, en andere, klassen is er de schuifbalk (JSlider), die degebruiker toelaat discrete waarden in te stellen tussen het minimum en het maximum vandeze balk.

JSlider hSchuifbalk = new JSlider(JSlider.HORIZONTAL, 0, 280, sPos);

// parameters zijn richting, min, max en default

hSchuifbalk.setMajorTickSpacing(40); // grote streepjes

hSchuifbalk.setMinorTickSpacing(10); // kleine streepjes

hSchuifbalk.setPaintTicks(true); // "streepjes tekenen" aanzetten

hSchuifbalk.setPaintLabels(true); // "getallen tekenen" aanzetten

hSchuifbalk.setBorder(BorderFactory.createEmptyBorder(0,0,10,0));

add(hSchuifbalk);

hSchuifbalk.addChangeListener(this); // verwijst naar stateChanged()

8

Page 16: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

In dit stukje code worden eerst zijn karakteristieken bepaald :

² minimumwaarde 0

² maximumwaarde 280

² beginwaarde sPos (wat aangeeft hoever de randen van het kader van de randen vanhet venster verwijderd liggen)

² op ieder veertigtal een streep

² op ieder tiental een kleine streep

² een soort afgrenzing als rand

Figuur 1.5: Schuifbalk

Tot slot wordt de schuifbalk toegevoegd aan de lay-out en krijgt hij een ChangeListener

toegewezen om toestandsveranderingen te registreren en door te geven.

1.2.6 ChangeListener

Een ChangeListener kan door vele objecten worden gebruikt, maar in ons geval zullen weer enkel ¶e¶en gebruiken voor de gecreÄeerde schuifbalk. De methode stateChanged() zal danworden aangeroepen telkens de gebruiker iets aan de toestand van het object verandert,i.e. de wijzer op de balk verschuift.

public void stateChanged(ChangeEvent e)

{

delRoster();

if ((sPos = ((JSlider)e.getSource()).getValue()) < 5)

sPos = 5;

initRoster();

g.setColor(Color.black);

for (int i = 0; i < cPunt; i++)

g.drawOval(punt[i][0] - 2, punt[i][1] - 2, 4, 4);

if (getekend == 0) return;

pauze = 0;

if (cMet == 0)

cohenSutherland();

9

Page 17: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

else

middelPuntsMethode();

}

Ook hier wordt i.p.v. enkel de wijzigingen aan te brengen, alles gewist (delRoster()) enuitsluitend het benodigde wordt opnieuw getekend (initRoster(), g.drawOval() en eventueelcohenSutherland() of middelPuntsMethode()).

1.2.7 MouseListener

In wat volgt wordt uiteengezet wat de muis bereiken kan als er naar hem geluisterd wordt.In deze toepassing dient de gebruiker m.b.v. de muis begin- en eindpunt van het te tekenenlijnstuk in het venster aan te geven.

addMouseListener(

new MouseAdapter()

{

public void mousePressed(MouseEvent e)

{

g.setColor(Color.black);

if (init == 0)

{

g.drawLine(0,120,600,120);

initRoster();

init = 1;

return;

}

if (cPunt > 1)

return;

punt[cPunt][0] = e.getX();

if ((punt[cPunt][1] = e.getY()) < 125) punt[cPunt][1] = 125;

g.drawOval(punt[cPunt][0] - 2, punt[cPunt][1] - 2, 4, 4);

cPunt++;

}

}

);

In bovenstaand stukje code wordt eerst en vooral het kader geijnitialiseerd, tenminste,wanneer de veranderlijke init nog de waarde 0 heeft. Eens de initialisatie voltooid, krijgtdeze variabele de waarde 1. Daarna wordt op de door de gebruiker aangeklikte plaatsen(mousePressed) een punt getekend. Hierbij wordt steeds nagegaan of minstens ¶e¶en eind-punt van het lijnstuk nog onbekend is. Eens twee punten zijn ingegeven, kan de gebruikerniets meer aanvangen door gewoon de muis in te drukken5. Andere Events, waar eenMouseListener eventueel naar dient te luisteren, zijn :

5tenzij op speci¯eke plaatsen, zoals knoppen en schuifbalk, of door een selectie te maken uit het menu

10

Page 18: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

² mouseClicked

² mouseEntered

² mouseExited

² mouseReleased

Maar aangezien deze hier niet gebruikt worden, zullen we ze ook niet bespreken. Hetvolstaat steeds om enkel die events en adapters te schrijven die benodigd zijn in hetprogramma. Aangezien ze standaard als void gede¯nieerd zijn, bestaan ze maar doen zeniets. Men dient dus de functies die wel iets moeten doen te 'her'schrijven.

1.2.8 WindowListener

De volledige lay-out van het gecreÄeerde venster is nu voltooid. Het kan evenwel nog niet opde gebruikelijke wijze worden afgesloten. Een laatste listener dient bijgevolg te luisterennaar wat er gebeurt in het venster (window) waarin gewerkt wordt en herschrijft hiertoe debenodigde events (of: herschrijft die events die nodig zijn om een optimale functionaliteitte verkrijgen):

addWindowListener(

new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

}

);

windowClosing is ¶e¶en van die mogelijke events die kunnen optreden, en beschrijft water dient te gebeuren als de gebruiker de klasse tracht af te sluiten (door b.v. op 'x'rechtsboven in het Windowsvenster te drukken). Wat hier (en elders) e®ectief gebeurt, isdat alle bezigheden worden stopgezet.

1.2.9 Implementatie van het algoritme van Cohen-Sutherland

public void cohenSutherland()

{

cohenSutherland(punt[0][0], punt[0][1], punt[1][0], punt[1][1]);

}

public void cohenSutherland(int x1, int y1, int x2, int y2)

{

int BORreL[][] = {{0,0,0,0},{0,0,0,0}};

if (pauze == 1) new wacht(1000);

11

Page 19: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

if (y1 < 120+sPos) BORreL[0][0] = 1;

if (y1 > 700-sPos) BORreL[0][1] = 1;

if (x1 > 600-sPos) BORreL[0][2] = 1;

if (x1 < sPos) BORreL[0][3] = 1;

if (y2 < 120+sPos) BORreL[1][0] = 1;

if (y2 > 700-sPos) BORreL[1][1] = 1;

if (x2 > 600-sPos) BORreL[1][2] = 1;

if (x2 < sPos) BORreL[1][3] = 1;

...

}

Vooraleer de methode cohenSutherland() wordt aangeroepen, dient de positie van hetkader (i.e. het zichtbare gedeelte) binnen het Windowsvenster gekend te zijn. In dezetoepassing bevinden de vier randen van het kader zich op exact sPos pixels (aangegevendoor de schuifbalk) van de corresponderende randen van het venster.Vervolgens wordt aan elk van beide eindpunten van het te clippen lijnstuk een binaire4-bitscode toegekend. Deze code geeft de positie aan van het betre®ende punt t.o.v. hetkader en wordt opgebouwd zoals beschreven in x1.1.1.We geven deze code de naam BORreL, wat meteen een mnemotechnisch middeltje is voorde volgorde waarin de randen worden doorlopen (Boven, Onder, Rechts, Links).Aan de hand van de twee bekomen codes wordt dan de "zichtbaarheid" van het lijnstukonderzocht.

int som = 0, inprodukt = 0;

for (int i = 0; i < 4; i++)

{

som += BORreL[0][i] + BORreL[1][i];

inprodukt += BORreL[0][i] * BORreL[1][i];

}

if (som == 0)

// triviaal zichtbaar

{

g.setColor(Color.blue);

teken (x1, y1, x2, y2);

putDot(x1,y1);

putDot(x2,y2);

return;

}

if (inprodukt != 0)

// triviaal onzichtbaar

{

g.setColor(Color.green);

teken (x1, y1, x2, y2);

putDot(x1,y1);

putDot(x2,y2);

return;

12

Page 20: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

}

teken(x1,y1,x2,y2) tekent een lijn van (x1,y1) naar (x2,y2). M.b.v. putDot() duiden weextra duidelijk aan welke punten ergens als eindpunt van een lijnstuk gebruikt zijn om heteindresultaat te bereiken (d.i. representatief voor het benodigde rekenwerk).

if (BORreL[0][0] == 1)

{

if (y2 == sPos + 120)

// als het punt op de rand van het gebied ligt

{

g.setColor(Color.green);

teken(x1, y1, x2, y2);

putDot(x1,y1);

putDot(x2,y2);

return;

}

int yNieuw = 120+sPos;

int xNieuw = (int)(((float)(x2-x1)*(yNieuw-y1))/(y2-y1)+x1);

cohenSutherland(x1,y1,xNieuw,yNieuw);

cohenSutherland(x2,y2,xNieuw,yNieuw);

return;

}

Als een punt (hier het eerste punt) zich boven het venster bevindt, wordt getest of hetandere punt zich op de bovenste rand bevindt. Als dit zo is, wordt de onzichtbare, groene,lijn getekend. In het andere geval wordt de doorsnede bepaald van het lijnstuk met dierand van het venster, om dan het algoritme toe te passen op de lijnstukken (Beginpunt,Snijpunt) en (Eindpunt, Snijpunt).Analoog worden de overige zeven bits getest.

1.2.10 Implementatie van de middelpuntsmethode

De locatiebits (BORreL) worden op identieke wijze berekend als bij de methode van Cohen-Sutherland. De triviale (on)zichtbaarheid wordt bijgevolg ook zoals voorheen bepaald. Detests of het ene punt zich buiten het venster bevindt en het andere op de rand aan dezelfdekant verlopen eveneens identiek. I.p.v. het snijpunt met het kader wordt hier het middenvan het lijnstuk berekend, om vervolgens recursief het algoritme toe te passen op beidehelften.

int xNieuw = (int)((x1+x2)/2);

int yNieuw = (int)((y1+y2)/2);

middelPuntsMethode(x1,y1,xNieuw,yNieuw);

middelPuntsMethode(x2,y2,xNieuw,yNieuw);

13

Page 21: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 2

Voorstellen van lijnstukken

In vorig hoofdstuk werd clipping in het vlak besproken, meer bepaald het clippen vaneen lijnstuk. Op dat moment werd enkel aandacht besteed aan het clipping-proces alsdusdanig, terwijl niet werd ingegaan op het eigenlijke algoritme om lijnstukken op hetbeeldscherm weer te geven.Daarom zullen we nu als eerste vlakke ¯guur het lijnstuk bespreken, alsook het achterliggendalgoritme dat toelaat te bepalen welke pixels moeten geselecteerd worden voor een visueeloptimale voorstelling van het lijnstuk op het scherm.

2.1 Parametervoorstelling van een lijnstuk

Een lijnstuk is een deel van een rechte, begrensd door twee punten. Het wordt wiskundigvoorgesteld door de parametervoorstelling

P (t) = (1¡ t):punt0 + t:punt1; t 2 [0; 1] (2.1)

Soms zal men punt0 het beginpunt van het lijnstuk noemen en punt1 het eindpunt, hoewelmen op die manier (met het invoeren van een oriÄentatie) in feite een vector de¯nieert.Om in Java een lijnstuk te tekenen, dient men de volgende regel in de broncode in tegeven:

g.drawLine( punt0[0], punt0[1], punt1[0], punt1[1]);

Dit stukje code tekent een lijn van punt0 tot punt1. Merk op dat hier eigenlijk een vectorwordt getekend, maar eens getekend is niet langer waar te nemen welk punt als begin-of eindpunt diende. We gaan nu na welk algoritme aan de basis ligt van dit eenvoudigcommando.Voor lijnstukken evenwijdig aan de X- of Y-as ligt het voor de hand welke pixels dienengekozen te worden. Ook voor lijnstukken evenwijdig met de eerste of tweede bissectrice,is de keuze evident. Voor de andere gevallen gebruiken we het algoritme van Bresenhamvoor lijnstukken1, dat hieronder wordt besproken.

1er bestaat ook een algoritme van Bresenham voor cirkels (x3.2)

14

Page 22: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

2.2 Algoritme van Bresenham voor lijnstukken

Stel dat we het lijnstuk tussen de punten (x1; y1) en (x2; y2) willen voorstellen, waarbij weaannemen dat ¢x(= x2 ¡ x1) > ¢y(= y2 ¡ y1) > 0. In dat geval zal voor elke natuurlijkewaarde van x tussen x1 en x2 een y-waarde moeten gekozen worden die ofwel gelijk is aande voorgaande, ofwel ¶e¶en eenheid groter.We vertrekken hierbij van de cartesische vergelijking van de rechte die het lijnstuk draagt,nl.

y = y1 +y2 ¡ y1

x2 ¡ x1(x¡ x1) = y1 +

¢y

¢x(x¡ x1)

Aangezien ¢x > ¢y moeten we zeker de x-coÄordinaat incrementeren wanneer we devolgende pixel tekenen. Voor x = x1 + 1 zal het punt (x1 + 1; y1 + ¢y

¢x) tot de rechtebehoren. We wensen nu na te gaan welke pixel dit punt het best benadert. Laten webeide pixels beschouwen die in aanmerking komen:

² ofwel dient het punt (x1 + 1; y1 + 1) gekozen te worden, waarbij de fout op de y-coÄordinaat dan 1¡ ¢y

¢x is.

² ofwel krijgen we een correctere oplossing als we de y-coÄordinaat niet veranderen;door (x1 + 1; y1) te kiezen bedraagt de fout ¢y

¢x .

Hieruit mag blijken dat de y-coÄordinaat niet dient geijncrementeerd te worden als ¢y¢x < 0:5.

Het volgende, exacte, punt heeft als coÄordinaten (x1 + 1; y1 + 2 ¢y¢x). Indien geldt dat

¢y¢x < 0:5, dan kan 2 ¢y

¢x ¸ 0:5 en leiden tot een increment van de y-coÄordinaat van degetekende pixel - deze wordt dan y1 + 1. Deze y-coÄordinaat dient geijncrementeerd teworden telkens n¢y

¢x (grootte van het totale increment bij de ne pixel2) de kaap van 0.5 (1.5, 2.5, ...) bereikt of overschrijdt.Om niet elke keer de volledige berekening te moeten maken, introduceren we een variabelef, geassocieerd met de gemaakte fout, welke op de waarde 0 -uiteraard- geijnitialiseerdwordt. Deze variabele wordt bij elke stap verhoogd met ¢x

¢y . Telkens wanneer f minstens0:5 groot is, zullen we de x-coÄordinaat incrementeren en f decrementeren, elk met ¶e¶eneenheid. Dit gaat door tot het eindpunt bereikt is.In de andere octanten (¢y > ¢x > 0 (2e octant) of ¡¢x > ¢y > 0 (5e octant) of ...) dientmen soms negatieve incrementen te gebruiken of de y-coÄordinaat steeds te incrementerenen te testen of dit ook bij de x-coÄordinaat moet gebeuren. Van de richtingscoÄe±ciÄentbeschouwen we voor de eenvoud steeds de absolute waarde (j¢y¢x j i.p.v. ¢y

¢x). Dit levertgeen problemen zolang we erop letten dat we de juiste incrementen gebruiken.

Voorbeeld

Neem aan dat we het lijnstuk tussen de punten (0,0) en (3,-10) willen voorstellen. Vermitshier j¢yj (=10) groter is dan j¢xj (=3), zal voor elke natuurlijke waarde van y tussen0 en -10 een x-waarde moeten gekozen worden die ofwel gelijk is aan de voorgaandeofwel ¶e¶en eenheid groter. De y-coÄordinaat dient in elke stap negatief geijncrementeerd,

2(x1; y1) fungeert als 0e pixel en als referentiewaarde (increment is hier 0)

15

Page 23: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

gedecrementeerd, te worden. We vertrekken hierbij van het punt (0,0) en van de cartesischevergelijking van de rechte die het lijnstuk draagt, nl.

x = ¡ 3

10y

Voor y=-1 zal het punt ( 310 ;¡1) tot de rechte behoren. We wensen nu na te gaan welke

de pixel is die dit punt het best benadert.Dit geeft als startwaarden het punt (0,0) en de variabele f gelijk aan 0 (waarde van de ini-tialisatie). In de eerste stap wordt de y-coÄordinaat met 1 verhoogd en f met 0.3. Aangeziende huidige waarde van f (0.3) kleiner is dan 0.5, besluiten wij dus de x-coÄordinaat onge-wijzigd te laten. We krijgen dan het punt (0,1) als volgende punt (of pixel) van het(benaderde) lijnstuk. In een volgende stap wordt opnieuw de y-coÄordinaat verhoogd met-1, tot -2, en f met 0.3, tot 0.6. Hier is de waarde van f w¶el groter dan 0.5 waardoorenerzijds de x-coÄordinaat met 1 vermeerderd dient te worden en anderzijds f met 1 ver-minderd. Dit resulteert in het punt (1,2) als volgende pixel en -0.4 als waarde van f. Alsvolgende punt komt dan (1,3) met f = -0.1. Zo dienen nog 7 stappen gezet te worden omuiteindelijk te eindigen in het punt (3,10).

Figuur 2.1: Het lijnstuk uit het voorbeeld

In Java (zie A.7 en A.18) kan dit als volgt worden geprogrammeerd :

class bresenhamLijnstuk

{

bresenhamLijnstuk(int bP[], int eP[], boolean weg[])

{

int len = ((Math.abs(bP[0] -eP[0]) >

Math.abs(bP[1] -eP[1]))?

(Math.abs(bP[0] -eP[0])):

(Math.abs(bP[1] -eP[1])));

// weg is een array van booleans met lengte len

16

Page 24: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

// true wil zeggen dat beide coordinaten toe-(af)nemen in de i-e stap

// false dat enkel de 'hoofd'coordinaat verandert

// (hoofdcoordinaat is die coordinaat waar het verschil

// tussen begin- en eindpunt het grootst is)

// bv (0,0) -> (3,0) geeft (false,false,false)

// (0,0) -> (3,3) geeft (true, true, true)

int coord = 1;

if (len == Math.abs(bP[0] -eP[0]))

coord = 0;

double rico = Math.abs((double)

(Math.abs(bP[1-coord] -eP[1-coord]))/

(Math.abs(bP[ coord] -eP[ coord])));

double helling = 0.;

for (int i = 0; i < len; i++)

{

weg[i] = false;

if ((helling += rico) >= 0.5)

{

helling--;

weg[i] = true;

}

}

}

}

Deze klasse heeft twee punten nodig als invoer en geeft als uitvoer weer welke weg dientgevolgd te worden om het lijnstuk tussen die twee punten voor te stellen. Deze voorstellingis opgeslagen in array weg. Na uitvoering van de klasse kan het aanroepende programmamet deze gegevens handelen naar willekeur, bv. het lijnstuk tekenen.

17

Page 25: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 3

Voorstellen van cirkels

Een andere basis¯guur in de wiskunde is de cirkel. Ook hier is het niet triviaal welkepunten (pixels) gebruikt dienen te worden om de cirkel zo goed mogelijk te benaderen ophet scherm. We zullen ons hiertoe opnieuw baseren op een algoritme van Bresenham.

3.1 Parametervoorstelling van een cirkel

Een cirkel is de meetkundige plaats van de punten die op een vaste afstand r liggen vaneen gegeven punt a (a1; a2).Het punt a is het centrum van de cirkel, de afstand r de straal. Een parametervoorstellingervan wordt gegeven door

(x(t) = a1 + r cos(t)

y(t) = a2 + r sin(t)t 2 [0; 2¼[

De cirkel is een gesloten kromme, met lengte 2¼r. Men hoede zich ervoor het begrip cirkelte verwarren met het begrip schijf waarbij alle punten worden beschouwd die op hoogstens

de afstand r gelegen zijn. De schijf heeft een oppervlakte ¼r2 en een omtrek 2¼r (de lengtevan de "buitenste" cirkel).

3.2 Algoritme van Bresenham voor cirkels

Als eerste punt nemen wij (r,0), welk enerzijds een punt is op de omtrek van de cirkel enanderzijds ook exact voor te stellen is, aangezien het samenvalt met een pixel (natuurlijkecoÄordinaten). Wordt de cirkel in tegenwijzerzin doorlopen, dan weten we dat de tweenaburige punten die in aanmerking komen voor afbeelding, de punten A(r-1,1) en B(r,1)zijn, respectievelijk linksboven en boven het reeds voorgestelde punt (r,0).Beschouw nu de cartesische vergelijking van de cirkel, nl.

x2 + y2 = r2

We weten dat het teken van de uitdrukking e = s2 + t2 ¡ r2 de ligging aangeeft van hetpunt met coÄordinaten (s,t) t.o.v. de cirkel. We berekenen derhalve deze uitdrukking voor

18

Page 26: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

de punten A en B en noemen de respectievelijke resultaten eA en eB (doorgaans beideverschillend van 0). Stellen we e = eA + eB dan zal het teken van e toelaten te beslissenwelk van de twee punten moet gekozen worden.

² Liggen beide punten binnen de cirkel, dan is e < 0 (vermits eA < 0 ¶en eB < 0) endan is klaarblijkelijk het punt B de beste keuze

² Liggen beide punten buiten de cirkel, dan is e > 0 (vermits eA > 0 en eB > 0) endan is het punt A de beste keuze

² Ligt de werkelijke cirkel tussen A en B, dan geldt uiteraard eA < 0 < eB. Er kunnenzich drie gevallen voordoen :

* e < 0: in dit geval is jeAj > jeBj, zodat het punt B de beste benadering vormt

* e > 0: in dit geval is jeAj < jeBj, zodat het punt A de beste benadering vormt

* e = 0 (of jeAj = jeBj): beide punten liggen even ver van de cirkel; in dit gevalkiezen wij het punt het verst verwijderd van het centrum van de cirkel, hier: B

We concluderen dat men het punt A dient te kiezen als volgend punt als e > 0 en het puntB als volgend punt wanneer e < 0 (en tevens als e = 0).

Figuur 3.1: Een cirkel, geconstrueerd a.d.h.v. het algoritme van Bresenham

Voorbeeld

Nemen wij als voorbeeld een cirkel met als centrum de oorsprong en straal 10. Dan geeftdit (10,0) als startpunt. Bij de berekening van het tweede punt krijgen wij enerzijdseA = 92 +12¡102 = ¡18 en eB = 102 +12¡102 = 1. Volgens ons vooropgesteld algoritmezou het punt (10,1) ons volgend punt zijn. Berekenen we nu het punt op de cirkel met alsy-coÄordinaat 1, dan kunnen wij controleren of (10,1) e®ectief de beste benadering is.

19

Page 27: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

x2 + 12 = 102 , x =p

(100¡ 1), x =p

(99)) x ¼ 9:9499

Hieruit mag blijken dat (10,1) inderdaad de betere benadering is. Als wij nu het tweedepunt, met y-coÄordinaat 2, willen tekenen, is er opnieuw de keuze tussen 9 en 10 als x-coÄordinaat. Berekenen we nu opnieuw eA en eB,

eA = 92 + 22 ¡ 102 = ¡15 en eB = 102 + 22 ¡ 102 = 4

dan blijkt dat opnieuw 10 als x-coÄordinaat de beste benadering oplevert. In een volgendestap blijkt dit ook zo te zijn (het punt (10,3)), doch in de daarop volgende stap dient dex-coÄordinaat wel gewijzigd te worden.

eA = 92 + 42 ¡ 102 = ¡3 en eB = 102 + 42 ¡ 102 = 16

Om dit in Java (zie A.6) te implementeren, kunnen we ons, wegens symmetrie, beperkentot ¶e¶en octant. Hierbij gaan we na welke pixels in het gekozen octant moeten geactiveerdworden.Merk op dat het programma bresenhamCirkel.java (A.6) niet uitsluitend zal aangewendworden als we cirkels willen voorstellen. We hebben de methode immers uitgebreid totkrommen met cartesische vergelijking

jxjn + jyjn = rn

Dit is de klasse van de "super-ellipsen"(x8.1.2). Binnen deze klasse vinden we klaarblijke-lijk de cirkel terug voor n = 2.

class bresenhamCirkel

{

bresenhamCirkel(double straal, boolean weg[])

{

new bresenhamCirkel( straal, weg, 2);

}

bresenhamCirkel(double straal, boolean weg[], int n)

{

int relPunt[] = {(int)(straal+0.5),0};

// punt met als coordinaten (straal,0)

int lusLengte = (int)(straal*Math.pow(0.5,1.0/n));

for (int i = 0; ((i < lusLengte)&&(relPunt[0]>relPunt[1])); i++)

{

weg[i] = false;

relPunt[1]++;

double e1 = Math.pow(relPunt[0] ,n)

+Math.pow(relPunt[1] ,n)

20

Page 28: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

-Math.pow(straal,n),

e2 = Math.pow(relPunt[0]-1,n)

+Math.pow(relPunt[1] ,n)

-Math.pow(straal,n);

if (e1+e2>0)

{

relPunt[0]--;

weg[i] = true;

}

}

}

}

Opmerking :

Uiteraard kan men een cirkel ook benaderen door een ingeschreven regelmatige n-hoek,met n voldoende groot. Het probleem wordt dan herleid tot het voorstellen van (een grootaantal) lijnstukken.

21

Page 29: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 4

A±ene transformaties in het vlak

Vooreerst herhalen we enkele begrippen en de¯nities.

4.1 Inleiding/De¯nities

4.1.1 Punten, vrije en gebonden vectoren

Het vlak wordt beschouwd als een verzameling van (oneindig veel) punten: p1; p2; p3; :::Als men zo twee punten beschouwt, een koppel, en men geeft deze een ordening, dan krijgtmen een (vrije) vector, bv. de vector (p1; p2), couranter genoteerd als ¡¡!p1p2. Kiest men alseerste punt de oorsprong, dan krijgt men de vector ¡!op2 of kortweg ¡!p2 . Dit noemt men eengebonden vector. De vector ¡¡!p1p2 is eigenlijk het lijnstuk jp1p2j voorzien van een oriÄentatieof "zin", nl. van p1 naar p2. Het lijnstuk dat de vector draagt, kan men voorstellen aande hand van de vergelijking (2.1)

(1¡ t):p1 + t:p2 (t 2 [0; 1])

Dit is een zogenaamde barycentrische combinatie van punten: een lineaire combinatiewaarbij de som der coÄe±ciÄenten identisch 1 is. Inderdaad geldt er dat (1¡ t) + t ´ 11.

4.1.2 A±ene afbeelding in het vlak

We beschouwen afbeeldingen van de verzameling der punten op zichzelf.Een afbeelding wordt a±en genoemd als zij barycentriciteit bewaart, d.w.z.

'

ÃX

i

®ipi

!=X

i

®i'(pi) (X

i

®i = 1)

We spreken van een reguliere afbeelding indien het vlak in het volledige vlak wordt afge-beeld en de transformatie omkeerbaar is ('¡1). In de andere gevallen, zoals b.v. bij denulafbeelding, wordt de transformatie singulier genoemd.Elke reguliere a±ene transformatie heeft de volgende eigenschappen:

1hier betreft het zelfs een convexe combinatie, vermits t 2 [0; 1]: we beschouwen enkel de punten tussenp1 en p2

22

Page 30: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

² een rechte wordt in een rechte getransformeerd

² evenwijdigheid blijft behouden

² afstanden en hoeken blijven niet behouden

² een veelhoek wordt in een veelhoek getransformeerd

Al deze eigenschappen (behalve de derde) volgen uit het behoud van barycentriciteit.De laatste eigenschap, gecombineerd met de tweede, heeft tot gevolg dat convexiteit vaneen ¯guur behouden blijft. Een transformatie kan de beschouwde ¯guur vervormen: eenrechthoek wordt een parallellogram, maar een parallellogram blijft een parallellogram.Er zijn vele (a±ene) transformaties mogelijk in het vlak. We zullen ons toespitsen op devolgende types:

² rotaties

² translaties

² spiegelingen

² homothetieÄen

waarin telkens nog ¶e¶en of meerdere parameters voorkomen. Bijvoorbeeld dient men bijeen rotatie nog het punt te speci¯Äeren waarrond geroteerd dient te worden (het centrum),evenals de draaiingshoek.Merk op dat elke a±ene transformatie kan herleid worden tot de samenstelling van ele-mentaire transformaties (translatie, rotatie of schaalverandering).

4.2 Elementaire transformaties

4.2.1 Elementaire rotatie

Een elementaire rotatie, d.w.z. rotatie rond de oorsprong, over een hoek µ is te schrijvenals: (

x0 = cos(µ)x¡ sin(µ)y

y0 = sin(µ)x+ cos(µ)y

In matrixvorm neergeschreven geeft dit:

"x0

y0

#=

"cos(µ) ¡sin(µ)

sin(µ) cos(µ)

# "x

y

#

Als wij nu overgaan op homogene coÄordinaten, krijgen wij als matrices:

264x0

y0

1

375 =

264cos(µ) ¡sin(µ) 0

sin(µ) cos(µ) 0

0 0 1

375

264x

y

1

375

23

Page 31: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

4.2.2 Elementaire translatie

Een elementaire translatie over de translatievector t is te schrijven als:

(x0 = x+ txy0 = y + ty

In matrixvorm kan dit uitgedrukt worden als:

"x0

y0

#=

"1 0

0 1

# "x

y

#+

"txty

#

of ook, mits invoering van homogene coÄordinaten2:

264x0

y0

1

375 =

264

1 0 tx0 1 ty0 0 1

375

264x

y

1

375

4.2.3 Elementaire schaalverandering

(x0 = sxx

y0 = syy

In matrixvorm neergeschreven krijgen we:

"x0

y0

#=

"sx 0

0 sy

# "x

y

#

Na invoering van homogene coÄordinaten:

264x0

y0

1

375 =

264sx 0 0

0 sy 0

0 0 1

375

264x

y

1

375

4.3 Willekeurige transformaties

Elke willekeurige transformatie is te schrijven als een samenstelling van een rotatie, eenschaalverandering, (opnieuw) een rotatie en een translatie: Pnieuw = T:R2:S:R1:Poud. Dewaarden van de parameters die hiervoor gebruikt dienen te worden, zijn soms het resultaatvan heel wat rekenwerk. Een andere samenstelling, vaak met meer translaties, ligt welvoor de hand. Deze zullen wij dan via eigenschappen van transformaties3 omvormen totde beoogde vorm.

2hier levert dit geen direct voordeel, maar als wij later elementaire transformaties samenstellen, zal dezewerkwijze een eenvoudiger matrixformalisme opleveren

3Translatie en rotatie, resp. schaalverandering, zijn pseudo-commuteerbaar (d.w.z. commuteerbaar mitsaanpassing van de coÄordinaten)

24

Page 32: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

4.3.1 Rotaties

Een rotatie om een willekeurig punt is de samenstelling van een translatie van het centrumvan de rotatie naar de oorsprong, een rotatie rond de oorsprong om dezelfde hoek en eentranslatie die de oorsprong terug afbeeldt op het oorspronkelijk centrum.

Figuur 4.1: rotatie over ¼2 om een willekeurig punt

Dit is als volgt te schrijven in matrixvorm:

Pnieuw = TranslterugRotoorsprongTranslheenPoud = RotwillPoud

met

Translterug =

264

1 0 cx0 1 cy0 0 1

375

Rotoorsprong =

264cos(µ) ¡sin(µ) 0

sin(µ) cos(µ) 0

0 0 1

375

Translheen =

264

1 0 ¡cx0 1 ¡cy0 0 1

375

25

Page 33: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

of samengevat:

Rotwill =

264cos(µ) ¡sin(µ) cx ¡ cos(µ)cx + sin(µ)cysin(µ) cos(µ) cy ¡ sin(µ)cx ¡ cos(µ)cy

0 0 1

375

Dit is de samenstelling van:

Rotwill =

264

1 0 cx ¡ cos(µ)cx + sin(µ)cy0 1 cy ¡ sin(µ)cx ¡ cos(µ)cy0 0 1

375

264cos(µ) ¡sin(µ) 0

sin(µ) cos(µ) 0

0 0 1

375

Hier hebben wij, zoals te verwachten is, drie vrije parameters: twee voor de coÄordinatenvan het centrum en ¶e¶en voor de draaiingshoek.

4.3.2 Translaties

Een translatie wordt volledig bepaald door de kentallen van de translatievector. Dit heefttot gevolg dat elke translatie een elementaire translatie is, met twee vrije parameters.De matrix, die bij een willekeurige translatie hoort, is de volgende:

Trawill =

264

1 0 tx0 1 ty0 0 1

375

Figuur 4.2: (elementaire) translatie

4.3.3 Spiegelingen

In de vlakke meetkunde zijn er twee soorten spiegelingen: t.o.v. een punt (men spreektvan "puntspiegeling") en t.o.v. een rechte.

26

Page 34: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Spiegeling t.o.v. een rechte

Een spiegeling om een rechte wordt als volgt opgebouwd. Eerst wordt een punt van derechte verplaatst naar de oorsprong. Dan wordt de rechte geroteerd om de oorsprong totze samenvalt met de X-as. Vervolgens wordt de, reeds verplaatste en geroteerde, ¯guurgespiegeld om de X-as (dit is in feite een schaalverandering). Tot slot worden de eerderetransformaties ongedaan gemaakt door de inverse rotatie en de inverse translatie door tevoeren.In matrixvorm geeft dit:

Pnieuw = Translterug RotvanX Schaalv RotnaarX Translheen Poud = Spiegelrechte Poud

Translterug =

264

1 0 rx0 1 ry0 0 1

375

RotvanX =

264

cos(µ) sin(µ) 0

¡sin(µ) cos(µ) 0

0 0 1

375

Schaalv =

264

1 0 0

0 ¡1 0

0 0 1

375

RotnaarX

264cos(µ) ¡sin(µ) 0

sin(µ) cos(µ) 0

0 0 1

375

Translheen =

264

1 0 ¡rx0 1 ¡ry0 0 1

375

264x

y

1

375

Als men de bijbehorende matrixvermenigvuldiging uitwerkt, bekomt men Spiegelrechte:

264cos2(µ)¡ sin2(µ) ¡2cos(µ)sin(µ) (1¡ cos2(µ) + sin2(µ))rx + 2cos(µ)sin(µ)ry¡2cos(µ)sin(µ) sin2(µ)¡ cos2(µ) 2cos(µ)sin(µ)rx + (1¡ sin2(µ) + cos2(µ))ry + ry

0 0 1

375

wat equivalent is met:

264

cos(2µ) ¡2sin(2µ) (1¡ cos(2µ))rx + sin(2µ)ry¡2sin(2µ) ¡cos(2µ) sin(2µ)rx + (1 + cos(2µ))ry

0 0 1

375

Dit is de matrix die de spiegeling t.o.v. een rechte beschrijft.Vervolgens herschrijven we deze transformatie in haar standaardontbinding (m.b.v. ¶e¶entranslatie, twee rotaties en een spiegeling).

27

Page 35: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Als translatie nemen we:264

1 0 (sin2(µ)¡ cos2(µ) + 1)rx + 2cos(µ)sin(µ)ry0 1 2sin(µ)cos(µ)rx ¡ sin2(µ)ry + cos2(µ)ry + ry0 0 1

375

Voor de eerste4 rotatie: 264

cos(µ) sin(µ) 0

¡sin(µ) cos(µ) 0

0 0 1

375

Figuur 4.3: Spiegeling t.o.v. een (willekeurige) rechte

De schaalverandering is een spiegeling t.o.v. de X-as:264

1 0 0

0 ¡1 0

0 0 1

375

Bij de tweede rotatie dient men te draaien over eenzelfde hoek als voorheen, doch ditmaalin tegengestelde richting. Hierdoor krijgen we volgende matrix:

264cos(µ) ¡sin(µ) 0

sin(µ) cos(µ) 0

0 0 1

375

Door onze aanpak lijkt het alsof deze transformatie drie vrijheidsgraden heeft: twee daar-van (rx en ry) zijn de coÄordinaten van een punt op de rechte, de derde is de hoek (µ) diede rechte maakt met de X-as. In werkelijkheid zijn er echter maar twee vrijheidsgraden.Inderdaad, voor het punt (rx; ry) kan men het snijpunt met de X- of Y-as nemen.

4laatste bij de berekening

28

Page 36: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Puntspiegeling

Een puntspiegeling is een samenstelling van een translatie van het centrum naar de oor-sprong, een (speciale) schaalverandering en een translatie van de oorsprong naar het cen-trum. Als matrices geeft dat:

Pnieuw = Translterug Schaalv Translheen Poud = Spiegelpunt Poud

Translterug =

264

1 0 cx0 1 cy0 0 1

375

Schaalv =

264¡1 0 0

0 ¡1 0

0 0 1

375

Translheen =

264

1 0 cx0 1 cy0 0 1

375

Voor de totale matrix krijgt men dan:

Spiegelpunt =

264¡1 0 2cx0 ¡1 2cy0 0 1

375

wat de samenstelling is van:

264

1 0 2cx0 1 2cy0 0 1

375

264¡1 0 1

0 ¡1 1

0 0 1

375

Een puntspiegeling heeft twee vrijheidsgraden, namelijk de coÄordinaten van het centrum.

Figuur 4.4: Spiegeling t.o.v. een (willekeurig) punt

29

Page 37: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

4.3.4 HomothetieÄen

Voor een homothetie t.o.v. een willekeurig punt passen wij dezelfde methode toe als bijeen rotatie of een spiegeling rond een willekeurig punt, met name het centrum verplaatsennaar de oorsprong en terug. Dit levert het volgende resultaat op:

Pnieuw = Translterug Schaalv Translheen Poud = Homwill Poud

Homwill =

264

1 0 cx0 1 cy0 0 1

375

264s 0 0

0 s 0

0 0 1

375

264

1 0 ¡cx0 1 ¡cy0 0 1

375 =

264s 0 (1¡ s)cx0 s (1¡ s)cy0 0 1

375

De samenstelling die hier van toepassing is, kunnen we schrijven als:

Homwill =

264

1 0 (1¡ s)cx0 1 (1¡ s)cy0 0 1

375

264s 0 0

0 s 0

0 0 1

375

Deze laatste transformatie, de homothetie, heeft drie vrijheidsgraden, waarvan twee inge-vuld worden door het centrum en de derde door de factor. Merk op dat een homothetieeen speciale schaalverandering is waarbij sx = sy(= s).

Figuur 4.5: Homothetie met factor -3

Al deze transformaties kan men uitvoeren in transformatie.java (A.24). Ze worden daar-bij toegepast op een ¯guur, waarvan de coÄordinaten van de hoekpunten ingelezen wordenuit het bestand waarvan de naam als argument meegegeven werd in de opdrachtregel(¯guur.txt bevat de coÄordinaten van de letter F, gebruikt om de illustraties te maken).

30

Page 38: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 5

B¶ezierkrommen

5.1 Inleiding

In vele toepassingen zal men, uitgaande van een gegeven stel punten (controlepunten),een kromme willen bepalen die op ¶e¶en of andere manier "goed bij deze punten past". Eeneerste type van krommen die we in deze context zullen bestuderen, zijn B¶ezierkrommen1.Dit zijn benaderende krommen, wat inhoudt dat ze de controlepunten niet2 interpoleren;alleen het eerste en het laatste controlepunt zullen deel uitmaken van de kromme. De naam'B¶ezierkrommen' verwijst naar een ingenieur bij Renault, Paul B¶ezier, die in de jaren '50onderzoek deed naar krommen die bij een gegeven model passen. Tegelijkertijd werdbij CitroÄen eenzelfde soort onderzoek verricht, door Pierre de Casteljau, maar aangezienbevindingen enkel in inwendige rapporten gepubliceerd werden, is niet duidelijk wie watontdekt heeft. Het algoritme om dergelijke krommen op te bouwen, werd 'het algoritmevan de Casteljau' gedoopt.

Figuur 5.1: B¶ezierkromme

1men kan zelf B¶ezierkrommen samenstellen in bezierkromme.java, besproken in A.42uitzonderingen niet te na

31

Page 39: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.2 Algoritme van de Casteljau

In wat volgt bouwen we een B¶ezierkromme met n controlepunten P0; :::; Pn¡1 stapsgewijsop.Het vertrekpunt is de voorstelling van de punten van een lijnstuk AB als barycentrischecombinatie van de eindpunten, nl.

P (t) = (1¡ t)A+ tB

Beschouw nu de n gegeven controlepunten P0; :::; Pn¡1 en bepaal voor elke i 2 f0; :::; n¡2ghet punt Pi;i+1, bepaald door de parameterwaarde t, i.e.

Pi;i+1(t) = (1¡ t)Pi + tPi+1

Vervolgens zal men op elk der lijnstukken Pi;i+1Pi+1;i+2 (i = 0; :::; n¡3) opnieuw het puntmet parameterwaarde t beschouwen, nl.

Pi;i+1;i+2(t) = (1¡ t)Pi;i+1(t) + tPi+1;i+2(t)

Zo gaat men verder tot men uiteindelijk het punt P0;1;2;:::;n¡1(t) bekomt. De puntenP (t) ´ P0;1;:::;n¡1(t); t 2 [0; 1] bepalen een kromme, welke men de B¶ezierkromme metcontrolepunten P0; :::; Pn¡1 noemt.Deze continue voorstelling van een B¶ezierkromme wordt discreet geijmplementeerd op devolgende wijze:

class bezier

{

bezier (double t/*-waarde*/, double x[], double y[], double punt[])

{

double tmpX[] = new double[x.length];

double tmpY[] = new double[y.length];

for (int i = 0; i < x.length; i++)

{

tmpX[i] = x[i];

tmpY[i] = y[i];

}

for (int i = x.length-1; i > 0; i--)

for (int j = 0; j < i; j++)

{

tmpX[j] = (1-t)*tmpX[j] + t*tmpX[j+1];

tmpY[j] = (1-t)*tmpY[j] + t*tmpY[j+1];

}

punt[0] = tmpX[0];

punt[1] = tmpY[0];

}

}

32

Page 40: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

De parameter t doorloopt hier dus het interval [0,1] in stapjes van 0.01. In dit stukjeprogrammacode stelt huidig het aantal controlepunten voor, terwijl i telt hoe vaak de pro-cedure nog dient uitgevoerd te worden; j, tot slot, dient om telkens opnieuw de bereken-ing Pj;j+1(t) = (1 ¡ t)Pj(t) + tPj+1(t) voor elk nog overblijvend puntenpaar uit te vo-eren. Dit stukje code is afkomstig uit bezier.java (zie ook A.2), waarin de puntenvan de B¶ezierkromme worden bepaald. De geijmplementeerde versie is -uiteraard- ana-lytisch, terwijl wat hierboven beschreven werd een meetkundige aanpak is. Het verschilzit hem erin dat in de meetkunde punten als basis beschouwd worden, terwijl in de ana-lyse gecoÄordinatiseerd wordt, waarna op die coÄordinaten telkens dezelfde procedure wordttoegepast. Het hierboven beschreven algoritme draagt de naam van de Casteljau. Hetprogramma dat dit algoritme illustreert, casteljau.java, wordt besproken in A.9.Aan de hand van de hierboven beschreven methode vinden we door inductie volgendeparametervoorstelling voor een B¶ezierkromme bepaald door n controlepunten:

P (t) =n¡1X

k=0

Ãn¡ 1

k

!(1¡ t)n¡k¡1tkPk (5.1)

Hierin treden de veeltermfuncties

Bk;n¡1(t) =

Ãn¡ 1

k

!(1¡ t)n¡k¡1tk (5.2)

op, welke men de Bernsteinveeltermen van de graad n ¡ 1 noemt. Voor deze Bernstein-veeltermen geldt de recursieve betrekking

Bk;l(t) = tBk¡1;l¡1(t) + (1¡ t)Bk;l¡1(t) (5.3)

Figuur 5.2: B¶ezierkromme

33

Page 41: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.3 B¶eziermatrices

B¶ezierkrommen worden dikwijls voorgesteld m.b.v. matrices, omdat deze een compacterevoorstelling mogelijk maken. De uitdrukking (2.1) voor de punten van een lijnstuk, P01 =(1¡ t)P0 + tP1, kan als volgt in matrixvorm weergegeven worden:

P01 =ht 1

i " ¡1 1

1 0

# "P0

P1

#(5.4)

De hierbij optredende matrix

"¡1 1

1 0

#noemt men de B¶eziermatrix van orde 2. Als men

de eerste vermenigvuldiging in de formule uitwerkt, bekomt men

ht 1

i " ¡1 1

1 0

#=h

1¡ t ti

(=hB0;1(t) B1;1(t)

i);

waarin klaarblijkelijk de Bernsteinveeltermen Bi;1(t) (i 2 f0; 1g) optreden. Steunend opde recursieve betrekking (5.3), bekomt men expliciet

B0;2 = 0 + (1¡ t)(1¡ t) = 1¡ 2t+ t2

B1;2 = t(1¡ t) + (1¡ t)t = 2t¡ 2t2

B2;2 = t:t+ 0 = t2

Hieruit kan onmiddellijk de B¶eziermatrix van 3e orde worden afgelezen, mede steunend opde veralgemening van (5.4): 2

641 ¡2 1

¡2 2 0

1 0 0

375

Voor de 4e orde gaan we analoog te werk en bekomen:

B0;3 = 0 + (1¡ t)(1¡ 2t+ t2) = 1¡ 3t+ 3t2 ¡ t3

B1;3 = t(1¡ 2t+ t2) + (1¡ t)(2t¡ 2t2) = 3t¡ 6t2 + 3t3

B2;3 = t(2t¡ 2t2) + (1¡ t)t2 = 3t2 ¡ 3t3

B3;3 = t:t2 + 0 = t3

waaruit 266664

¡1 3 ¡3 1

3 ¡6 3 0

¡3 3 0 0

1 0 0 0

377775

Het is deze B¶eziermatrix van 4e orde die optreedt in bezierPlakken.java (zie ook x5.5en A.5):

34

Page 42: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

static int bezierMatrix[][] = {{-1,3,-3,1},{3,-6,3,0},{-3,3,0,0},{1,0,0,0}};

Tot slot vermelden we nog de bekomen resultaten voor de 5e orde. De Bernsteinveeltermenzijn:

B0;4 = 0 + (1¡ t)(1¡ 3t+ 3t2 ¡ t3) = 1¡ 4t+ 6t2 ¡ 4t3 + t4

B1;4 = t(1¡ 3t+ 3t2 ¡ t3) + (1¡ t)(3t¡ 6t2 + 3t3) = 4t¡ 12t2 + 12t3 ¡ 4t4

B2;4 = t(3t¡ 6t2 + 3t3) + (1¡ t)(3t2 ¡ 3t3) = 6t2 ¡ 12t3 + 6t4

B3;4 = t(3t2 ¡ 3t3) + (1¡ t)t3 = 4t3 ¡ 4t4

B4;4 = t:t3 + 0 = t4

en de B¶eziermatrix wordt:

26666664

1 ¡4 6 ¡4 1

¡4 12 ¡12 4 0

6 ¡12 6 0 0

¡4 4 0 0 0

1 0 0 0 0

37777775

Zoals de lezer merkt, neemt het rekenwerk danig toe als de orde vergroot. Om dit reken-werk te beperken, zal men dikwijls zijn toevlucht nemen tot het aaneensluiten3 van 4e

orde B¶ezierkrommen.Merk nog op dat de som van de Bernsteinveeltermen van de je graad identisch 1 is, m.a.w.ze vormen een partitie van de eenheid:

jX

i=0

Bi;j(t) ´ 1:

3zie x5.5 Aaneensluiten van B¶ezierkrommen

35

Page 43: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.4 Kenmerken van een B¶ezierkromme

5.4.1 Globaal karakter

Figuur 5.3: Twee B¶ezierkrommen

Indien men in een B¶ezierkromme een controlepunt verplaatst, heeft dit een invloed op devolledige kromme. Dit wordt gedemonstreerd via volgend voorbeeld. De lezer kan dezeeigenschap zelf vaststellen in bezierkromme.java (zie ook A.4), waar een controlepuntkan verplaatst worden om het e®ect ervan na te gaan.

Voorbeeld

Beschouw de B¶ezierkromme bepaald door de controlepunten (-2,0), (-1,0), (0,2), (1,0),(2,0) met als parametervergelijking:

(x(t) = ¡2 + 4t

y(t) = 12t2 ¡ 24t3 + 12t4

De inwendige punten van deze kromme (t 2]0; 1[) hebben alle een positieve Y-coÄordinaatterwijl begin- (t=0) en eindpunt (t=1) op de X-as liggen. Inderdaad geldt er

y(0) = 12:0¡ 24:0 + 12:0 = 0

y(1) = 12:1¡ 24:1 + 12:1 = 12¡ 24 + 12 = 0

terwijl men bovendien de uitdrukking voor y(t) kan herschrijven als:

y(t) = 12t2(t2 ¡ 2t+ 1) = 12t2(t¡ 1)2

d.w.z. een volkomen kwadraat. Verplaatst men nu het derde controlepunt naar (0,-2),dan stelt men vast dat alle mogelijke beelden strikt negatief zijn, op de beelden van denulpunten na. Hieruit mag blijken dat de verplaatsing van een controlepunt een globaleinvloed heeft.

36

Page 44: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.4.2 Verhoging van de orde

Een andere eigenschap van B¶ezierkrommen is dat een B¶ezierkromme, beschreven door ncontrolepunten, ook door n+1 controlepunten beschreven kan worden. Ook dit kan delezer vaststellen in bezierkromme.java.

for (int i = 0; ++i < huidig;)

{

puntX[i] = (((double)(i * tmpX[i-1] + (huidig - i) * tmpX[i]))/huidig);

puntY[i] = (((double)(i * tmpY[i-1] + (huidig - i) * tmpY[i]))/huidig);

}

puntX[0] = tmpX[0];

puntY[0] = tmpY[0];

puntX[huidig] = tmpX[huidig-1];

puntY[huidig] = tmpY[huidig-1];

In dit stukje code wordt eerst voor elk intermediair controlepunt (Q1 t.e.m. Qn¡1) eenlineaire combinatie van twee oorspronkelijke4 controlepunten genomen, volgens de formule:

Qi =i

nPi¡1 +

µ1¡ i

n

¶Pi (i 2 f1; 2; :::; n¡ 1g)

waarbij ook moet gelden dat Q0 = P0 en Qn = Pn¡1. Men kan eenvoudig nagaan dat denieuwe controlepunten dezelfde B¶ezierkromme blijven beschrijven.

4van de n-punts B¶ezierkromme

37

Page 45: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.5 Aaneensluiten van B¶ezierkrommen

Gebruikt men een groot aantal controlepunten, dan nemen de bijhorende B¶eziermatricessnel toe in omvang, wat veel rekenwerk veroorzaakt. Om dit rekenwerk toch enigszins inte perken, houdt men zich in de praktijk bij B¶ezierkrommen van de vierde orde die opdusdanige manier aaneengesloten worden dat ze C1 (i.e. continu en a°eidbaar) zijn. Ditwordt gedemonstreerd in bezierPlakken.java (zie ook A.5).

Figuur 5.4: Aaneengesloten B¶ezierkrommen

Teneinde de werkwijze te verduidelijken, beschouwen we het volgende voorbeeld.

Voorbeeld

Als men de B¶ezierkrommen, bepaald door de coÄordinaten5 (2,-2), (-2,2), (2,2), (-2,-2) en(0,2), (2,2), (-2,-2), (0,-2), aaneen wil sluiten, verplaatst het programma het eindpunt,resp. beginpunt, van de kromme naar de oorsprong. Om dit te verwezenlijken dient deeerste kromme verplaatst te worden over de vector (2,2), de tweede kromme over de vector(0,-2). Dat de samengestelde kromme (bestaande uit twee B¶ezierkrommen) continu is, isevident aangezien het laatste, resp. eerste controlepunt, gemeenschappelijk is. Nu wensenwij bovendien dat deze kromme a°eidbaar is. Dit kan gerealiseerd door de samenstellendekrommen zo te positioneren dat ze beide raken aan de X-as. De eerste kromme dient inde oorsprong aan te komen volgens de negatieve X-as. Om dit te bereiken draaien wij de¯guur 3¼

4 rond de oorsprong in tegenwijzerzin, zodat ook het tweede controlepunt op de(negatieve) X-as ligt. De tweede kromme raakt, na de translatie, reeds aan de (positieve)X-as (tweede controlepunt heeft als coÄordinaten (2,0)).

5deze B¶ezierkrommen zijn gelijkvormig met de krommen uit Figuur 5.1 en 5.2, welke samengevoegd dekromme uit Figuur 5.3 vormen (zie ook A.5)

38

Page 46: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Om dit nu nog eens expliciet na te gaan, voeren wij eerst de transformaties6 op de con-trolepunten uit,2664¡p

22 ¡

p2

2 0

¡p

22

p2

2 0

0 0 1

3775

264

1 0 2

0 1 2

0 0 1

375

264

2 ¡2 2 ¡2

¡2 2 2 ¡2

1 1 1 1

375 =

264¡2p

2 ¡2p

2 ¡4p

2 0

¡2p

2 2p

2 0 0

1 1 1 1

375

om vervolgens de geassocieerde B¶ezierkrommes7 te bepalen:

8>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>:

Px(t) =ht3 t2 t 1

i

266664

¡1 3 ¡3 1

3 ¡6 3 0

¡3 3 0 0

1 0 0 0

377775

266664

¡2p

2

¡2p

2

¡4p

2

0

377775

Py(t) =ht3 t2 t 1

i

266664

¡1 3 ¡3 1

3 ¡6 3 0

¡3 3 0 0

1 0 0 0

377775

266664

¡2p

2

2p

2

0

0

377775

8>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>:

Px(t) =h¡t3 + 3t2 ¡ 3t+ 1 3t3 ¡ 6t2 + 3t ¡3t3 + 3t2 t3

i

266664

¡2p

2

¡2p

2

¡4p

2

0

377775

Py(t) =h¡t3 + 3t2 ¡ 3t+ 1 3t3 ¡ 6t2 + 3t ¡3t3 + 3t2 t3

i

266664

¡2p

2

2p

0

0

377775

(Px(t) = (¡2

p2)(¡t3 + 3t2 ¡ 3t+ 1) + (¡2

p2)(3t3 ¡ 6t2 + 3t) + (¡4

p2)(¡3t3 + 3t2) + (0)(t3)

Py(t) = (¡2p

2)(¡t3 + 3t2 ¡ 3t+ 1) + (2p

2)(3t3 ¡ 6t2 + 3t) + (0)(¡3t3 + 3t2) + (0)(t3)

(Px(t) = 8

p2t3 ¡ 6

p2t2 ¡ 2

p2

Py(t) = 8p

2t3 ¡ 18p

2t2 + 12p

2t¡ 2p

2

Voor de tweede kromme bekomt men op analoge wijze als coÄordinaten van de controlepun-ten: 2

640 2 ¡2 0

0 0 ¡4 ¡4

1 1 1 1

375

6zie Hoofdstuk 47noem de eerste kromme P en de tweede Q

39

Page 47: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

en als vergelijkingen van de kromme:(Qx(t) = (0)(¡t3 + 3t2 ¡ 3t+ 1) + (2)(3t3 ¡ 6t2 + 3t) + (¡2)(¡3t3 + 3t2) + (0)(t3)

Qy(t) = (0)(¡t3 + 3t2 ¡ 3t+ 1) + (0)(3t3 ¡ 6t2 + 3t) + (¡4)(¡3t3 + 3t2) + (¡4)(t3)

(Qx(t) = 12t3 ¡ 18t2 + 6t

Qy(t) = 8t3 ¡ 12t2

Aangezien de kromme a°eidbaar dient te zijn, dient de afgeleide van de eerste krommein het eindpunt gelijk te zijn aan die van de tweede kromme in het beginpunt. In hetvoorbeeld geeft dit voor de eerste, resp. tweede, kromme:

dPx(t)dt = 24

p2t2 ¡ 12

p2t dPy(t)

dt = 24p

2t2 ¡ 36p

2t+ 12p

2dQx(t)dt = 36t2 ¡ 36t+ 6

dQy(t)dt = 24t2 ¡ 24t

zodat we voor de kromme P vinden:

dy

dx=

dPy(t)dt

dPx(t)dt

=24p

2t2 ¡ 36p

2t+ 12p

2

24p

2t2 ¡ 12p

2t

Hier dient de afgeleide in het eindpunt bepaald te worden (d.w.z. t=1):

dy

dx

¯¯t=1

=0

12p

2= 0

Analoog voor de tweede kromme, Q:

dy

dx=

dQy(t)dt

dQx(t)dt

=24t2 ¡ 24t

36t2 ¡ 36t+ 6

Hier dient de afgeleide in het beginpunt bepaald te worden (d.w.z. t=0):

dy

dx

¯¯t=0

=0

6= 0

Uit deze berekeningen volgt derhalve ook de a°eidbaarheid van de globale kromme. Wekunnen ons nu afvragen of ook de kromming continu is. Hiertoe dienen we de tweedeafgeleide te beschouwen:

d2y

dx2

¯¯¯t=1

=

d2Py(t)(dt)2

d2Px(t)(dt)2

¯¯¯t=1

=48p

2t¡ 36p

2

48p

2¡ 12p

2

¯¯¯t=1

=12p

2

36p

2=

1

3

d2y

dx2

¯¯¯t=0

=

d2Qy(t)(dt)2

d2Qx(t)(dt)2

¯¯¯t=0

=48t¡ 24

72t¡ 36

¯¯t=0

=¡24

¡36=¡1

3

Hieruit mag blijken dat de kromming niet altijd continu is als men willekeurige B¶ezierkrommenaaneensluit. Hiertoe dienen de controlepunten van P en van Q op een welbepaalde maniermet elkaar in verband te staan. We gaan hier evenwel niet verder op in.In de code (zie A.5) worden de punten waar dient aaneengesloten te worden, naar deoorsprong gebracht.

40

Page 48: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

for (int i = 0; i < 2; i++)

{

float mov = kromme[h][i][0];

b[i] = kromme[h][i][1] - mov;

c[i] = kromme[h][i][2] - mov;

d[i] = kromme[h][i][3] - mov;

}

Vervolgens wordt het naburige controlepunt op de negatieve (resp. positieve) kant van deX-as gelegd:

int g = ((h == 0)?(-1):(1));

// via rotatie b[i] op de X-as brengen

// berekening via stelsel :

// g*len = x' = x*cos - y*sin = b[0]*rot[0] - b[1]*rot[1] | *x | *-y

// 0 = y' = x*sin + y*cos = b[0]*rot[1] + b[1]*rot[0] | *y | *x

float len = (float)java.lang.Math.sqrt(b[0]*b[0]+b[1]*b[1]);

rot[0] = g*b[0]/len;

rot[1] = -1*g*b[1]/len;

kromme[2+h][0][0] = centrum[0];

kromme[2+h][1][0] = centrum[1];

kromme[2+h][0][1] = centrum[0] + g*len/2;

kromme[2+h][1][1] = centrum[1];

kromme[2+h][0][2] = (c[0]*rot[0] - c[1]*rot[1])/2 + centrum[0];

kromme[2+h][1][2] = (c[0]*rot[1] + c[1]*rot[0])/2 + centrum[1];

kromme[2+h][0][3] = (d[0]*rot[0] - d[1]*rot[1])/2 + centrum[0];

kromme[2+h][1][3] = (d[0]*rot[1] + d[1]*rot[0])/2 + centrum[1];

Hierin stelt centrum[0], resp. centrum[1], de X-, resp. Y-coÄordinaat, voor van het puntwaar de aaneensluiting tot stand komt op het scherm.

41

Page 49: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.6 Benadering van een cirkel a.d.h.v. een B¶ezierkromme

Een cirkel bezit geen polynomiale parametervoorstelling. Derhalve kan een cirkelboog ooknooit exact worden voorgesteld door een B¶ezierkromme.

Figuur 5.5: Cirkel benaderd door B¶ezierkrommen

Wel zal, op een computerscherm, een cirkelboog op een "goede" manier kunnen benaderdworden d.m.v. een B¶ezierkromme. Neem aan dat de straal van de voor te stellen cirkel¶e¶en pixel bedraagt, dan bestaat de cirkel uit vier punten. Dit heeft tot gevolg dat in heteerste kwadrant de enige voorgestelde cirkelpunten (1,0) en (0,1) zijn, welke op de kooptoe aan elkaar grenzen en dus perfect zijn voor te stellen als polynomiale B¶ezierkrommemet die twee punten als enige controlepunten. Beschouwen we vervolgens een cirkel metstraal twee pixels, dan bestaat de cirkel in het eerste kwadrant uit vier punten, nl. (2,0),(2,1), (1,2) en (0,2). Op het scherm vallen deze punten samen met de beste voorstellingvan de B¶ezierkromme horend bij de drie controlepunten (2,0), (2,2) en (0,2).In bezierCirkel.class (zie ook A.3) wordt getoond hoe een cirkel kan "voorgesteld" wor-den door middel van een B¶ezierkromme. In octant ¶e¶en en drie wordt de cirkel benaderddoor een polynomiale B¶ezierkromme terwijl in octant twee gebruik gemaakt wordt vaneen rationale parametervoorstelling die de cirkel exact voorstelt. Bij de polynomiale be-nadering wordt als eerste, resp. laatste, controlepunt het punt (1,0)8, resp. (0,1), gekozen.De tussenliggende controlepunten werden opgevuld met vrije parameters, waarbij reken-ing is gehouden met symmetrieargumenten9. Aanvankelijk hebben beide krommen tweecontrolepunten, wat gaandeweg opgebouwd wordt over drie en vier, vijf en zes, zeven enacht tot negen en tien. Welke waarden dienen ingevuld te worden om de "beste" bena-

8als men de factor straal van de te benaderen cirkel buiten beschouwing laat9als (x,y) een controlepunt is, impliceert dit dat (y,x) er ook ¶e¶en is

42

Page 50: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

dering te verkrijgen, kan op twee manieren worden bepaald. Bij beide werkwijzen wordteerst een parametervoorstelling opgebouwd van de gevraagde B¶ezierkromme. Dit leverteen vergelijking voor x(t) en y(t) (stel x(t) = f(xi,t) en y(t) = g(yi,t) met 0 · i · n ¡ 1(n = aantal controlepunten) met f en g lineair in de xi en yi).

5.6.1 Benadering via de straal van de cirkel (1e kwadrant)

Hier drukt men de straal uit i.f.v. de x-coÄordinaten10 (xi; i = 0; :::; n¡1) van de te bepalencontrolepunten. De bekomen uitdrukking is klaarblijkelijk van de tweede graad (bevatzuivere kwadraten en gemengde producten). Hierbij doorloopt de parameter t het interval[0,1].Aangezien het eerste en het laatste controlepunt ¶op de kromme liggen en bovendien juistcorresponderen met begin- en eindpunt van de kwartcirkel in het eerste kwadrant, zullenvoor t = 0 en t = 1 geen fouten worden gemaakt in de benadering. Beschouw derhalvet 2 ]0; 1[.Teneinde de uitdrukking R(xi; t) - via R2(xi; t) i.e. x2(t) + y2(t), dus polynomiaal in t -zo goed mogelijk de waarde 1 te laten benaderen, stellen we vervolgens de coÄe±ciÄentenvan de lagere-graadstermen in t gelijk aan 0. Op die manier worden de coÄordinaten vande controlepunten bepaald.Bij de praktische uitvoering hebben we maximaal negen controlepunten gebruikt (zevenvrije parameters), wat een kwadratisch stelsel met zeven vergelijkingen in zeven verander-lijken oplevert11. Immers in de praktijk blijkt de benadering niet steeds te verbeteren bijhet toevoegen van controlepunten.

5.6.2 Benadering via de reeksontwikkeling van cos(¼t2) en sin(¼t

2) (3e kwa-

drant)

Hier stelt men de coÄe±ciÄenten in de parametervoorstelling van de cirkel gelijk aan die vande B¶ezierkromme om deze zo goed mogelijk te benaderen. Dit stelsel is lineair in de xi (yi)en rekent dus makkelijker12. Omdat het geen nut heeft verschillende graden van precisiete kiezen om de cosinusfunctie en de sinusfunctie te benaderen, is in dit deel steeds gebruikgemaakt van een even aantal parameters. Daarnet, bij de benadering 'via de straal vande cirkel', werd er steeds een oneven aantal parameters gekozen (op de benadering dooreen lijnstuk na) omdat Maple V release 4 problemen had met de convergentie bij een evenaantal parameters.

10of i.f.v. y-coÄordinaten, wat op hetzelfde neerkomt, daar xi ´ yn¡i¡111Maple V release 4 lost een analoog stelsel met vijftien vrije parameters op in 5.8 seconden op AMD

Athlon 750 (cirkel1.mws)12als men hier veertien parameters neemt, doet Maple V r4 er 0.9 seconden over (cirkel2.mws)

43

Page 51: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

5.6.3 Exacte voorstelling via een rationale parametervoorstelling (2e

kwadrant)

Ter vergelijking met de voorgaande benaderende methodes hebben we de kwartcirkel inhet tweede kwadrant voorgesteld a.d.h.v. de rationele parametervoorstelling

8>>>><>>>>:

x(t)=u2 ¡ 1

1 + u2

y(t)=2u

1 + u2

u 2 [0; 1]

Indien men u het interval [0; 1] laat doorlopen, krijgt men aldus een wiskundig perfectevoorstelling van een cirkelboog.

x(t)2 + y(t)2 =

Ãu2 ¡ 1

1 + u2

!2

+

µ2u

1 + u2

¶2

=u4 ¡ 2u2 + 1 + 4u2

1 + 2u2 + u4=u4 + 2u2 + 1

1 + 2u2 + u4= 1

44

Page 52: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 6

Splines

In voorgaand hoofdstuk hebben we B¶ezierkrommen bestudeerd, vertrekkend van een gegevenaantal controlepunten: de resulterende kromme gaat niet door alle controlepunten, maarvormt een "benadering" van het gegeven stel.In sommige toepassingen wenst men echter een kromme te construeren die door eengegeven stel punten gaat: dergelijke kromme noemt men een interpolerende kromme.Het belangrijkste en meest gebruikte type van interpolerende krommen zijn splines: stuks-gewijze veeltermfuncties die op een "vloeiende" manier aan elkaar worden "gelast".

6.1 Lineaire spline

Figuur 6.1: Lineaire spline

Beschouw een gegeven stel controlepunten Pi(xi; yi); i = 1; :::; n. De eenvoudigste manierom tot een interpolerende "kromme" te komen is door de punten te verbinden d.m.v. eengebroken lijn, bestaande uit n-1 lijnstukken. Op die manier krijgt men een kromme diecontinu is, maar doorgaans niet a°eidbaar. Deze kromme wordt in het programma lineairespline genoemd.Om de vergelijkingen te bepalen van de rechten die de opeenvolgende controlepuntenverbinden, y = fi(x) = aix + bi, heeft men, bij n controlepunten, (n-1) vergelijkingenmet 2(n-1) parameters, welke uniek bepaald zijn als men eist dat zowel het ie als het(i + 1)e punt op het ie lijnstuk liggen. Als men bij lineaire splines een controlepunt van

45

Page 53: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

plaats verandert, heeft dit slechts een beperkte invloed aangezien slechts (maximum) tweelijnstukken iets ondervinden van deze wijziging.

6.2 Kwadratische spline

Naar aanleiding van voorgaande beschouwingen, voeren we derhalve stuksgewijze tweede-graadskrommen in. Dit resulteert in de vergelijking y = fi(x) = aix

2+bix+ci voor elk vande samen te stellen deelkrommen. Deze n¡ 1 vergelijkingen bevatten samen 3(n¡ 1) pa-rameters. Door interpolatie (en bijgevolg ook continuijteit) te eisen legt men reeds 2(n¡1)voorwaarden op: fi(xi) = yi en fi(xi+1) = yi+1. Door continue a°eidbaarheid te eisen, watresulteert in n¡2 voorwaarden f 0i(xi+1) = f 0i+1(xi+1), legt men nog eens n¡2 parametersvast. In totaal geeft dat 3(n ¡ 1) parameters en maar 2(n ¡ 1) + n ¡ 2 = 3(n ¡ 1) ¡ 1voorwaarden. De overblijvende vrije parameter wordt in de klasse spline.java (zie A.22)ingevuld door een waarde te geven aan de afgeleide in het beginpunt. Door deze ene vrijeparameter zo in te vullen, bekomt men een speciaal e®ect als men een controlepunt ver-plaatst. Als de vrije parameter gebruikt wordt in een eindpunt (i.e. door de afgeleide eenwaarde toe te kennen), dan verdwijnt het verplaatsingse®ect naar dit controlepunt toe.

Figuur 6.2: Kwadratische spline

We hebben nu reeds een continu a°eidbare interpolerende kromme geconstrueerd. Willenwe echter ook een continue kromming, dan dienen we opnieuw de graad van de gebruikteveeltermen te verhogen.

6.3 Kubische splines

Als men voor elke fi een derdegraadsveelterm vooropstelt, heeft men 4(n ¡ 1) vrije pa-rameters. Van deze parameters zijn er reeds 3(n ¡ 1) ¡ 1 gebonden door continuijteits-en a°eidbaarheidseisen. Nieuw is hier dat ook geÄeist wordt dat de kromming continu is(f"i (xi+1) = f"

i+1(xi+1)). Dit resulteert in de binding van n¡ 2 van de resterende (n) pa-rameters. Om de laatste twee parameters te bepalen, opteert men voor ¶e¶en van volgendealternatieven. Een eerste mogelijkheid is dat men in beide eindpunten de kromming 0maakt. Dit komt natuurlijk over aangezien men, indien men tekent met de losse hand,

46

Page 54: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

een kromme schetst die in beide eindpunten een kromming heeft die (bij benadering) 0is. Een alternatief hiervoor is de spline inklemmen tussen twee rechten met gegeven rich-tingscoÄe±ciÄent, d.w.z. dat men de richtingscoÄe±ciÄent van de raaklijnen aan de kromme inde eindpunten gelijkstelt aan een opgegeven (meestal dezelfde) waarde. De eerste wordtde natuurlijke kubische spline genoemd, terwijl de tweede de naam ingeklemde kubische

spline draagt. Bij kubische splines heeft het verplaatsen van een controlepunt opnieuw eenrelatief beperkte invloed1.

Figuur 6.3: Ingeklemde (links) en natuurlijke (rechts) kubische spline

6.4 Opmerkingen

Vooreerst is er bij het ingeven van de controlepunten rekening gehouden met het feit dathet telkens interpolerende functies zijn. Dit houdt in dat er geen twee controlepuntenmet eenzelfde x-coÄordinaat kunnen ingegeven worden. Ook worden de controlepuntenautomatisch volgens deze coÄordinaat geordend in opklimmende volgorde.Bij het tekenen van elke functie wordt gewerkt in n+ 1 stapjes, n = max(jxi+1 ¡ xij;jyi+1¡yij). Dit heeft tot gevolg dat de functie een continu uitzicht zal hebben. Om dit nogte verbeteren, worden twee opeenvolgende berekende punten ook telkens door een lijnstukverbonden.Tijdens de uitvoering van het programma dient telkens een stelsel, gaande van 2(n ¡ 1)tot 4(n ¡ 1) vergelijkingen met evenveel onbekenden, opgelost te worden. Om dit stelselop te lossen wordt gebruik gemaakt van de Gauss-Jordan methode welke een stelsel

X

j

aijxj = bi (8i)

omvormt tot X

j

±ijxj = b0i (8i)

ofxi = b0i (8i)

1voor meer informatie hieromtrent verwijzen wij graag naar x6.5

47

Page 55: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

zodat de oplossingen direct kunnen afgelezen worden uit de getransformeerde kolommatrixB' in het rechterlid, die enkel gekende grootheden bevat.

6.5 Lokaal karakter van de kromme

Het globale karakter van de B¶ezierkromme was, naast het ontbreken van interpolatie, voorbepaalde toepassingen een nadeel, zoals reeds vermeld in x5.4.1.De gebruiker kan zelf vaststellen in spline.java, dat dit op het eerste zicht niet zo is bijsplines. Inderdaad, bij lineaire splines worden lijnstukken getekend van controlepunt naarcontrolepunt. Dit heeft tot gevolg dat, bij een verplaatsing van een controlepunt, uitslui-tend de twee2 aangrenzende lijnstukken de invloed van deze verplaatsing ondergaan.In het algemene geval echter hebben verplaatsingen van controlepunten w¶el een globale,zij het een uiterst geringe, invloed. Dit hebben we berekend in spline.mws, waarvanwe de resultaten hier kort zullen vermelden. Het idee achter de worksheet is 81 puntenequidistant gelegen op de X-as te beschouwen en het middelste punt, welke we in de oor-sprong gepositioneerd hadden, te verplaatsen naar het punt met dezelfde X-coÄordinaat en10 als Y-coÄordinaat. Voor de verplaatsing was de natuurlijke kubische spline, geassocieerdmet deze controlepunten, de X-as. Na de verplaatsing krijgen we aan de rand (d.i. tussen(¡40; 0) en (¡39; 0)3) de volgende kromme:

f¡40(x) =30

37746084314912758705537(x+ 40)3 ¡ 30

37746084314912758705537(x+ 40)

De theoretische wiskundige kan hier vaststellen dat dit niet de vergelijking is van de X-as,terwijl de toegepaste opmerkt dat ze dit wel is, afrondingsfouten niet te na.Feit is dat de 'fouten' kleiner worden, naarmate men dichter bij de uiteinden komt. Dereden hiervoor is dat de twee resterende vrijheidsgraden opgevuld worden in de uiteinden.Mocht men een controlepunt verplaatsen bij een kwadratische spline, dan zal de verander-ing verdwijnen in de richting van het controlepunt waar de vrijheidsgraad gebruikt wordt.In de andere richting zal de fout merkbaar blijven.

2¶e¶en als begin- of eindpunt verplaatst wordt3de andere rand volgt uit symmetrie

48

Page 56: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 7

B-Splines

In vroegere hoofdstukken werden benaderende, al dan niet interpolerende, krommen geijn-troduceerd welke alle een globaal karakter vertoonden, zij het soms in z¶e¶er beperkte mate.In dit hoofdstuk bestuderen we de B-Spline, een approximerende kromme met een lokaalkarakter. Hierop wordt dieper ingegaan in x7.3.

Figuur 7.1: B-Spline

7.1 De¯nitie

Hoewel ze verwant zijn met B¶ezierkrommen, is de wiskundige achtergrond bij B-Splineseen beetje ingewikkelder. Er bestaan verschillende manieren om ze te de¯niÄeren. Wijzullen gebruik maken van de recursieve de¯nitie die rond 1970 gegeven werd door M. G.Cox en C. de Boor.

49

Page 57: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

7.1.1 Vergelijking

Eerst en vooral stellen we de algemene vorm van de vergelijking voorop voor een B-Splinevan orde k, bepaald door n controlepunten:

P (u) =n¡1X

i=0

Ni;k(u)Pi (7.1)

In deze vergelijking treden n, nog onbekende, basisfuncties op, welke gede¯nieerd wordenin de volgende paragraaf.

7.1.2 Genormaliseerde B-Spline basisfuncties

We de¯niÄeren de functies Ni;k(u), i = 0; :::; n ¡ 1. Voor een B-Spline van de orde k, zijndit veeltermfuncties van de graad k-1.In de de¯nitie van Cox-de Boor legt men eerst deze van de eerste graad vast, op de volgendemanier:

Ni;1(u) =

(1 als u 2 [ui; ui+1[

0 als u =2 [ui; ui+1[(7.2)

waarop die van een hogere graad verder bouwen

Ni;k(u) =u¡ ui

ui+k¡1 ¡ uiNi;k¡1(u) +

ui+k ¡ uui+k ¡ ui+1

Ni+1;k¡1(u) (7.3)

Bij deze de¯nitie geldt de afspraak dat indien een noemer 0 wordt, de overeenkomstigecoÄe±ciÄent gelijk gesteld wordt aan 0. Merk op dat in (7.2) en (7.3) de nog onbekendeparameters ui optreden. We noemen ze de knopen (of componenten van de knopenvector)en gaan er dieper op in in de volgende paragraaf.

Figuur 7.2: B-Spline

50

Page 58: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

7.1.3 Knopenvector

Voor de knopen ui dient te gelden dat

u0 · u1 · ::: · ulenHier wordt een nieuwe parameter len geijntroduceerd waarvan de waarde voorlopig onbe-kend is. We kunnen evenwel onmiddellijk nagaan dat

len ¸ n+ k ¡ 1

Immers in de recursieve de¯nitie (7.2)-(7.3) worden voor elke verlaging van de orde tweebasisfuncties in de de¯nitie betrokken. Beschouw nu de uitdrukking (7.1). In deze somtreedt in de laatste term de functie Nn¡1;k(u) op. Om deze functie te de¯niÄeren, dienenwe uiteindelijk de functie Nn+k¡2;1(u) te kennen. Hiervoor hebben we de knopen un+k¡2;1

en un+k¡1 nodig. Bijgevolg is n+k¡ 1 de waarde die len minstens moet aannemen; meermag ook, maar is nergens voor nodig. Bij deze redenering valt het op dat om Nn¡1;k(u) teberekenen alle Nj;1 nodig zijn, waarbij j waarden aanneemt tussen n en n+k¡2. Bijgevolgzal Nn¡1;k(u) slechts van nul verschillende waarden aannemen indien u 2 [un¡1; un+k¡1[.Algemener vinden we:

Ni;k(u) = 0, u =2 [ui; ui+k[

Ni;k(u) is slechts in een eindig interval verschillend van 0, m.a.w. zijn drager is compact.

7.2 Soorten B-Splines

De knopenvector kan op verschillende manieren samengesteld worden. Dit kan volledigwillekeurig1 gebeuren. Aldus bekomt men een, met de naam uit bspline.java (A.8), niet-

open niet-uniforme B-Spline. Dit is het meest algemene geval. Figuur 7.2 toont eenvoorbeeld2 van een dergelijke kromme.Een eerste speciaal geval doet zich voor als er tussen de opeenvolgende knopen een vastverschil is:

ui+1 ¡ ui = cte

Een dergelijke knopenvector noemt men uniform. Aan de hand van een dergelijke knopen-vector bekomen we een uniforme B-Spline.Een andere mogelijkheid om een speciale B-Spline (van orde k) te creÄeren is de eerste ende laatste waarde van de knopenvector multipliciteit k te geven. Op deze manier zorgtmen ervoor dat de B-Spline door het eerste en het laatste controlepunt (van de n) gaat.Dit soort B-Spline draagt de naam open B-Spline.

ui = ui+1 (8i j 0 · i < k ¡ 2 _ n < i < n+ k ¡ 2)

We kunnen ook beide eigenschappen combineren om een open-uniforme B-Spline3 tebekomen. Deze heeft als kenmerken:

ui = ui+1 (8i j 0 · i · k ¡ 2 _ n · i · n+ k ¡ 2)

ui+1 ¡ ui = cte (8i j k ¡ 1 · i · n¡ 1)

1wel moet gelden ui · ui+1; (8i)2voluit is ze een kwadratische niet-open niet-uniforme B-Spline3de kromme in Figuur 7.1 is een kubische open-uniforme B-Spline

51

Page 59: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

7.3 Lokaal karakter van de kromme

Stel nu dat we van een gegeven B-Spline het ie controlepunt verplaatsen. De coÄe±ciÄent in(7.1) die bij dit punt hoort, Ni;k(u), is verschillend van 0 als u gelegen is in het interval[ui; ui+k[. Dit houdt in dat als u andere waarden aanneemt (u < ui of u ¸ ui+k), dekromme geen invloed ondervindt van dit verplaatste controlepunt.Deze eigenschap wordt geijllustreerd in Figuur 7.3.

Figuur 7.3: B-Spline met verplaatst controlepunt

7.4 NURBS: Non Uniform Rational B-Splines

7.4.1 De¯nitie

Zoals in x5.6 voeren we ook hier gerelateerde rationale krommen in. We vertrekken opnieuwvan n controlepunten, P0 tot Pn¡1. Aan elk van deze knooppunten kennen we een gewichtwi (> 0) toe. Tot slot kiezen we een open knopenvector. Deze hoeft, zoals de naam laatvermoeden, niet uniform te zijn. Sommige (alle) inwendige knopen mogen zelfs meervoudigzijn.Elke NURBS heeft een parametervoorstelling van de volgende vorm:

P (u) =

Pn¡1i=0 Ni;k(u)wiPiPn¡1i=0 Ni;k(u)wi

u 2 [0; 1] (7.4)

Stellen we nu

Ri;k(u) =Ni;k(u)wiPn¡1j=0 Nj;k(u)wj

;

dan bekomen we de rationale B-Spline basisfuncties. Dit zijn stuksgewijze rationale func-ties in [0; 1]. (7.4) is dan te schrijven als:

P (u) =Pn¡1i=0 Ri;kPi

52

Page 60: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

7.4.2 Eigenschappen van B-Spline basisfuncties

Deze rationale B-Spline basisfuncties hebben dezelfde eigenschappen4 als hun polynomialetegenhangers, vandaar dat we ze in dezelfde rubriek opsommen.Vooreerst zijn ze alle strikt positief.

Ri;k(u) > 0 (u 2 [0; 1] ^ 8i; k)

Ook vormen ze een partitie van de eenheid, d.w.z.

PiRi;k(u) = 1 (u 2 [0; 1] ^ 8k)

Zoals reeds vermeld in x7.1.3 voor genormaliseerde B-Spline basisfuncties, geldt ook voorde rationale dat de drager compact is.

Ri;k(u) = 0 (u =2 [ui; ui+k[)

Tot slot vermelden we het verband tussen de genormaliseerde en de rationale B-Splinebasisfuncties:

8i : wi = cte , Ri;k(u) = Ni;k(u)

Dit betekent dat als we aan alle knooppunten hetzelfde gewicht toekennen, we polynomialeB-Splines bekomen.

7.4.3 Voorbeeld

Als we nu een cirkel willen voorstellen aan de hand van een NURBS, dienen wij als negencontrolepunten te kiezen:

(1; 0); (1; 1); (0; 1); (¡1; 1); (¡1; 0); (¡1;¡1); (0;¡1); (1;¡1) en (1; 0)

Als bijhorende gewichtvector kiezen we:

³1;

p2

2 ; 1;p

22 ; 1;

p2

2 ; 1;p

22 ; 1

´

De graad van de B-Spline basisfuncties is 2, zodat de orde k gelijk is aan 3. De groottevan de knopenvector dient dus n + k of 9 + 3 (= 12) te zijn. Als volledige knopenvectorstellen wij voor:

³0; 0; 0; 1

4 ;14 ;

12 ;

12 ;

34 ;

34 ; 1; 1; 1

´

4de eigenschappen worden genoteerd als geldend voor Ri;k(u); ze gelden echter evenzeer voor Ni;k(u)

53

Page 61: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Figuur 7.4: De cirkel, voorgesteld via een NURBS (A.20)

54

Page 62: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 8

Meetkundige plaatsen

In dit hoofdstuk bestuderen we een aantal -bekende en minder bekende- meetkundigeplaatsen. We splitsen ze op in twee categorieÄen: enerzijds statische meetkundige plaatsenen anderzijds dynamische. Onder statisch verstaan wij in deze context dat de plaatseen verzameling van punten is die te allen tijde aan een bepaalde voorwaarde voldoen.Eenvoudig voorbeeld hiervan is de cirkel die de punten groepeert gelegen op eenzelfdeafstand van een gegeven punt (het zogeheten centrum). Dynamische krommen wordendaarentegen opgebouwd als verzameling van punten die op een gegeven tijdstip aan eenvoorwaarde voldoen. De kromme komt dan overeen met een tijdsinterval. Merk hierbij opdat van zodra een parametervoorstelling van een statische meetkundige plaats gekend is,deze ook als dynamisch kan worden beschouwd, door de optredende parameter met hetbegrip tijd te associÄeren. Dit is evenwel louter interpretatief.

8.1 Statische meetkundige plaatsen

8.1.1 Kegelsneden

Een kegelsnede is de kromme die men bekomt door een (omwentelings)kegel te doorsnij-den met een vlak. Het resultaat van deze doorsnijding is derhalve een vlakke kromme.Afhankelijk van de onderlinge stand van het vlak en de kegel bekomt men een ander typekegelsnede: een ellips, een parabool of een hyperbool. Men kan de verschillende toestandenvan intersectie bekijken in kegelsnede.java (A.15).

Classi¯catie

Noemen we de hoek tussen het vlak en de as van de kegel Ã, en de openingshoek van dekegel ', dan zullen deze drie families corresponderen met de mogelijke verhoudingen van' en Ã:

² voor ellipsen geldt: ' < Ã

² voor parabolen: ' = Ã

² voor hyperbolen: ' > Ã

55

Page 63: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

We zullen verderop zien dat deze classi¯catie ook kan gebeuren op basis van de zgn.excentriciteit van de kegelsnede.

Ellips

De standaard cartesische vergelijking van een ellips1, betrokken op haar assen, is

x2

a2+y2

b2= 1 (8.1)

Hierbij wordt afgesproken dat a > b > 0. Deze vergelijking is equivalent met de parame-tervoorstelling: (

x = a cos(t)

y = b sin(t)(8.2)

Een ellips heeft twee reÄele brandpunten d1 en d2, gelegen op (§c; 0) met c =pa2 ¡ b2. De

excentriciteit van de ellips wordt gegeven door e = ca . Merk op dat deze steeds tussen 0

en 1 is gelegen.

Figuur 8.1: Ellips (0 · e < 1)

Merk op dat ¶e¶en van de varianten van de ellips ons bekend is onder een andere naam.Als we beide brandpunten laten samenvallen, bekomen we een cirkel. Bij deze laatste zijnbeide assen even groot (a = b). Een gevolg hiervan is dat er oneindig veel assen zijn: bijeen cirkel is elke middellijn een as.

Figuur 8.2: Cirkel (e = 0)

1vanaf hier beschouwen we enkel het snijdende vlak

56

Page 64: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Parabool

Als men de excentriciteit naar 1 laat naderen, wordt de grote as steeds groter en komende brandpunten steeds verder uiteen te liggen. Als de excentriciteit de waarde 1 aan-neemt, komt er ¶e¶en brandpunt op1 te liggen. Dergelijke ¯guur noemt men een parabool.Parabolen kunnen alle teruggebracht worden tot een standaardvergelijking van de vorm:

y2 = 2px (8.3)

Dit kan klaarblijkelijk omgevormd worden tot volgende parametervoostelling:

8><>:x =

t2

2py = t

(8.4)

De coÄordinaten van het brandpunt d zijn hier (p2 ; 0). De excentriciteit is, zoals reedsgezegd, 1.

Figuur 8.3: Parabool (e = 1)

Hyperbool

Als men zich nu inbeeldt dat de X-as geen rechte is, maar een cirkel met straal 1, dankomt het brandpunt op de negatieve X-as terecht als men het voorbij 1 opschuift. De(cartesische) vergelijking die bij deze ¯guur hoort, is:

x2

a2¡ y2

b2= 1 (8.5)

De equivalente parametervoorstelling is:

8<:x =

a

cos(t)y = btan(t)

(8.6)

57

Page 65: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

De brandpuntsafsand c is nupa2 + b2. De excentriciteit is nog steeds c

a en hier groterdan 1. Als de excentriciteit naar oneindig nadert, wordt de hyperbool steeds platter, omin de limiet over te gaan in een rechte.

Figuur 8.4: Hyperbool (1 < e)

8.1.2 "Ellipsachtige" ¯guren

Vertrekkend van de cartesische vergelijking (8.1) en de parametervoorstelling (8.2) van deellips, zullen we nu andere, verwante krommen opbouwen, door de optredende uitdrukkin-gen op verschillende manieren te wijzigen.Een eerste voorbeeld hebben we reeds vermeld: de cirkel die bekomen wordt door aan aen b dezelfde waarde toe te kennen.We kunnen evenwel ook de graad van de kromme laten variÄeren.

Asteroijde

Een eerste mogelijkheid is dat we in (8.2) de macht van cos(t) en sin(t) gelijkmatig latenvariÄeren. Dit leidt tot een nieuw type kromme, met parametervoorstelling:

(x = cosn(t)

y = sinn(t)(n 2 N0)

58

Page 66: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Figuur 8.5: Drie asteroijden (n = 1,5,9)

Deze krommen noemen we asteroijden (zie A.1).

Superellipsen

Op analoge wijze kunnen we ook de cartesische vergelijking (8.1) veralgemenen. Hierzullen we krommen beschouwen met vergelijking

¯¯xa

¯¯n

+

¯¯yb

¯¯n

= 1

Deze krommen noemt men superellipsen (zie A.17).Ze zijn tevens verwant aan de krommen van Lam¶e, met vergelijking

xn

an+yn

bn= 1

Deze laatste zijn echter niet steeds gesloten.In Figuur 8.6 zien we de evolutie van de kromme voor toenemende n tot in de limiet: derechthoek2. Merk op dat bij deze rechthoek de hoekpunten zelf ontbreken. Dit heeft eenheel eenvoudige verklaring. De hoekpunten hebben als (niet-genormaliseerde) coÄordinaten(§1;§1). Het is duidelijk dat op die manier (1n + 1n) nooit de waarde 1 bereikt kanworden, zelfs niet in de limiet.Voor n = 1 vinden we een ruit3, met niet-genormaliseerde vergelijking (jxj+ jyj = 1).

Figuur 8.6: Vier superellipsen (n=1,2,5,1)

2het vierkant bij even grote halve assen3een vierkant bij even grote halve assen

59

Page 67: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

8.1.3 B¶ezierkrommen

Deze krommen werden uitvoerig besproken in Hoofdstuk 5 'B¶ezierkrommen'.

8.1.4 Splines

Voor de bespreking van veelterminterpolatie via splines, verwijzen wij graag terug naarHoofdstuk 6 'Splines'.

8.1.5 B-Splines

B-Splines en aanverwante topics kwamen aan bod in Hoofdstuk 7 'B-Splines'.

8.2 Dynamische meetkundige plaatsen

8.2.1 Cycloijden

De basiscycloijde wordt gevormd door de weg beschreven door een punt op de omtrek vaneen cirkel die (zonder glijden) rolt over een vlakke ondergrond. Variaties op dit themaworden bekomen door het punt niet op de rand van de cirkelschijf te kiezen, maar ergens¶op of buiten de schijf. Deze krommen zijn geprogrammeerd in cycloide.java (A.12).

Figuur 8.7: Cycloijde

Figuur 8.8: Epi- en hypocycloijde

60

Page 68: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

8.2.2 Trochoijden

Als men, i.p.v. een vlakke ondergrond, een cirkel neemt om over te rollen, bekomt meneen epitrochoijde. Als de cirkel aan de binnenkant rolt, krijgt men een hypotrochoijde. Inbeide gevallen kan het punt zich op, binnen of buiten de omtrek van de rollende cirkelbevinden. De gebruiker kan deze parameters instellen in trochoide.java (A.25).

Figuur 8.9: Epitrochoijden

Figuur 8.10: Hypotrochoijden

8.2.3 De quadratrix van Hippias

De quadratrix is een kromme die al van in de oudheid bekend is. Ze speelde een belangrijkerol bij het klassieke probleem van de kwadratuur van de cirkel.We bouwen nu de kromme op, op de traditionele manier die reeds door Hippias werdbeschreven.Daartoe laten we in eerste instantie bij een vierkant ¶e¶en zijde eenparig naar de tegen-

61

Page 69: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

overgestelde zijde bewegen. Tegelijkertijd laten we ¶e¶en van de aangrenzende zijden een-parig roteren op zodanige wijze dat ze op hetzelfde moment met die 'tegenovergesteldezijde' samenvalt. Op elk moment voor ze beide samenvallen met deze derde zijde, is er eensnijpunt. Dit snijpunt genereert een kromme die men de quadratrix van Hippias noemt.Als punt dat de kromme vervolledigt op het moment dat de drie zijden samenvallen, wordtde limiet van de kromme genomen.

Figuur 8.11: De quadratrix van Hippias

Beschouwen we het vierkant met als hoekpunten (0,0), (0,1), (1,1) en (1,0). Men laat dezijde die deel is van de X-as, Zx, opwaarts bewegen. Tegelijkertijd draait de zijde langsde Y-as, Zy, om het punt (0,1) tot ze deel uitmaakt van de rechte y = 1.Op elk tijdstip t hebben we derhalve:

Zx : y = t

Zy :x

cos(¼2 t)=

y ¡ 1

sin(¼2 t)¡ 1

Het limietgeval is het punt gelegen op de rechte met vergelijking y = 1 (m.a.w. t = 1).Om de bijbehorende x-waarde te vinden dienen wij dus in Zy y te vervangen door t en delimiet voor t naderend tot 1 te berekenen.

x = limt!1

Ãcos(¼2 t)(t¡ 1)

sin(¼2 t)¡ 1

!

= limt!1

á sin(¼2 t)(

¼2 )(t¡ 1) + cos(¼2 t)

¡ cos(¼2 t)¼2

!

= limt!1

á cos(¼2 t)(

¼2 )2(t¡ 1)¡ 2 sin(¼2 t)(

¼2 )

¡ sin(¼2 t)(¼2 )2

!

= 4¼

Men kan de opbouw van deze kromme bekijken in quadratrix.java (A.21).

62

Page 70: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

8.2.4 De krommen van Lissajous

Een algemene parametervoorstelling is van de vorm:

(x = f(t)

y = g(t)

Lissajous kwam op het idee om aan beide functies, f en g, periodieke eigenschappen toete wijzen. Hij deed dit door met beide een sinusfunctie4 te associÄeren. In de algemenevorm geeft dit: (

x = ®1 sin(¯1x+ °1)

y = ®2 sin(¯2x+ °2)

Parameters kan men naar willekeur instellen in lissajous.java (A.19).Enkele voorbeelden van dergelijke krommen zijn:

Figuur 8.12: met als parametervoorstelling:

(x = 2 sin(9t+ ¼

6 )

y = sin(12t+ ¼2 )

Figuur 8.13: met als parametervoorstelling:

(x = 2 sin(20t+ 3¼

2 )

y = sin(3t+ ¼2 )

4wat ook een cosinusfunctie is met een faseverschuiving

63

Page 71: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Hoofdstuk 9

Opsplitsing en inkleuring vanveelhoeken

9.1 Inleiding

In dit hoofdstuk wordt een algoritme besproken om een willekeurige veelhoek op te splitsenin driehoeken. Ook bespreken wij een algoritme om een algemene veelhoek in te kleurenen passen het dan toe op een driehoek. Het programma splitsenEnKleuren.java, welkesteunt op veelhoek.java, maakt gebruik van Swing-componenten met de bedoeling dezemet AWT (x1.2.1) te vergelijken en kort de meerwaarde te duiden. We bespreken eersthet inhoudelijke deel van dit hoofdstuk om ons daarna kort te wijden aan het technischeluik, met name het gebruik van Swing.

Figuur 9.1: Speci¯catie van de hoekpunten van de veelhoek

64

Page 72: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

9.2 Algoritme van opsplitsing

Er bestaan veel bewerkingen op veelhoeken, waarvan de meeste algoritmisch veel eenvoudi-ger worden indien de veelhoek convex is. Het zal er dus op aan komen een willekeurigeveelhoek in convexe delen op te splitsen. De meest voor de hand liggende keuze is hierbijde oplsplitsing in driehoeken.Algemeen geldt immers dat een veelhoek met n hoekpunten kan opgesplitst worden in n-2driehoeken, de wijze van opsplitsing is hierbij niet noodzakelijk uniek.bij het algoritme kiezen we drie opeenvolgende hoekpunten en testen vervolgens of dedriehoek deel uitmaakt van de ¯guur en of er geen vierde hoekpunt gelegen is in dezedriehoek. Indien dit alles naar verlangen gaat, kunnen wij deze driehoek als het ware'uitknippen' uit de n-puntsveelhoek en het algoritme verder toepassen op de overblijvendeveelhoek met n-1 hoekpunten. Dit gaat zo verder tot er maar drie hoekpunten overblijven.Deze vormen dan de laatste, (n-2)e, driehoek.

Figuur 9.2: De veelhoek, opgesplitst in driehoeken

9.3 Inkleuring van veelhoeken

9.3.1 Algemene veelhoeken

Er bestaan verschillende technieken om een veelhoek te kleuren. Wij zullen ons echterbeperken tot ¶e¶en van de meest gebruikte: het scanlijn algoritme.Bij dit algoritme wordt een horizontale lijn gevolgd, in principe, vertrekkend op ¡1 of, inpraktijk, buiten de (gesloten) ¯guur. Op het moment dat men de veelhoek binnentreedt,begint men te kleuren tot men opnieuw buiten de veelhoek komt. Probleem hierbij is datmen bij het binnentreden van de ¯guur, deze ook direct weer kan verlaten (bv. in geval vaneen hoekpunt). Een ander probleem is dat men zonder voorkennis van alle hoekpunten bijeen willekeurige ¯guur niet kan zeggen waar men kan ophouden met de huidige scanlijn te

65

Page 73: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

doorlopen en mag overgaan naar de volgende. Dit laatste probleem stelt zich niet bij eenconvexe ¯guur - bij een convexe ¯guur maakt elke convexe combinatie van punten van de¯guur deel uit van de ¯guur. Het eerste probleem omzeilen we door van de eerste naar detweede zijde te kleuren, wat mogelijks van een punt naar zichzelf is indien de twee zijdenelkaar snijden op deze hoogte.

Figuur 9.3: De veelhoek, driehoek per driehoek ingekleurd

9.3.2 Driehoeken

Als men dit toepast op een driehoek, bekomt men een eenvoudig algoritme. Eerst bepaaltmen tussen welke y-waarden scanlijnen dienen bekeken te worden (via min en max). Ver-volgens bepaalt men de (twee) snijpunten met de (drie) zijden van de driehoek. Dit levertnergens problemen op aangezien de zijden als halfopen lijnstukken worden beschouwd. Alsmen op dergelijke manier ter hoogte komt van het derde hoekpunt (noch ter hoogte vanmin, noch van max), wordt dit slechts ¶e¶enmaal meegeteld als eindpunt van de te kleurenhorizontale lijn, zodat men ook hier twee eindpunten berekent.

66

Page 74: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

9.4 Swing

De Swing-library breidt AWT uit in twee richtingen: enerzijds worden gra¯sche ele-menten toegevoegd (JSlider) terwijl (sommige) bestaande componenten onder lichtgewij-zigde naam terugkeren met verhoogde functionaliteit (JButton i.p.v. Button).

JButton

Deze knop heeft volgende toestanden:

² armed: is hij gereed om ingedrukt te worden?

² selected: is hij geselecteerd geworden?

² enabled: k¶an hij ingedrukt worden? heeft dit gevolgen?

² pressed: is hij ingedrukt?

² rollover: bevindt de muis zich boven de knop?

Dit model is een uitbreiding van het in AWT bestaande ItemSelectable, wat overeenkomtmet selected.Andere bestaande AWT-componenten zijn eveneens omgevormd. Hieronder geven wijeen opsomming van de vernieuwde componenten1 zonder er dieper op in te gaan. Decorresponderende naam in AWT ligt voor de hand.

² JMenubar

² JMenu

² JMenuItem

² JFrame

Tot slot zijn er ook verschillende elementen toegevoegd: ¶e¶en daarvan is de schuifbalk(JSlider), welke uitvoerig besproken werd in x1.2.5.

1waarvan de awt-varianten besproken zijn in x1.2

67

Page 75: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Bijlage A

Functionaliteit van deverschillende klassen

Daar waar mogelijk wordt aangeraden het venster waarin het programma loopt, te maxi-malizeren.

A.1 asteroide.java

Deze klasse hoort bij de krommen besproken in x8.1.2.

Gebruiker:

De mogelijkheden van de gebruiker zijn in deze klasse verkleinen en vergroten van deorde, de kleine as en de grote as. De schuifbalken bevinden zich in deze volgorde in hetprogramma. Daarnaast kan de gebruiker ook kiezen om de asteroijde continu of discreette tekenen.

A.2 bezier.java

Deze klasse bevat het codefragment in x5.2.

Gebruiker:

De gebruiker kan deze klasse niet direct aanspreken.

A.3 bezierCirkel.java en bezierCirkel2.java

De inhoud van deze klasse wordt besproken in x5.6.

Gebruiker:

De invoer van de gebruiker is beperkt tot klikken wanneer een stapje mag verder gegaanworden in het benaderingsproces.

68

Page 76: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Ter verduidelijking:

Het verschil tussen beide klassen bestaat erin dat de tweede in een kleinere resolutie (i.e.grotere pixels) werkt dan de eerste.

A.4 bezierkromme.java

Deze klasse stelt de gebruiker in staat willekeurige B¶ezierkrommen te tekenen en daarmeete experimenteren. Deze krommen worden uitvoerig besproken in hoofdstuk 5.

Gebruiker:

Hier kan de gebruiker de B¶ezierkromme laten tekenen nadat hij de controlepunten heeftaangeklikt. Vervolgens zijn er een aantal mogelijkheden, zoals de orde verhogen, eencontrolepunt verplaatsen, een nieuwe kromme beginnen tekenen (via selectie van de con-trolepunten) of de bestaande kromme wissen. In een ander menu kan men kiezen in welkekleur men de kromme wenst te tekenen. Tot slot kan men, in het laatste menu, kiezenhoe men de kromme wil tekenen. De keuzes bestaan, naast het gebruikelijke continu ofdiscreet, uit verschillende resoluties. Als men de kromme bekijkt in grotere pixels dannormaal, is verhoging van de orde niet langer mogelijk.

A.5 bezierPlakken.java

Deze klasse hoort bij het aaneensluiten van B¶ezierkrommen, besproken in x5.5.

Gebruiker:

Vooreerst dient de gebruiker bij het opstarten van de klasse twee argumenten mee tegeven welke elk vier koppels coÄordinaten bevatten. Deze stellen de coÄordinaten van de viercontrolepunten voor. Tijdens de uitvoering van de klasse kan de gebruiker verspringen vaneen zicht op de eerste of tweede kromme, al dan niet voorbereid op de aaneensluiting, ofbeide, aaneengesloten, krommen. Deze keuze gebeurt via knoppen bovenin het venster.

Ter verduidelijking:

In het programma slaat kromme[h][i][j] op ie coÄordinaat van het je controlepunt van de he

kromme (h 2 f0,1g slaat op de ingelezen krommen, terwijl h 2 f2,3g slaat op diezelfdekrommen n¶a de transformatie welke de krommen voorbereidt op de aaneensluiting).

A.6 bresenhamCirkel.java

In deze klasse worden de pixels bepaald die een gegeven cirkelboog in een octant het bestzullen benaderen (zie hoofdstuk 3). Hierbij wordt telkens vertrokken van een snijpuntvan de cirkel met de X- of Y-as. Dankzij een kleine aanpassing van het algoritme is hetbovendien ook toepasbaar op superellipsen (x8.1.2).

69

Page 77: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Gebruiker:

De gebruiker heeft geen directe invloed op deze klasse.

A.7 bresenhamLijnstuk.java

In deze klasse worden de pixels bepaald die de beste benadering vormen van een gegevenlijnstuk. Dit algoritme is besproken in hoofdstuk 2.

Gebruiker:

De gebruiker heeft geen directe invloed op deze klasse.

A.8 bspline.java

Deze klasse tekent de B-Spline, horend bij de geselecteerde controlepunten.

Gebruiker:

De gebruiker kan in deze klasse kiezen waar controlepunten dienen te liggen, evenals welkespline dient getekend te worden. Tot slot kan hij kiezen om een controlepunt te verplaatsenof de kromme te wissen. Al deze acties worden besproken in x7.

A.9 casteljau.java

In deze klasse wordt de opbouw van een B¶ezierkromme via het algoritme van de Casteljaugeijllustreerd, zoals besproken in x5.2.

Gebruiker:

Aanvankelijk, bij het opstarten van de klasse, kunnen twee parameters meegegeven worden.De eerste parameter is een getal met als waarde het aantal milliseconden dat gewacht moetworden tussen twee opeenvolgende tekeningen. Deze parameter staat standaard op 50. Alsmen 0 ingeeft als waarde, kiest het programma de standaardwaarde. Als tweede parameterkan men ingeven hoeveel punten van de B¶ezierkromme expliciet dienen berekend te worden(minstens 5 en standaard 20). De berekende punten worden dan verbonden d.m.v. eenlijnstuk.

A.10 cirkel.java

Deze klasse toont hoe een cirkel geconstrueerd wordt als men het algoritme van Bresenham(hoofdstuk 3) gebruikt. Het maakt hiervoor gebruik van bresenhamCirkel.java (xA.6).

70

Page 78: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Gebruiker:

De gebruiker kan in deze klasse twee punten aanduiden, het centrum en een punt op decirkel, waarna de constructie van de cirkel volgens het algoritme van Bresenham begint.Voorts kan ook gekozen worden om (g)een raster te tekenen of om een nieuwe cirkel tetekenen.

A.11 clipping.java

Deze klasse stelt de gebruiker in staat een lijnstuk te clippen, zoals besproken in x1.1.

Gebruiker:

De gebruiker kan in deze klasse selecteren welke methode voor clipping gebruikt dient teworden. Ook kan hij zelf een lijnstuk aanduiden door selectie van de eindpunten. Eensgeselecteerd kan hij via de knoppen kiezen om het lijnstuk te clippen of te wissen. Voortskan hij de grootte van het venster laten variÄeren m.b.v. de slider om het e®ect op hetlijnstuk waar te nemen.

A.12 cycloijde.java

Deze klasse hoort bij de krommen besproken in x8.2.1.

Gebruiker:

Het programma tekent een cycloijde. De gebruiker kan dan via het menu selecteren of hijeen continu getekende kromme wil zien, of enkel de e®ectief berekende punten (discreet).Ook kan de gebruiker via schuifbalken de straal van de rollende cirkel (linkse schuifbalk)of de amplitude van de kromme (rechtse schuifbalk) laten variÄeren.

A.13 gaussJordan.java

Deze klasse lost een stelsel met unieke oplossing van dimensie n op ( i.e. n lineair on-afhankelijke vergelijkingen in n onbekenden). De oplossingswijze is die van Gauss-Jordan,zodat, eens de klasse verlaten is, de oplossingen direct af te lezen zijn uit de matrix in hetrechterlid.

Gebruiker:

De gebruiker kan deze klasse niet direct aanspreken.

A.14 Input.java

Deze klasse wordt gebruikt voor manipulatie van bestanden.

71

Page 79: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Gebruiker:

De gebruiker kan deze klasse niet direct aanspreken.

A.15 kegelsnede.java

In deze klasse worden de verschillende soorten kegelsneden gedemonstreerd, welke bespro-ken worden in x8.1.1.

Gebruiker

In deze klasse kan de de gebruiker ¶e¶en van de, oorspronkelijk samenvallende, brandpun-ten opschuiven over de positieve horizontale as, waarop beide zich bevinden, tot in hetoneindige. Eens men voorbij deze 'oneindige' toestand geraakt, komt men op de negatievehelft van de as terecht. Vanaf hier kan nog verder opgeschoven worden tot de brandpuntenopnieuw samenvallen. Ook kan men op eender welk moment ervoor kiezen om terug tekeren in de richting van de beginstand. Enige beperking is dat men beperkt is tussenenerzijds de cirkel en anderzijds de verticale rechte.

A.16 kgv.java

Deze klasse berekent het kleinste gemeen veelvoud van twee gehele getallen.

Gebruiker:

De gebruiker kan deze klasse niet direct aanspreken.

A.17 lame.java

Deze klasse beschrijft de krommen besproken in x8.1.2.

Gebruiker:

De gebruiker kan de karakteristieken van de kromme wijzigen via schuifbalken. Van linksnaar rechts komen zij overeen met:

² Graad van de kromme

² Halve horizontale as

² Halve verticale as

Ter verduidelijking:

Als men de graad laat variÄeren, lopen de mogelijke waarden van 1 tot 10, zoals aangeduidop de schuifbalk. De volgende waarde zou logischerwijs 11 zijn, maar wordt door hetprogramma aangepast tot 5000 - dit om de limietkromme (n!1) te bepalen.

72

Page 80: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

A.18 lijnstuk.java

Deze klasse laat de gebruiker toe de eindpunten van een lijnstuk te selecteren, waarna ditlijnstuk getekend wordt a.d.h.v. het algoritme van Bresenham (A.7).

Gebruiker:

De gebruiker kan hier, naast het selecteren van eindpunten, ook kiezen om (g)een rasterte tonen of om een ander lijnstuk te beginnen tekenen.

A.19 lissajous.java

Deze klasse demonstreert de curven van Lissajous, beschreven in x8.2.4.

Gebruiker:

Hier kan de gebruiker de waarden van de parameters instellen. Vervolgens kan hij kiezenom de kromme, die aan deze parameters beantwoordt, te tekenen. De parameters zijn in testellen via schuifbalken. In het programma neemt men zes schuifbalken waar. De waardegeassocieerd aan de schuifbalk is, rij per rij en, binnen een rij, van links naar rechts:

² Verticale-amplitudemodulator (mogelijke waarden in het interval [-200,200])

² Verticale-frequentiemodulator (mogelijke waarden in het interval [0,20])

² Verticale-fasemodulator (mogelijke waarden in het interval [0,360])

² Horizontale-amplitudemodulator (mogelijke waarden in het interval [-300,300])

² Horizontale-frequentiemodulator (mogelijke waarden in het interval [0,20])

² Horizontale-fasemodulator (mogelijke waarden in het interval [0,360])

A.20 nurbs.java en nurbs2.java

Deze klasse toont een NURBS, die de perfecte voorstelling van een cirkel is. Als degebruiker met de muis klikt in het scherm, wordt er een cirkel getekend (via het algoritmevan Bresenham) in een lagere resolutie dan de werkelijke. Vervolgens, na nog een muisklik,wordt de B-Spline getekend die de 'echte' cirkel voorstelt. Volgende muisklik zorgt ervoordat opnieuw slechts een cirkel in lage resolutie getekend wordt, om na nog een muisklikopnieuw beide tekeningen te zien.

Gebruiker:

De gebruiker kan alleen klikken om te wisselen tussen beide beelden.

73

Page 81: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Ter verduidelijking:

De tweede klasse, nurbs2.java, werkt in een kleiner venster met een nog lagere resolutie.Het verschil tussen beide klassen bestaat erin dat nurbs2.java met grotere pixels werkt.

A.21 quadratrix.java

Deze klasse demonstreert de quadratrix van Hippias, besproken in x8.2.3.

Gebruiker:

Het enige wat de gebruiker hier kan doen, is het ¯lmpje van het constructieproces starten.De gebruiker kan evenwel twee parameters meegeven bij het opstarten van de klasse (javaquadratrix parameter1 parameter2). Als eerste parameter dient het aantal te bereke-nen punten gegeven te worden. De andere parameter dient om de lengte van het tijdsin-terval aan te geven gedurende dewelke er na elke stap gewacht moet worden.

A.22 spline.java

Deze klasse toont krommen die uitvoerig besproken werden in Hoofdstuk 6.

Gebruiker:

Hier kan de gebruiker plaatsen aanduiden waar controlepunten dienen te komen. Voortskan hij ¶e¶en of meerdere soorten splines kiezen om uit te tekenen. Bij twee soorten, nl.kwadratisch en ingeklemd kubisch, is er een vrijheidsgraad, de helling van de raaklijn. Dezewordt gelijkgesteld aan de waarde die de schuifbalk aanduidt. Ook deze kan gewijzigdworden. Voorts kan nog een controlepunt verplaatst worden. Tot slot kan het schermaangepast worden qua resolutie, of leeg gemaakt.

A.23 splitsenEnKleuren.java

In deze klasse kan de gebruiker een ¯guur opbouwen door te duiden waar de hoekpuntendienen te komen. De gebruiker dient er op te letten dat de ¯guur enkelvoudig samen-hangend is. In functie van de opsplitsing is het aan te raden de ¯guur op te bouwenin tegenwijzerzin. Het algoritme (besproken in x9.2 en geprogrammeerd in A.26) is nietwaterdicht bevonden voor anders geÄoriÄenteerde ¯guren.

Gebruiker:

Bij het opstarten van de klasse kan de gebruiker meegeven hoe groot de pixels dienen tezijn (bij java splitsenEnKleuren n stelt een blok van nxn pixels ¶e¶en pixel voor). Degebruiker kan hoekpunten aanduiden. Vervolgens kan hij kiezen om de ¯guur te splitsenin driehoeken, te wissen of te kleuren (dit laatste is alleen mogelijk als de ¯guur reedsgesplitst is). Bij het ingeven van de hoekpunten wordt vriendelijk aangedrongen om de invorige rubriek vermelde beperkingen in acht te nemen.

74

Page 82: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

A.24 transformatie.java

In deze klasse kan men a±ene transformaties uitvoeren op een vlakke ¯guur. Al dezetransformaties worden besproken in Hoofdstuk 4.

Gebruiker:

Als parameter in de opdrachtregel dient een bestandsnaam meegegeven te worden. Dezebestandsnaam bevat de coÄordinaten van de hoekpunten van de vlakke ¯guur, welke ge-transformeerd zal worden. Na de selectie van de transformatie die men wil uitvoeren, kanhet nodig zijn nog enkele parameters aan te duiden zoals bv. rotatiecentrum, rotatiehoek(of beide), of translatievector, ....

Ter verduidelijking:

Als men de hoek wenst aan te duiden, mag men zeker niet vergeten dat het de hoek in destandaard goniometrische cirkel betreft, d.w.z. om 135o (3¼

4 ) aan te duiden, dient men detweede bissectrice in het tweede kwadrant t.o.v. het centrum in kwestie aan te stippen.

A.25 trochoide.java

Deze klasse toont de krommen besproken in x8.2.2.

Gebruiker:

De gebruiker heeft hier de keuze tussen een discrete of een continue voorstelling van detrochoijde. Verder kan hij, via selectie van de knop 'Epi- of Hypotrochoijde' verspringen vanhet ene naar het andere type. Daarnaast kan hij de parameters instellen op schuifbalken(v.l.n.r. afstand van het punt dat de kromme beschrijft tot het centrum van de rollendecirkel, straal van de rollende cirkel en straal van de vaste cirkel). Tot slot kan men kiezenom de trochoijde te tekenen die overeenkomt met de huidige instelling van de parameters.

A.26 veelhoek.java

Deze klasse heeft als karakteristieken de dimensie van de veelhoek (aantal (= n) hoekpun-ten), de coordinaten van de hoekpunten is een matrix van dimensie nx2. Eens de veel-hoek gesplitst is in driehoeken, wordt de karakteristiek gesplitst op true gezet en wordt ineen matrix van dimensie (n-2)x3 opgeslagen welke hoekpunten de driehoeken uitmaken.Verder is er, omdat het algoritme niet waterdicht bleek te zijn, een veiligheid ingebouwdom het programma te verlaten als men in een oneindige lus zit. Deze klasse hoort samenmet splitsenEnKleuren.java (A.23) bij Hoofdstuk 9 'Opsplitsing en inkleuring van veel-hoeken'.

Gebruiker:

De gebruiker kan deze klasse niet rechtstreeks aanspreken.

75

Page 83: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

A.27 wacht.java

Deze klasse last een pauze in in het aanroepende programma.

Gebruiker:

De gebruiker kan deze klasse niet direct aanspreken.

76

Page 84: Voorstellen van vlakke figuren in Javausers.telenet.be/tijldb/Thesis/scriptie.pdf · Voorstelling van vlakke ¯guren in Java door Tijl De Backer Promotor: Prof. Dr. H. De Schepper

Bibliogra¯e

[1] L. Ammeraal Computer Graphics for JAVA Programmers. John Wiley and Sons 1998ISBN 0-471-98142-7

[2] J. Bilo en M. Soens Leerboek der vlakke analytische meetkunde, deel II. A. Vander-linden, Brussel 1954

[3] M. Cohn, B. Morgan, M. Morrison, M. Nygard, D. Joshi and T. Trinko JAVA De-

veloper's Reference Sams Net 1996 ISBN 1-57521-129-7

[4] M. Daconta Java voor C/C++ programmeurs. Addison-Wesley 1996 ISBN 90-6789-759-0

[5] V. Fack Programmeren 1. Academia Press 1999

[6] M. Foley and M. McCulley JFC Unleashed Sams 1999 ISBN 0-7897-1466-3

[7] G. Ho®man Software Development and Object Oriented Languages. Universiteit Gent,Academiejaar 1998-1999

[8] E. H. Lockwood A book of curves. Cambridge university press 1961 ISBN 0-521-05585-7

[9] H. Serras Inleiding tot de gra¯sche technieken. Universiteit Gent, Academiejaar 1998-1999

[10] T. Swan Mastering Java With Visual J++. Sams Net 1997 ISBN 1-57521-210-2

[11] G. Van Den Berghe Numerieke methoden in de algebra. Universiteit Gent, Academie-jaar 1996-1997

[12] J. Vantroyen Voorstelling van 3D-objecten in JAVA. Universiteit Gent, Academie-jaar 1999-2000

77