39
U N I V E R S I T Ä T KOBLENZ · LANDAU (3) Rasterisierung Vorlesung „Computergraphik I“ S. Müller

Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

Embed Size (px)

Citation preview

Page 1: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU

(3) Rasterisierung

Vorlesung„Computergraphik I“

S. Müller

Page 2: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU

Rasterisierung

Page 3: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 3 -

Wiederholung I Trigonometrie

sin, cos, tan Fläche im Dreieck

Lineare Algebra Punkte und Vektoren Betrag, Normierung Skalarprodukt

• Ergebnis ist Skalar• Winkel zw. 2 Vektoren• Projektion auf

Einheitsvektor

Kreuzprodukt• Ergebnis ist Vektor• Winkel zwischen 2

Vektoren• Normale zu 2 Vektoren

Rechts-, Linkssystem

Page 4: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 4 -

Beispiel I

=001

x

=010

y

=100

z x

z

y

=× yx

z=

=

×

=

100

010

001

=× xy

z−=

−=

×

=

100

001

010

=× xx

=

×

=

000

001

001

z ?

Page 5: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 5 -

Beispiel II Fläche in einem Dreieck

αsin21 ⋅⋅⋅= baA α

a

b C

A B

αsin⋅⋅=×= babac

c

baA ×⋅=

21 c ?

Page 6: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 6 -

3D-Koordinatensysteme

x

yz

x

yz

Linke-Hand-System(Linkssystem)

Rechte-Hand-System(Rechtssystem)

Page 7: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 7 -

Kreuzprodukt

bac ×=

ab

α

bac ×=

ab

α

Linke-Hand-System Rechte-Hand-System

Page 8: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 8 -

Beispiel 1 Ein Polygon ist (oft) gegeben durch eine Liste seiner

3D-Eckpunkte, die gegen den Uhrzeigersinn eingetragen werden, wenn man von oben/draußen darauf blickt

Berechne die normierte Normale auf das Polygon in einem Rechtssystem

A

ED

C

B

ABABb

−==aAEAEa −==

b

abn ×=

n

nnn

=0

Page 9: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 9 -

Beispiel 1: Probleme Diese Normalenberechnung ist nur korrekt wenn

Flächen „planar“ Flächen konvex Punkte nicht kolinear

a

nA

ED

C

B

AE

DC

b

BPunkte nicht in einer Ebene Konkave Fläche

Page 10: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 10 -

Konvex/Konkav Konvex heißt, daß die

Verbindung zweier Punkte vollständig innerhalb der Fläche liegt

Analog: Innenwinkel nicht größer als 180°

konkav

konvex

Eselsbrücke konkav: man kann Kaffee drauf schütten

Page 11: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 11 -

Beispiel 2: Polygone mit Löchern Wie mache ich ein Loch in

ein Polygon? Doppelte Hilfskante … auch nur ein konkaves

Polygon

A

D C

B

H G

E F

P = {A, B, C, D, A, E, H, G, F, E}

Grundlegende Datenstruktur in den meisten Graphiksystemen sind daher Dreiecke 3 Punkte liegen immer in einer Ebene Normale ist eindeutig Problem: Triangulierung

Page 12: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 12 -

Beispiele: Dreiecksmodelle

Page 13: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 13 -

Gerade

Durch 2 (nicht-identische) Punkte A und B wird eine Gerade aufgespannt

Jeder Punkt X auf der Geraden ist gegeben durch:

Jeder Punkt auf der Kante (edge) zwischen A und B liegt im Parameterbereich t ∈ [0, 1]

Ein Strahl von A in Richtung B liegt im Bereich t ∈ [0, ∞[

ABABv −==

vtAX ⋅+=

A Bv

Page 14: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 14 -

Lineare Interpolation

Jeder Punkt auf der Gerade lässt sich also auch darstellen durch

Dies entspricht einer „linearen Interpolation“: t = 0: Punkt A t = 1; Punkt B t∈[0, 1]; „t mal B und den Rest von A“

Eignet sich z.B. auch zur Interpolation von Farben an den Eckpunkten

ABABv −==

vtAX ⋅+=

( ) AtBtX ⋅−+⋅= 1

A Bv

( )ABtAX −⋅+=

AtBtAX ⋅−⋅+=( ) AtBtX ⋅−+⋅= 1

Page 15: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 15 -

Zusammenfassung

Gerade

Parameterdarstellung

Lineare Interpolation

ABABv −==

A Bv

vtAX ⋅+=

( ) AtBtX ⋅−+⋅= 1

Page 16: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 16 -

A

B

C

Ebenen/Dreiecke Durch 3 Punkte wird eine

Ebene aufgespannt Parameterdarstellung:

Normalform

ABu = ACv =

XA

B

C

u

v

vtusAX ⋅+⋅+=

vuvun

××=°

0=°nAX

°n

X

1);1,0(, ≤+∈ tsts (für Dreieck)

Page 17: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 17 -

Normalform I

Interpretation: Gerade durch den Ursprung

in Richtung n Jeder Punkt X ist dann ein

Punkt der Ebene, wenn er auf diese Gerade projiziert den gleichen Abstand vom Ursprung hat, wie die Projektion von A.

0=°nAX

( ) 0=°− nAX

( ) ( ) 0=°−° nAnX

A

B

C°n

X

O

A X

Page 18: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 18 -

Normalform II

A

B

C°n

X

( ) 0=°−⋅+⋅+⋅ nAnznynx zyx

0=+⋅+⋅+⋅ dnznynx zyx

( )°−= nAd

O

A

d

=zyx

X

z

y

x

nnn

n

( ) ( ) 0=°−° nAnX

d beschreibt den (kürzesten) Abstand der Ebene vom Ursprung

Das Vorzeichen gibt Auskunft über die Lage des Urpungs zur Ebene d=0: Ursprung Teil der Ebene d>0: Ursprung im vorderen Halbraum d<0: Ursprung im hinteren Halbraum

Page 19: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 19 -

Normalform III Typische Schreibweise für

Ebenengleichung

Wobei a, b, c die Komponenten der (normierten) Normalen sind und d den Abstand der Ebene vom Ursprung bezeichnet

Oft sinnvoll: die 4 Parameter a,b,c,d in die Datenstruktur für das Dreieck aufnehmen, da sie dann nicht immer neu berechnet werden müssen

Einsetzen eines beliebigen Punktes

P ist Teil der Ebene

P liegt im hinteren Halbraum

P liegt im vorderen Halbraum

0=+⋅+⋅+⋅ dzcybxa

0=+⋅+⋅+⋅ dpcpbpa zyx

0<+⋅+⋅+⋅ dpcpbpa zyx

0>+⋅+⋅+⋅ dpcpbpa zyx

=

z

y

x

ppp

P

Page 20: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 20 -

Beispiel Berechnen sie die

Ebenengleichung der oberen Würfelfläche

x

z

y

)0,0,0(

)2,2,2(

==010

yn ( )2,2,2=A

0=°nAX

( ) 0=°− nAX

0010

222

=

zyx

00)2(1)2(0)2( =⋅−+⋅−+⋅− zyx

02 =−y

2=y

Page 21: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 21 -

Rastergraphik Auf der Graphikkarte haben

wir einen eigenen Bildspeicher

Hier „schreiben“ wir unsere Bilder rein

Ein Digital/Analog-Wandler liest diesen periodisch aus und wandelt den Inhalt in das Bildsignal für den Monitor um.

Typisches Format: 3 Byte pro Pixel (r,g,b)

Bildspeicher

AD/Wandler

Page 22: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 22 -

Beispiele Wir haben einen Bildschirm von 1024x768 Pixeln und

je 1 Byte für r, g und b Wieviele Farbe können wir darstellen?

Wie groß muss der Bildspeicher sein?

Bei einer Bildwiederholrate von 60 Hz, wie lange ist jedes Bild sichtbar?

216.777.16256256256 =⋅⋅

ByteByte 296.359.237681024 =⋅⋅

msekseksek 16016,0601 ≈=

Page 23: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 23 -

CRT (Kathodenstrahlröhre)

Page 24: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 24 -

Flachbildschirme

Page 25: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 25 -

TFT (Thin Film Transistor)/LCD

Liegt Spannung an, also unter Einwirkung eines elektrischen Feldes, sind die Flüssigkristalle gerade ausgerichtet. Das polarisierte Licht wird am zweiten Polarisationsfilter absorbiert. Damit kann das Licht an dieser Stelle des TFT Bildschirms nicht austreten.

Für jedes Pixel 3mal (rgb)

Page 26: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 26 -

Pixel Wir haben Ausgabegeräte mit

endlicher, fester Auflösung und damit ein festes Raster

Bildpunkte werden „Pixel“ genannt für „picture element“

In Wirklichkeit ist ein Pixel kein fester Punkt, sondern eine Fläche

Rasterisierung: Wir nähern z.B. eine Linie durch

„Flächen“ an Problem der Unterabtastung

(englisch: „aliasing“) führt zu gezackten Strukturen (speziell bei schrägen Linien)

Page 27: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU

C++ kompakt - Teil 2

Matthias Biedermann(Dank an Markus Geimer)

Page 28: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 28 -

Wiederholung Organisation von Projekten in

Definitionsdateien (.h) Implementierungsdateien

(.cpp, .cxx) Startpunkt der Ausführung:

main-Funktion Vor der Benutzung einer

Klasse/Funktion, einbinden der Definitionsdatei mit #include “name” #include <name>

Vermeiden von Mehrfach-Includes durch

#ifndef SYMBOL #define SYMBOL // Inhalt der // Definitionsdatei #endif

oder

#pragma once

Page 29: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 29 -

Wiederholung (2) Klassendefinition:

class Name{ public: [...] protected: [...] private: [...]};

Methoden-Implementierung:Typ Name::Methode(Params){ [...]}

Konstruktoren: Kein Rückgabewert Name identisch mit

Klassenname

Ein-/Ausgabe mit Streams Vordefiniert:

cin, cout, cerr, clog Verwendet die Operatoren

<< und >> Sind definiert im

Systemheader iostream, im Namensraum std

Page 30: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 30 -

Destruktoren Ein Destruktor ist das Gegenstück zu einem Konstruktor. Er wird

automatisch für jedes Objekt am Ende seiner Lebensdauer auf-gerufen.

Ein Destruktor ist immer parameterlos und besitzt ebenfalls keinen Rückgabewert. Sein Name setzt sich aus dem Klassen-namen und einer vorangestellten Tilde zusammen.

Beispiel:Vector2D::~Vector2D(){ // Bei Vector2D ist nichts freizugeben!}

Destruktoren sollten immer dann verwendet werden, wenn in einer Klasse Member-Variablen dynamisch angelegt werden. Anderenfalls wird der reservierte Speicher nie freigegeben!

Page 31: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 31 -

Referenzen “Eine Referenz ist ein alternativer Name für ein Objekt.” Vorstellung: Eine Referenz ist ein (nicht veränderbarer) Zeiger

auf ein Objekt, der bei jeder Benutzung dereferenziert wird. Damit eine Referenz immer an ein Objekt gebunden ist, muss

man sie zwingend initialisieren. Beispiel:

int x = 17;int& xr = x;int y = x; // y = 17int z = xr; // z = 17, da xr Synonym für x

Anwendung: Call-by-reference

Page 32: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 32 -

Beispiel Aufrufsequenz:

int a = 2;doMagic(a);

Call-by-value:

void doMagic(int x) { x = 5; // x ist lokale Kopie, a unverändert}

Call-by-reference:void doMagic(int& x) { x = 5; // a = 5, da x hier Synonym für a}

Bei großen Objekten kann das Anlegen einer lokalen Kopie für Call-by-value sehr teuer werden! � Referenzen einsetzen

Page 33: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 33 -

Automatisch erzeugte Methoden Definiert der Programmierer keinen eigenen Konstruktor, dann

erzeugt der Compiler implizit einen leeren Default-Konstruktor (ohne Parameter).

Ein leerer Destruktor wird ebenfalls automatisch erzeugt. Der sog. Kopier-Konstruktor (hier am Beispiel der Vector2D-

Klasse)

Vector2D(Vector2D& value);initialisiert die Instanz mit einer 1:1-Kopie des Objektes value (Vorsicht bei dynamisch erzeugten Member-Variablen!).

Dazu kommt der Zuweisungsoperator =, der die Daten der Objektes auf der rechten Seite 1:1 in das Objekt auf der linken Seite kopiert (Nochmal Vorsicht!).

Page 34: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 34 -

Überladen von Funktionen In C++ ist es möglich Funktionen zu definieren, die sich nur in der

Anzahl bzw. den Typen der Parameter unterscheiden (overloading).� Unterscheidung nur durch den Rückgabetyp reicht jedoch nicht!

Beispiel:float sqrt(float value);double sqrt(double value);

Bei einem Aufruf wird anhand der realen Parameter entschieden, welche Variante auszuführen ist:

float f = 3.14159f;double d = 2.71828;float x = sqrt(f); // Ruft float-Variante aufdouble y = sqrt(d); // Ruft double-Variante auf

Page 35: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 35 -

Überladen von Operatoren Es ist auch möglich, die Operatoren für eigene Datentypen zu

überladen. Man kann jedoch weder neue Operatoren definieren, noch die Funktionsweise für elementare Typen abändern.

Beispiel:

Vector2D operator +(Vector2D& a, Vector2D& b) { Vector2D result; result.mElement[X] = a.x() + b.x(); result.mElement[Y] = a.y() + b.y(); return result;}

Wichtig: “+=“ ist ein eigener Operator. Durch Überladen von “+“ wird er nicht automatisch definiert.

Page 36: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 36 -

Eine gute Lösung... (1)

Vector2D& Vector2D::operator +=(const Vector2D& rhs){ mElement[X] += rhs.mElement[X]; mElement[Y] += rhs.mElement[Y]; return *this;}

Zuweisungen habenin C++ auch einErgebnis!

Nur die Referenzübergeben und keineKopie erzeugen.

rhs wird nichtverändert, istalso konstant.

Innerhalb der Klassehat man direkten Zugriffauf alle Attribute. Auchauf die als Parameterübergebener Objekte.

Page 37: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 37 -

Eine gute Lösung... (2)

const Vector2D operator +(const Vector2D& lhs, const Vector2D& rhs){ return Vector2D(lhs) += rhs;}

Frage: Warum ist der Ergebnistyp ein const Vector2D ?� Sonst wäre auch a+b = c; möglich (grober Unfug)!

Nur die Referenzenübergeben und keineKopien erzeugen.

rhs und lhs werdennicht verändert, sindalso konstant.

Erzeuge eine temporäreInstanz, initialisiere sie mitdem Inhalt von lhs undaddiere darauf rhs.

Page 38: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 38 -

Beispiel#include <iostream>#include “Vector2D.h”

using namespace std;

int main() { Vector2D a(1, 2); Vector2D b(7, 5);

Vector2D c = a + b;

cout << “Ergebnis: (“ << c.x() << “,” << c.y() << “)” << endl;

return 0;}

Page 39: Vorlesung „Computergraphik I“ S. Müllercg/ws1213/cg1/vorlesung/03_rasterisierung.pdf · Ein Polygon ist (oft) gegeben durch eine Liste seiner 3D-Eckpunkte, die gegen den Uhrzeigersinn

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 39 -

Anmerkungen Durch die Implementierung von operator + auf der Basis von

operator += muss nur noch eine Operator-Implementierung gepflegt werden.

Operatoren sollten ‘erwartungskonform’ sein. Beispiel:Die Multiplikation eines Vektors mit einem Skalar ist kommutativ. Daher sollte man hierfür zwei Operatoren überladen.const Vector2D operator *(float s, const Vector2D& v);const Vector2D operator *(const Vector2D& v, float s);