Gittergenerierungsmethoden zur Finite Elemente Simulation aus

Werbung
Gittergenerierungsmethoden
zur Finite Elemente
Simulation aus Bilddaten
Bachelorarbeit
Bachelor of Science
zur Erlangung des akademischen Grades
Westfälische Wilhelms-Universität Münster
Fachbereich Mathematik und Informatik
Institut für Numerische und Angewandte Mathematik
Betreuung:
Prof. Dr. Martin Burger
Dr. Frank Wübbeling
Eingereicht von:
Matthias Redecker
Münster, Oktober 2010
Zusammenfassung
In dieser Arbeit werden wir uns einige Grundlagen zur Generierung von Gittern
aneignen. Mit Gitter meinen wir Datenpunkte die wir auf eine bestimmte Weise
miteinander verknüpfen. Zuerst gehen wir dabei kurz auf die Gewinnung von
Bilddaten ein und betrachten danach auf welche Weise wir auf auf den Bilddaten Gitterstrukturen erstellen können, die die Eigenschaften des vernetzten
Objektes möglichst gut, das heiÿt möglichst schnell, genau und einem möglichst
wenig fehleranfälligen Algorithmus, darstellen. Dazu werden wir uns verschiedene Problemstellungen zuerst im zwei- und dann im drei-dimensionalen ansehen.
2
Eidesstattliche Erklärung
Hiermit versichere ich,
Matthias Redecker, dass ich die vorliegende Arbeit selbst-
ständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel
verwendet habe. Gedanklich, inhaltlich oder wörtlich übernommenes habe ich
durch Angabe von Herkunft und Text oder Anmerkung belegt bzw. kenntlich
gemacht. Dies gilt in gleicher Weise für Bilder, Tabellen, Zeichnungen und Skizzen, die nicht von mir selbst erstellt wurden.
Münster, 22. Oktober 2010
3
Inhaltsverzeichnis
1
2
3
4
5
6
7
Einleitung
5
Segmentierung
7
2.1
Level-Set Methode
. . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
Marching Cubes
8
. . . . . . . . . . . . . . . . . . . . . . . . . . .
9
Grundlagen zur Netzgenerierung
11
3.1
Verschiedene Netzgenerierungsmethoden . . . . . . . . . . . . . .
11
3.2
Basisfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.3
Mesh Size Function . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.4
Delaunay-Triangulierung . . . . . . . . . . . . . . . . . . . . . . .
15
Nachträgliche Netztqualitätsverbesserungen
17
4.1
Laplacian smoothing . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.2
Verschiedene Gitterglättungen in 3 Dimensionen
19
. . . . . . . . .
Spezielle 3D Gitterverfahren
25
5.1
BCC Gitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
5.2
CFE Gitter
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
5.3
Diskussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
Beispiele
35
6.1
Verschiedene Triangulationen
. . . . . . . . . . . . . . . . . . . .
6.2
Finite Elemente Simulation
35
. . . . . . . . . . . . . . . . . . . . .
37
Fazit
40
4
1
Einleitung
Wir möchten uns in dieser Arbeit mit der Generierung von Gittern aus Bilddaten beschäftigen, da diese der Grundbaustein für jede Finite Elemente Anwengung ist. Wofür brauchen wir wiederum Finite Elemente? Wir betrachten
zunächst verschiedene Bilddaten. Mit Bilddaten können die gespeicherten Daten eines CT-Bildes, oder auch die Daten einer 3D Ansicht eines Stahlträgers
gemeint sein. Um diese Bilder als Daten speichern zu können zerlegt man sie
in eine endliche(nite) Anzahl von Elementen. Indem man auf den Elementen
Partielle Dierentialgleichungen deniert versucht man nun reale Geschehnisse
darzustellen. Die Anwendung der Finite Elemente Methode entstand zunächst
aus dem Ingenieurwesen, wo man zum Beispiel Stahlträgerkonstruktionen auf
ihre Stabilität testet, indem man das Gerüst in viele Elemente aufteilt und dann
Druck aus verschiedenen Richtungen simuliert. Auf diese Weise möchte man die
Schwachstellen solcher Konstruktionen herausnden, ohne sie bauen zu müssen.
In den letzten Jahren hat die FE Simulation auch in der Medizin immer mehr
an Bedeutung gewonnen. Stahlträgerkonstruktionen kann man beispielsweise
auf ähnliche Weise wie das Knochengerüst testen. Dies kann zur zum besseren
Verständnis von Osteoporose dienen, sowie zur besseren Behandlung. Durch die
Simulationen kann man besser auf die Knochenchwächen reagieren, denn durch
die Nachbildung der Knochenstrukturen mit FE-Simulationen kann man genau
erkennen in welchem Maÿe und bei welchen Bewegungen sich die Krankheit
besonders bemerkbar macht. Die enorme Verbesserung künstlicher Gelenke in
den letzten Jahrzenten ist ebenfalls zum Teil auf die Simulation mittels FEMethoden zurück zu führen.
FE helfen uns also Dinge zu verstehen oder Dinge mittels Programmierung
zu testen, bei denen ein realer Versuchsaufbau nur schwierig zu realisieren wäre.
Um einen Gegenstand von Interesse (den wir später häug einfach mit
M
bezeichnen) in Elemente zu zerlegen, konstruieren wir eine Gitterstruktur auf
diesem. Diese Struktur soll die topologischen Eigenschaften des Gegenstandes
möglichst gut beschreiben. Da es aufgrund der endlichen Speicherkapazität eines
Rechners unmöglich ist das ganze Objekt, wie es in der Realität existiert, zu
speichern, legen wir Punkte durch ein das Objekt umfassende Gebiet, in denen
wir jeweils ihre Position und ihre Verknüpfung zu den umliegenden Punkten
und andere Dinge, wie zum Beispiel ihren Abstand zum Rand, speichern. Wir
erhalten mittels der verknüpften Punkte eine Annäherung an das Objekt. Darauf
werden wir später noch im Speziellen eingehen. Diese Punkte werden wir auch
häuger Knoten oder Knotenpunkte nennen.
Ein Element besteht dann aus einer bestimmten Zahl von Knoten, die von der
zugrundeliegenden Gitterstruktur abhängt, die miteinander verbunden sind und
zwischen denen und ihren Verbindungen kein weiterer Knoten mehr liegt.
Eine Zerlegung die bestens bekannt ist, ist die eines Bildes in Pixel. Hier
wird das Gesamte Gebiet, in gleichgroÿe Quadrate aufgeteilt und die Farbe jedes
5
Pixels abgespeichert. Eine solche Zerlegung ist für FE-Simulationen jedoch meist
ungeeignet, denn der Speicherbedarf ist sehr groÿ, da wir keine strukturellen
Eigenschaften des Objektes ausnutzen und die Pixel überall gleich groÿ sind
egal ob das Objekt an einer gegebenen Stelle grobe oder feine Konturen besitzt.
Wir werden darauf in den kommenden Kapiteln noch genauer eingehen.
Abbildung: 1.1; Ein Beispiel für eine Vernetzung. Die Triangulierung eines Kreises.
Quelle [13].
In Kapitel zwei werden wir uns zunächst damit beschäftigen wie wir eine
Funktion auf einem bestimmten Gebiet
jektes
M
Ω
erhalten, die den Rand unseres Ob-
beschreibt. Danach werden wir in Kapitel drei sehen, wie wir
M
mit
dem Wissen um eine solche Funktion in ein Gitter einbetten, und was für verschiedene Möglichkeiten uns dabei zu Verfügung stehen. Am Ende von Kapitel
drei beschäftigen wir uns mit der Delaunay Triangulierung. Diese Triangulierung wird sehr häug verwendet und weist gute Eigenschaften auf.
Da Triangulierungen teilweise schlecht geformte Elemente bilden, gehen wir in
Kapitel vier darauf ein wie man solche Elemente nachträglich verbessern oder
aus dem Gitter entfernen kann.
In Kapitel fünf wenden wir uns zwei speziellen Gitterkonstruktionen zur
Anwendung auf 3D Objekte zu. Nach dem wir uns mit diesen Gittern genauer
befasst haben, betrachten wir in Kapitel sechs noch einmal ein paar Beispiele.
6
2
Segmentierung
Das Ziel dieses Kapitels ist es nicht Segmentierung als solche zu erklären, sondern wir möchten hier darauf eingehen, wie wir für unsere Zwecke die Ränder
der von uns betrachteten Gebiete berechnen.
Wenn wir ein Gitter in einem bestimmten Gebiet
Ω
konstruieren, ist es
wichtig zu wissen wo in dem Gebiet die Ränder des von uns betrachtetem Objekt
liegen. Denn genau diese Ränder möchten wir schlieÿlich mit unserem Gitter
approximieren.
Wir möchten mit Hilfe einer
signierten Distanzfunktion Φ
den Rand unseres
Objektes bestimmen.
Da wir in euklidischen Räumen
wir
Φ
Sei
x ∈ Rn und A ⊂ Rn .
d die euklidische Metrik
Sei
Rn (meist n = 2 oder n = 3) arbeiten, können
über die euklidische Abstandsmetrik unseres Raumes denieren.
im
Rn ,
dann denieren wir den Abstand von x zu
A als:
D(x, A) = min d(x, y).
y∈A
Auf dieser Basis denieren wir für
M ⊂ Ω ⊂ Rn , ∀x ∈ Ω :
(
D(x, ∂M )
x∈
/M
Φ(x) =
−D(x, ∂M ) x ∈ M .
Aufgrund der Denition von D gibt uns
−∇D(x, y) den Vektor an der direkt
von x nach y zeigt. Für einen Vektor der genau in der Mitte zwischen x und
y liegt, gibt D einen halb so groÿen Wert an. Somit gilt für D in euklidischen
Räumen die Eikonalgleichung.
k∇Φ(x)k = 1
(1)
Dies gilt leider nicht für Punkte die zu zwei Randpunkten die gleiche Entfernung haben, also den Punkten auf der Mittelachse. Die Menge dieser Punkte
ist jedoch eine Nullmenge, sodass wir sie vernachlässigen können.
Weitere Eigenschaften sind, dass D einen Knick auf dem Rand des Objektes
hat. Hier hat D ein lokales Minimum. Unsere signierte Distanzfunktion hingegen weist einen solchen Knick nicht auf und ist deshalb dierenzierbar.
Signierte Distanzfunktionen sind eine Teilmenge der impliziten Funktionen.
Bei einer impliziten Funktion ist die Oberäche eines Objektes implizit durch
die Nullstellen der Funktion gegeben, z.b. die Nullstellen von
Φ(x) = x2 − 1,
die Punkte -1,1 geben den Rand an [10]. Weitere Ausführungen über implizite
Funktionen kann man in Kapitel eins von [10] nachlesen.
Bei numerischen Berechnungen haben wir nun dass Problem, dass wir nicht
7
unendlich viele Punkte speichern können, um das Objekt sehr realitätsnah abzubilden. Das Gitter, dass wir in unserem Gebiet des
Rn
erzeugen, erfasst nur
eine endliche Anzahl von Punkten des reellen Gebietes. Deswegen erhalten wir
nur Annäherungen an unsere Randpunkte.
2.1
Level-Set Methode
Wir möchten nun eine Funktion
Φ
bestimmen, mit der wir in jedem Kno-
ten unseres Gitter eintragen können, ob dieser Punkt innerhalb(Φ
auÿerhalb(Φ
>0)
unseres Objektes liegt, oder genau auf dem Rand(Φ
<0) oder
= 0). Mit
der level-set Methode versucht man Objekte und falls gegeben, deren Bewegung zu verfolgen. Wir machen die Level-set Funktion
Φ
zu einer von der Zeit
abhängigen Funktion und ermitteln den Rand des Objektes, indem wir unsere
Funktion sich entlang ihrer Normalenrichtung ausbreiten lassen.
Die Level-set Funktion ist dann eine Funktion
Φ(t, ·)
von
Ω
nach
R
und Lösung
der Hamilton-Jacobi Gleichung:
∂t Φ − f (t, x)|∇Φ| = 0
(2)
Die Funktion f beschreibt die Bewegung der Objektoberäche.
In der Regel ist unsere Funktion nicht analytisch deniert [2]. Deswegen lösen
wir die Hamilton-Jacobi Gleichung (Gleichung (2)) numerisch, mittels verschiedener (iterativer) Lösungsverfahren, die man z.B. in [10] Kapitel 2.5 nachlesen
kann.
Wenn wir fordern, das unsere level-set Funktion auch eine signierte Distanzfunktion ist, so gilt wieder die Eikonalgleichung für
Φ.
Erfüllt
Φ
die geforderten
Gleichungen, so gelten folgende Eigenschaften:
Der Abstand eines Knoten x zum Rand ist:
|Φ(x)|,
und der Einheitsvektor:
N=
für alle x
∈ Ω,
∇Φ
= ∇Φ
||∇Φ||
Es ist durchaus möglich, dass unsere so erhaltene signierte Distanzfunktion,
eine wesentlich höhere Auösung aufweist, als wir zum Generieren eines Gitters
benötigen. Ist das der Fall, modellieren wir die Geschwindigkeit mit Hilfe der
Krümmung des Randes, um hochfrequente Gitter zu glätten.
Die Krümmung ist deniert durch:
κ = ∇N = ∇∇Φ/||∇Φ|| = ∇∇Φ = ∆Φ
Dann können wir die Kräfte wie folgt beschreiben:
f = −bκN,
8
für
b > 0.
Somit lautet die zu lösende level-set Gleichung nach der Umformung:
Ψt = bκk∇Ψk
Wir nennen die neue Distanzfunktion hier
(3)
Ψ, da sie, durch den Ansatz, f mittels
Φ keine signierte Distanz-
der Hauptkrümmung zu bestimmen, im Gegensatz zu
funktion mehr ist.
Wir berechnen
Ψ
nun durch die iterative Lösung der Gleichung:
Ψτ + S(Ψ0 )(kk∇Ψkk − 1) = 0
(4)
Weiterführende Erläuterungen zu den Gleichungen (3) und (4) ndet man auch
in [2].
Mithilfe dieses Krümmungsansatzes können wir auch erkennen, wo der Rand
eine besonders hohe Auösung zwecks einer guten Approximation benötigt. Desweiteren sehen wir, wenn wir die Werte von
Ψ in die Knotenpunkte eines Gitters
eintragen, welche Zellen vom Rand geschnitten werden. Nämlich die Zellen, die
sowohl Knoten im Objektinneren(Ω− ) als auch im Äuÿeren(Ω+ ) besitzen. Bei
diesen Zellen sind Verfeinerungen des Gitters besonders wichtig, falls der Rand
des Objektes sehr nah an einer Wand der Zelle liegt, um Rundungsfehler möglichst zu vermeiden.
Ein paar Abschnitte weiter, werden wir zum Generieren einer mesh size function diese Ansätze wieder aufgreifen. Doch bevor wir dazu kommen, möchten wir
erst einmal, noch eine besondere Segmentierungsmethode betrachten, und uns
im nächsten Kapitel überlegen, in was für ein Gitter wir die durch die level-set
Funktion gewonnenen Erkenntnisse, einbetten.
2.2
Marching Cubes
Eine weitere Möglichkeit
∂M
zu bestimmen ist die Modellierung als Voxelda-
tenmengen. Voxel ist die Abkürzung für volumetric pixel [9]. Diese volumetric
pixel werden als Datenpunkte in regelmäÿigen Abständen angeordnet.
In jedem Punkt wird, je nach Verarbeitungszweck, zum Beispiel ein Farbwert
oder eine Dichte gespeichert. Der Marching Cubes Algorithmus [5] verarbeitet
diese Bildpunkte zu einem strukturiertem Würfelgitter. Sei D(i,j,k) der Dichtewert des Voxelgitters an der Stelle (i,j,k). Vor der Verarbeitung der Daten muss
noch ein Schwellenwert t eingeben werden. Ist D(i,j,k)≥
im Objekt, bei D(i,j,k)6=
t
t
so liegt der Punkt
auÿerhalb. Der MC Algorithmus durchschreitet das
Voxelgitter und bildet aus jeweils acht, einen möglichst kleinen Würfel bildenden, Punkten eine Zelle des Gitters. Dabei kann nun jedem Voxel der Wert
0(D(i,j,k)6= t) oder 1(D(i,j,k)≥ t) zugeordnet werden. Legt man die 8 Werte der
Voxelpunkte hintereinander so erhält man eine binäre Zahl. Als Dezimalzahl
9
Abbildung 2.1: Eine Nachschlagtabelle der 15 toplogisch unterschiedlichen Figuren für den MC Algorithmus.
Quelle: [5].
erhalten wir eine Zahl
m ∈ {0, . . . , 255}.
Aufgrund dieser Zahl wählt der Algo-
rithmus eine Konguration aus einer vorgefertigten Nachschlag Tabelle aus. Im
wesentlichen gibt es 15 verschiedene Fälle.
Für jeden Würfel führt der MC Algorithmus folgende Schritte aus:
(1) Berechne Index des Würfels anhand Dichtewerte
(2) Erfrage mittels Index Liste der geschnittenen Würfelkanten
(3) Berechne Meshknoten mittels linearer Interpolation
(4) Approximiere die Normalen an Würfelknoten
(5) Interpoliere die Normalen der Meshknoten
(6) Ausgabe der gefundenen Knoten und der Normalen [5].
Ein Problem, das bei dieser Art der Objektrandberechnung auftritt ist, dass
es sein kann, dass zwei nebeneinanderliegende Würfel keine angrenzenden Kanten aufweisen. Es gibt verschiedene Ansätze dem entgegen zu wirken. Eine ist
die die Kanten mit Dreiecken zu glätten, oder das ganze System durch Tetraeder
statt Würfeln zu konstruieren, oder andere Glättungsverfahren in den Algorithmus einzusetzen.
Weitere Nachteile des MC Algorithmus sind, dass er erstens kein bereits
vorhandenes Wissen über die Struktur des betrachteten Objektes nutzt, bei
sehr hoher Polygonzahl verliert er an Ezienz, desweiteren geht er von glatten
Oberächen aus, wodurch leicht Artefakte an spitzen Kanten entstehen. Der
Algorithmus ist in seiner Rohform ungeeignet für irreguläre Gitter. Irreguläre
Gitter sind Gitter in denen nicht alle Zellen gleich groÿ sind. Wir möchten es an
dieser Stelle aber erstmal dabei belassen, es gibt noch viele andere als die hier
beschriebenen Segmentierungsmethoden, und viele die auf den hier vorgestellten
aufbauen.
Wir beschäftigen uns als nächstes etwas intensiver mit den verschiedenen
Gitterformen.
10
3
Grundlagen zur Netzgenerierung
3.1
Verschiedene Netzgenerierungsmethoden
Es gibt verschiedene Möglichkeiten ein Gitter zu konstruieren. Schlieÿlich kann
man prinzipiell jede willkürliche Verknüpfung von Punkten als Gitter bezeichen,
man kann sich aber vorstellen das nicht jedes Gitter für numerische Berechnungen hilfreich ist. Um Gitter zu konstruieren, die implementierbar sind, müssen
wir nach einem bestimmten Konzept vorgehen.
Eine mögliche Vorgehensweise ist ein kartesisches Gitter zu konstruieren. Es hat
eine äuÿerst simple Struktur. Es besteht im ganzen Gebiet aus gleichgroÿen Zellen(z.B. Quadraten im 2-dimensionalem Raum). Durch die einfache Struktur nden wir für jeden Knoten x, nach wenigen Berechnungsschritten, die zugehörigen
Zellen. Ebenfalls können wir in ein Kartesisches Gitter leicht level-set-Methoden
und fast-marching-Methoden implementieren. Bei dieser Methode nähern wir
den Rand in den entsprechenden Gitterzellen durch bilineare Interpolation an.
Daraus, dass wir die Zellen einheitlich gewählt haben, ergibt sich jedoch auch ein
Problem. Benötigen wir in einer Zelle des Gitters eine Verfeinerung, so müssen
wir diese auf das gesamte Gitter übertragen. Die Anzahl der Knoten wächst also
mit jedem Verfeinerungsschritt quadratisch in 2D, bzw. kubisch in 3D an. Diese
Eigenschaft sorgt dafür, dass das Kartesische Gitter eine Menge Speicherplatz
beansprucht, sobald wir unser Gitter verfeinern.
Um den Speicherplatzbedarf zu reduzieren ist eine Alternative, ein einheitliches Gitter mit einer octree Struktur zu konstruieren. Octree heiÿt, dass jede
Zelle die wir verfeinern in acht gleich groÿe Zellen, der Stuktur des Gitters entsprechend, geteilt wird(im 3-dimensionalen Raum, in 2D wäre es quadtree). Der
Struktur des Gitters entsprechend bedeutet, dass die acht verfeinerten Zellen
wieder die gleiche Form haben, wie die gröbere Zelle.
Dieses Gitter kann, wie das kartesische Gitter, aus Quadraten, bzw. Würfeln
bestehen, innerhalb denen wir wie zuvor bilineare bzw. trilineare Interpolation
durchgeführt haben. Wir passen nun das Gitter entsprechend der benötigten
Genauigkeit an, das heiÿt am Rand teilen wir die Zellen so häug wie nötig und
innerhalb und auÿerhalb des Objektes nehmen wir gröÿtmögliche Zellen um den
Rechenaufwand zu reduzieren. Siehe Abbildung 3.1.
Dadurch wird der Rechenaufwand asymptotisch proportional zur Länge des
Randes [12]. Welchen Verfeinerungsgrad wir an welcher Stelle unseres Gitter
benötigen können wir mit Hilfe einer mesh-size function bestimmen. Wie man
eine solche Funktion bestimmt besprechen wir zwei Abschnitte weiter.
Eine weitere Möglichkeit, unsere Punktmenge zu vernetzen, ist ein unstrukturiertes Gitter zu verwenden. Auf diese Weise können wir direkt da, wo wir sie
benötigen kleine Zellen erstellen, und sonst möglichst groÿe Zellen verwenden.
Der Rechenaufwand ist ähnlich wie oben, siehe [12]. Ein zusätzlicher Vorteil ist,
dass wir die Gitterzellen, so einbetten können, das der Rand des Objektes genau
auf den Rändern der Zellen liegt.
11
Benutzen wir, wie in Abbildung 3.1, unstrukturierte Dreiecke, so reduziert
sich der Berechnungsaufwand weiter, da wir in der Situation linear interpolieren, andererseits verlieren wir dadurch im Gegensatz zur bilinearen Interpolation auch an Genauigkeit. Dies erkennt man schnell, wenn man den eckigen
Rand der unstrukturierten Triangulierung mit den Rändern der oberen beiden
Vernetzungen vergleicht.
Abbildung: 3.1: Die drei verschiedenen Gitterstrukturen, angewandt auf das
selbe Objekt.
Quelle: [12].
3.2
Basisfunktionen
Wie kommt diese Interpolation zustande? Wir haben bereits mehrfach die Datenspeicherung in Knotenpunkten erwähnt. Hier speichern wir die Basisfunktio-
12
nen unseres Netzes. Die Topologie des Netzes wird mithilfe dieser Funkionen im
Netz gespeichert. Dies reduziert den Speicheraufwand für unstrukturierte Netze,
denn hier verwenden wir wie schon erwähnt stückweise lineare Interpolation. Das
heiÿt wir speichern in den Knoten des Gitters, einfache lineare Basisfunktionen,
um die jeweiligen direkten Nachbarknoten zu identizieren.
In strukurierten Gittern liegt der Rand des betrachteten Objekts in der
Regel nicht auf den Rändern der Zellen oder schneidet Knotenpunkte, wie man
in Abbildung 3.1 gut sieht. Da die Gitter strukturiert sind wissen wir wo die
direkten Nachbarn liegen, wir müssen jedoch kompliziertere Basisfunktionen
wählen, um den Rand des Objektes zu interpolieren.
3.3
Mesh Size Function
Unabhängig davon, ob wir eine octree Struktur oder unstrukturierte Vernetzungen zur Gitterkonstruktion verwenden, ist es für uns von Interesse, an welchen
Stellen wir unser Gitter sehr fein wählen sollten, um unser Objekt möglichst
gut zu approximieren, beziehungsweise wo sehr grob um möglichst viel Speicherplatz zu sparen.
Dazu wollen wir im folgenden eine Funktion für unseren Raum denieren, die
uns genau dies angibt. Die einzelnen Formulierungen der Nebenbedingungen
ndet man in Referenz [12]. Um eine solche Funktion sinngemäÿ zu denieren,
überlegen wir uns in welchem Umgebungen unser Gitter eine feine Zellstruktur
benötigt, und welchen Nebenbedingungen unsere Funktion genügen soll. Die
mesh size function
gibt uns dann, für jeden Punkt in
M,
den optimalen Ab-
stand zum nächsten Knoten an.
Oensichtlich braucht man überall dort ein feines Gitter, wo die Krümmung
des Randes besonders stark ist. Wir möchten dies als Nebenbedingung für die
noch zu erzeugende mesh-size function h formulieren. Dazu sei
mung des Randes an der Stelle x∈
Ω
κ(x)
die Krüm-
gegeben durch:
κ = ∇(
∇Φ
)
k∇Φk
Der Abstand von einem Knoten x zu einem anderen Knoten y soll durch h
angegeben werden. Deswegen überlegen wir uns, dass h antiproportional zu der
Krümmung
κ
sein muss, damit sich die Abstände der Knoten bei zunehmender
Krümmung verringern. Wir erhalten als Nebenbedinung:
Curvature Adaption:
h(x) ≤
(
hcurv (x) =
∞
13
sonst
1
|κ(x)| für
Φ(x) = 0
(5)
Wir haben nun eine Nebenbedingung bezüglich der Randkrümmung für h
formuliert.
Eine weitere Bedingung die wir stellen ist, dass h an die lokalen Gegebenheiten des Objektes angepasst ist. Denn auch wenn zum Beispiel die Krümmung
des Objektrandes in x gering ist, so kann das Objekt selbst an der Stelle schmal
sein. Da man sich leicht vorstellen kann, dass man für ein kleineres Objekt, kleinere Zellen konstruiert, ist es naheliegend an schmaleren Stellen kleinere Zellen
zu fordern, also den Abstand von einem zum anderen Knoten zu verkleinern.
Bleibt noch zu klären was schmal heiÿt. Eine Möglichkeit die lokale Gröÿe des
Objektes zu bestimmen, ist die Mittelachse des Objektes zu bestimmen.
Die Mittelachse ist die Menge der Punkte innerhalb des Objekts, die zu mindestens zwei Stellen des Randes den gleichen Abstand aufweisen.
Wir bestimmen für jeden Punkt der Mittelachse den Abstand zum Rand. Dadurch erhalten wir eine Funktion, die uns für Punkte innerhalb des Objektes(
woanders wäre es auch nicht sinnvoll), eine lokale Gröÿe oder auch local feature
size des Objekts angibt. Diese Funktion teilen wir nun noch durch die Hälfte der Anzahl an Elementen in schmalen Regionen des Objekts und erhalten
Nebenbedingung:
(
Local Feature Size:
h(x) ≤
hlfs (x) für Φ(x) ≤ 0
∞ sonst
(6)
Zusätzlich möchte man später eventuell gewisse Regionen des Objekts besonders genau dargestellt haben. Für den Fall denieren wir folgende Bedingung:
Non-geometric Adaption:
(
hext für Φ(x) > 0
h(x) ≤
∞ sonst
(7)
Um die Qualität des Netzes zu verbessern, begrenzen wir den Gröÿenunterschied von zwei benachbarten Zellen. Dass dadurch die Qualität des Gitters
verbessert wird, ist wird deutlich, wenn man einmal ein groÿes gleichseitiges
Dreieck zeichnet und an einer Kante ein wesentlich kleineres dazu fügt. In dem
Fall ist es nämlich unmöglich, dass das kleine Dreieck keine äuÿerst stumpfen
und spitze Winkel hat. Wir erreichen die gewünschte Beschränkung der Unterschiede zweier Zellen, indem wir dem Gradienten von h durch eine Funktion g
nach oben beschränken. Dabei kann g entweder konstant sein, oder, falls der
Benutzer in unterschiedlichen Regionen unterschiedliche Anforderungen an die
Qualität des Netzes hat, abhängig von x
Gradient Limiting:
14
∈ Ω.
|∇h(x)| ≤ g(x)
(8)
Die optimalen Zellgröÿen (das heiÿt so groÿ wie möglich, um Speicherplatz zu
sparen, und so klein wie nötig, um die gewünschte Genauigkeit zu erzielen) erhält
man nun, indem man h über alle Nebenbedingungen, also den Gleichungen(5)(8), maximiert.
Wir sind somit in der Lage, in einen Gitter erzeugenden Algorithmus, eine Funktion zu implementieren, die dem Algorithmus optimale Gröÿen für die Zellen
angibt. Wie so ein Algorithmus aussehen kann, zeigt der nächste Abschnitt.
3.4
Delaunay-Triangulierung
Ein häug angewendetes Verfahren zur Netzgenerierung ist das Delaunay Verfahren. Dieses erzeugt für eine gegebene Punktmenge ein unstrukturiertes Gitter
aus Dreiecken. Es gibt verschiedene Methoden, um Punkte so zu Dreiecken zu
verbinden, dass sich ein Gitter ergibt, in dem alle Punkte integriert sind.
Abbildung: 3.2: Zwei unterschiedliche Triangulierungen einer Punktmenge.
Quelle: [6].
In beiden Bildern ist die gleiche Punktmenge vernetzt. Welche Triangulierung
ist besser geeignet? Die Anzahl der Dreiecke, der Punkte, der Kanten, und der
Punkte die sich auf dem Rand benden ist gleich. Jedoch sind die Dreiecke in
der linken Vernetzung oensichtlich wesentlich schmaler als die rechts. Bei der
späteren numerischen Berechnung können solche degenerierten Dreiecke leicht
zu Interpolationsfehlern führen. Man möchte die Punkte dementsprechend in
einer Art vernetzen, sodass die gebildeten Dreiecke möglichst ähnlich einem
gleichseitigem Dreieck sind.
Mit der Delaunay Triangulierung werden die Punkte so vernetzt, dass sie der
Umkreisbedingung genügen. Das heiÿt im Umkreis eines Dreiecks auf dem die
drei Knoten des Dreiecks liegen darf kein weiterer Punkt der gesamten Punktmenge liegen. Dadurch wird der minimalste aller Dreieckswinkel maximiert. Es
werden also Dreiecke mit spitzen Winkeln so gut wie möglich vermieden. Somit
werden, wie man leicht sieht, auch stumpfe Winkel reduziert, also insgesamt
entartete Dreiecke vermieden.
15
Es gibt keine andere Dreiecksvernetzung, die einen gröÿeren minimalen Dreieckswinkel aufweist [6].
Ein Gitter ist eine Delaunay Triangulierung, wenn es folgende Eigenschaft
besitzt:
Lokal-Delaunay: Eine Triangulierung T ist Lokal-Delaunay genau dann, wenn
für je zwei benachbarte Dreiecke
D liegt nicht im Umkreis von
D1
D1 = (A, B, C) ∈T
und
D2 = (C,B,D)∈T gilt,
D2 . [6]
und A liegt nicht im Umkreis von
Ein Delaunay Gitter weist gute Eigenschaften auf. Zu einer guten Triangulierung gehört jedoch auch eine kurze Laufzeit, damit auch komplexere Problemstellungen noch behandelbar sind. Zum Sortieren n reeller Zahlen ist die minimale Laufzeit O(n(log(n))). Eine Triangulierung mit dieser Laufzeit ist die schnellst
mögliche Triangulierung im 2-dimensionalen Raum. Es gibt, siehe [6], Algorithmen zur Delaunay Triangulierung, die nachgewiesen eine minimale Laufzeitkomplexität O(n(log(n)) aufweisen. Tomas Lehner beschreibt in Kapitel 4.7 seiner
Diplomarbeit [6] einen solchen Algorithmus.
16
4
Nachträgliche Netztqualitätsverbesserungen
Wir haben nun einige verschiedene Möglichkeiten gesehen, ein allgemeines Gitter für ein Gebiet zu konstruieren, und dieses Gitter zur Lösung der Ränder des
in dem Gebiet betrachteten Objektes zu nutzen.
Wie wir gesehen haben, bieten diese Gitter meist eine recht gute Approximation an das Originalobjekt. Ein Grund die Qualität des Gitters nachträglich
zu verbessern könnte sein, dass wir in der Anwendung normalerweise sehr verschiedene Objekte mit sehr unterschiedlichen Rändern betrachten. Um unser
Gitter nochmal speziell an die Krümmungseigenschaften des betrachteten Objektes anzupassen, möchten wir unser randlösendes Gitter nochmal nachträglich
anpassen.
Grundsätzlich gibt es drei verschiedene Ansätze zur Verbesserung der Netzqualität:
•
Eine Option ist die lokale Anpassung des Gitters durch Verfeinerung bzw.
Vergröberung indem man Knoten hinzufügt oder löscht und in der Umgebung das Gitter neu auöst.
•
Der zweite Ansatz ist face/edge swapping. Wir tauschen Flächen(3D),
bzw. Kanten(2D) aus und verbinden die Knoten neu.
•
Eine weitere Möglichkeit ist eine Gitterglättung. Wie der Name schon
sagt, versuchen wir möglichst glatte Kanten und Übergange von groben
zu feinen Auösungen zu schaen. Dazu ordnet man die Gitterknoten neu
an, indem man zum Beispiel den optimalen Ort, für einen Knoten, für eine
bereits festgelegte Umgebung, neu berechnet.
Ein weiterer Grund die Gitterqualität zu verbessern ist, dass schlecht geformte Zellen die Robustheit und die Konvergenzgeschwindigkeit der numerischen Berechnungen negativ beeinussen. Dazu müssen wir zunächst denieren
was eine schlecht geformte Zelle ist, um unser Gitter auf solche unerwünschten
Elemente hin zu untersuchen. Zur Findung geeigneter Kriterien, nden sich in
der Literatur verschiedene Ansätze. In [18] werden für 3D-Objekte beispielsweise
folgende Qualitätsmaÿe kombiniert:
•
Edge-ratio: Die edge-ratio ist die längste Kante der Zelle geteilt durch die
Kürzeste
•
Joe-Liu Parameter: Sei
seien
und
vi (i =0,...,d)
vj
ksk
das Volumen eines gegebenen d-Simplex s,
eij
die Ecken von s, und seien
die Ecken von s die
vi
verbinden. Wir berechnen den Joe-Liu Parameter eines d-Simplex
wie folgt:
1
F (s, d) =
d−1
2
22(1− d ) × 3 2 × ksk d
f (s, d)
P
=
keij k2
g(s, d)
0≤i≤j≤3
17
(9)
Dieser Term drückt ein, durch die Dimension, skaliertes Verhältnis zwischen dem Volumen eines Elementes und seinen Kanten aus. Umso gröÿer
der Wert F(s,d) ist, umso besser ist die Qualität des Elementes s. Ist der
Wert klein, so ist das Volumen des Elementes im Verhältnis zu der Summe der quadrierten Kantenlängen klein. In dem Fall ist eine Kante des
Elementes im Verhältnis zu seinem Volumen sehr kurz, somit das Element
degeneriert, denn die anderen Kanten sind entsprechend länger um das
groÿe Volumen zu erzeugen.
•
Minimum volume bound: Berechne das Volumen jedes Tetraeders und
nde das Tetraeder mit minimalem Volumen. Dieser Volumen Parameter
sollte verbessert werden, falls er unter einem festgelegtem Schwellenwert
liegt.
Mit Hilfe dieser Qualitätsmaÿe ist uns nun möglich schlecht geformte Zellen zu lokalisieren.
Wir gehen dabei die Gitterzellen durch und entfernen Kanten, deren edge-ratio
über einem zuvor gewählten Schwellenwert liegt. Danach verbinden wir die Knoten in der Umgebung neu. Dies wiederholen wir solange bis alle Zellen über dem
Schwellwert liegen. Auf diese Weise wenden wir auch die anderen beiden Qualitätsmaÿe an.
Als Ergebnis erhalten wir ein Gitter, das unseren, zuvor festgelegten, Qualitätsansprüchen genügt.
4.1
Laplacian smoothing
Laplacian smoothing ist eine Methode zur Glättung von Gittern. Es zeichnet
sich vorallendingen durch die Einfachheit des Algorithmus aus. Der Algorithmus verschiebt die einzelnen Knotenpunkte, um das Gitter zu verbessern. Um
die Punkte verschieben zu können, brauchen wir eine bereits bestehende Triangulierung unser Punktmenge. Wir betrachten hier 2D Laplacian-smoothing
auf Dreieckgittern. Es gibt auch Algorithmen für Viereckgitter und für den 3dimensionalen Raum.
Wir betrachten, die Gleichung der gewichteten Diererenzen, siehe [3].
X
X
wi (xi − x) = 0,
i
wi (yi − y) = 0
(10)
i
mit den Gewichten
wi
und den nächsten Nachbarn
(xi , yi ) von dem betrach-
tetem Knotenpunkt (x,y). Nächste Nachbarn meint hier die Punkte die durch
eine Gitterkante direkt mit dem Knoten verbunden sind. Diese Gleichungen lassen sich mit Einheitsgewichten nun iterativ lösen.
Die gewöhnliche Laplacian smoothing Denition ist folgende:
Seien
E1 , E2 ,..., Ek
Dreiecke die den Knoten
18
z∗
teilen, und seien die übrigen
Ecken von
E1 , E2 ,..., Ek z1 , z2 ,..., zk .
Laplacian Smoothing deniert eine neue
Koordinate durch
z ∗ = (z1 + . . . + zk )/k
(11)
siehe [3].
Nachdem wir den Schritt einmal für alle Knoten durchgeführt haben, können
wir auch weitere Iterationen durchführen, indem wir im geglättetem Netz auch
wieder eine Glättung, wie in (10), durchführen.
In Kapitel 3 haben wir uns unter anderem mit der Delaunay-Triangulierung
beschäftigt. Dort haben wir gesehen, dass diese Triangulierung schöne Eigenschaften aufweist, und deswegen häug Anwendung ndet. Deswegen gehen wir
nun davon aus, dass das Startgitter, das wir beim Laplacian smoothing vorausgesetzt haben, ein Delaunay Gitter ist. Bei der Vorgehensweise wie oben
könnte es nun sein, dass unser Gitter von einem zum nächsten Iterationsschritt
die Delaunay-Eigenschaft verliert. Deswegen erweitern wir unseren Algorithmus dadurch, dass wir bei der Neuberechnung jedes Knotenpunktes überprüfen,
ob das Gitter dadurch die Dalaunay-Eigenschaft behält oder nicht. Bleibt die
Dalaunay-Eigenschaft erhalten, so verschieben wir z nach
z∗.
Im anderen Fall
verändern wir die Position des Knotens nicht.
Für jeden Punkt zu prüfen, ob die Delaunay nach Verschiebung erhalten
bleibt ist aufwendig. Beim einfachen Laplacian smoothing haben wir hingegen
einen Rechenaufwand der Ordnung k. Die Variable k entspricht der Anzahl der
Kanten die mit z verbunden sind.
Laplace-Delaunay- smoothing kann schon in einem einzelnen Punkt einen Rechenaufwand der Ordnung
n2
auslösen, mit n als Anzahl der Knoten. Insgesamt
bedarf ein Iterationsschritt der einfachen Glättung einen Aufwand der Ordnung
n, und unter Nutzung der gegebenen Datenstrukturen ndet man Algorithmen
der Ordnung K*n für eine Laplacian-Delaunay smoothing Iteration. Wobei K
die maximale Anzahl der Dreiecke ist, die einen Punkt teilen.
Laplacian smoothing ist konvergent, dies ist bei der Laplace-Delaunay smoothing Iteration nicht der Fall, hier müssen wir andere Abbruchkriterien für den
Algorithmus angeben. Auch wenn man eventuell nicht den optimalen Schritt
zum Abbrechen der Iteration gefunden hat, so ist im Laplace-Delaunay smoothing der maximale Dreieckswinkel wesentlich kleiner, und entsprechend der
minimale Winkel wesentlich gröÿer wie folgende Tabelle eines Rechenbeispiels
zeigt.
4.2
Verschiedene Gitterglättungen in 3 Dimensionen
Das Laplacian-smoothing kommt auch häug in 3D Anwendungen zum Einsatz.
Dies liegt daran, dass es ein einfaches Verfahren mit wenig Speicheraufwand ist.
Man hat mittlerweile aber andere Verfahren entwickelt die ähnliche Laufzeiten
19
Abbildung: 4.1. Quelle: [3].
aufweisen, und wesentlich schönere Ergebnisse produzieren. Einfaches Laplacian
smoothing haben wir in dem letzten Abschnit bereits kennen gelernt. Das gleiche
Prinzip können wir auch in 3 Dimensionen anwenden.
Einfaches Laplacian smoothing sieht in 3 Dimensionen ähnlich aus wie oben.
Wir denieren den Operator zur Berechnung der neuen Koordinaten (Umbrella
Operator, oder kurz
U ),
wie in [9]:
1 X
U (P ) = P
wi Qi − P
wi i
(12)
i
Das iterative Laplace Verfahren geht dann in einem Schritt wie folgt vor:
Pnew ←− Pold + λU (Pold )
Wir betrachten ebenfalls noch kurz die Iterationsregeln zum
placian smoothing
und
mean curvature ow
(13)
Taubin, Bila-
und schauen uns ein paar Resultate
der verschiedenen Methoden an.
Taubin smoothing versucht durch alternierende Gewichtungsfaktoren hohe Frequenzen von
U
zu beseitigen und niedere Frequenzen zu unterstützen. Hier
lautet die Iterationsvorschrift:
Pnew ←− (1 − µU )(1 + λU )P old = Pold − (µ − λ)U (Pold − µλU 2 (Pold ))
P
1
2
mit µ > λ > 0, und U (P ) = P
wi U (Qi ) − U (P ).
wi
i
(14)
i
Es hat sich herrausgestellt, dass diese Iteration sehr gut funktioniert, wenn
man
U
wieder wie beim einfachen Laplacian smoothing wählt.
Bilaplacian Flow erhält man indem man
λ = µ wählt. Ein Iterationsschritt sieht
dann wie folgt aus:
Pnew ←− Pold + λU 2 (Pold )
(15)
Kommen wir nun noch zum mean curvature ow. Hier nehmen wir die Glättung mithilfe der Gesamtkrümmung des Objekts vor. Wir iterieren
20
Pnew ←− Pold λκ(Pold )n(Pold )
mit
κ
(16)
als Krümmung wie schon in Abschnitt 3.2 und n als Einheitsnorma-
lenvektor.
Für mehr Details, zu (12)-(16), verweisen wir auf [9].
Abbildung 4.2 zeigt nun, dass alle diese Verfahren Schwächen aufweisen,
wenn man sie zur Glättung von Rauschen auf Gittern anwendet die in unterschiedlichen Regionen eine unterschiedliche Zelldichte haben. In der Abbildung
ist an Nord- und Südpol ein dichteres Gitter konstruiert worden als auf dem
Rest des Objekts. Das nächste Bild zeigt dasselbe Problem nocheinmal an einem anderem Objekt.
Abbildung 4.2: (a) zeigt das Objekt im Originalzustand und in (b) wurde Rauschen hinzugefügt; (c)
Laplacian smoothing
Taubin smoothing
Objekt ist verformt; (d)
hat das Rauschen entfernt aber das
hat das Rauschen entfernt und die
Form wieder hergestellt, es sind jedoch unregelmäÿige Wellen auf der Oberäche
entstanden; (e)
mean curvature ow
stellt die Form des Objektes wieder gut her,
erzeugt aber starke unregelmäÿigkeiten auf der Gitteroberäche;(f ) zeigt das Ergebnis der Methode der unten erläuterten Methode. In der unteren Reihe haben
wir bei (A) ein anderes Objekt und diesem in (B) wieder Rauschen hinzugefügt; (C) Taubin smoothing hat wieder das hochfrequente Rauschen enfernt,
man sieht aber wie in (d) niederfrequentes Rauschen; (D) mean curvature ow
hat die ursprünglich scharfen Kanten des Objekts vollständig entfernt (Laplace
smoothing hat hier ein ähnliches Ergebnis erzeugt); (E) zeigt das Ergebnis mit
der gleich erläuterten Methode.
Quelle: [9].
In [9] konstruiert man zur Vermeidung der Glättungsfehler, die wir in den
Abbildungen sehen, ein modiziertes mean curvature ow Verfahren. Die Idee
21
ist, das mean curvature ow Verfahren als Grundlage zu benutzen, da dieses
oft gute Glättungsresultate aufweist, und nebenbei das zugrundeliegende Gitter
zu regularisieren. Die Regularisierung des Gitters wird hier mit Laplace- smoothing durchgeführt. Dabei sollten dann die sonst mit dem mean curvature ow
auftretenden Störungen beseitigt werden.
Man betrachtet nun eine Familie von glatten Oberächen S(u,v,t). Wobei (u,v)
die Oberäche, und t die Familie parametrisiert.
∂S(u, v, t)
= F n + Gt,
∂t
S(u, v, 0) = S (0) (u, v)
(17)
mit einer gegebenen Funktion G und einer Geschwindigkeit F in Normalenrichtung. Wählt man
F n = Hn
und Gt=
C[U0 − (U0 n)n] (U0
der Umbrella
Operator mit Einheitsgewichten), C eine positive Konstante, so erhält man als
Iterationsvorschrift:
Pnew ← Pold + λ[H(Pold nPold + C(U0 (Pold − (U0 (Pold nPold ))nPold )))
(18)
Man kann C auch als Funktion, abhängig von der Oberächenkrümmung
wählen. Auÿerdem möchten wir uns noch überlegen wie man den Algorithmus
anpasst um oversmoothing zu vermeiden.
Abbildung 4.3: (a) Original; (b) Nahansicht der unterschiedlichen Gitterdichte in den verschiedenen Regionen des Objekts; (c) Rauschen hinzugefügt; (d)
Laplace smoothing; (e) Taubin smoothing; (f ) Bilaplacian smoothing; (g) mean
curvature ow; (h) Glättung mit Hilfe des hier vorgestellten Ansatzes.
Quelle: [9].
Beim
oversmoothing
durchläuft unser Glättungsverfahren zu viele Iteratio-
nen, was dazu führt, dass scharfe Kanten des Objekts abgerundet werden. Ein
anderer Ansatz als Funktionen in einen Algorithmus einzubauen, die während
der Glättung oversmoothing vermeiden, ist die optimale Anzahl an Iterationen
22
für den Algorithmus zu bestimmen, und ihn nur solange laufen zu lassen, bis
diese Anzahl erreicht ist.
Zum Vergleich verschiedener Glättungsmethoden wurde in [?] für jedes einzelne
die optimale Laufzeit bestimmt. Um die Laufzeit zu bestimmen nimmt man an
es gibt ein Netz
G
und das Netz
G
mit hinzugefügtem Rauschen, auf das das
jeweilige Verfahren angewendet wird.
Die optimale Stopzeit
τ=
mit
Gt
τ
lässt sich wie folgt berechnen:
1
(argmint Eν (G, Gt ) + argmint En (G, Gt ))
2
(19)
als das Netz mit Rauschen nach t Iterationen.
Abbildung 4.4: Das Stanford bunny vernetzt; links das Original und rechts mit
hinzugefügtem Rauschen.
Quelle: [9].
Abbildung 4.5, zeigt die Glättung mithilfe...(◦) Laplacian smoothing; (×) mean
curvature ow; () Taubin Schema; (∆) bilaplacian ow; (+) Verfahren basierend auf Normalenanpassung. In der oberen Zeile
nen.
Quelle: [9].
23
τ,
in der unteren
5τ
Iteratio-
Das Verfahren das für (+) gewählt wurde, ermittelt die Normalen auf der
Netzoberäche und mittelt diese im ersten Schritt.
X
m(T ) =
A(S)n(S)m(T ) ←
S∈N (T )
m(T )
km(T )k
(20)
T ist eine einzelne Netzzelle, A(T) die Umgebung von T, n(T) der Normalenvektor zu T, und
N (T )
die Menge aller Elemete des Netzes.
Im nächsten Schritt ordnen wir die Knoten des Netzes wieder neu an, indem
wir eine Fehlerfunktion, die die Güte des modizierten Netzes misst minimieren.
Ef it (P ) =
X
A(T )kn(T ) − m(T )k2
(21)
Die schnellsten Verfahren in 5.5 sind Laplacian smoothing und mean curvature ow. Bilaplacian smooting und die Taubin Methode sind langsamer, erhalten aber auch besser die ürsprünglichen Formen des Objekts. Für die Taubin
Methode ist keine Vorberechnug der optimalen Laufzeit erforderlich. Am langsamsten ist das Verfahren basierend auf der Normalenanpassung. Sie erhält am
besten die Strukturen des Originalobjekts während sie das Rauschen entfernt.
24
5
Spezielle 3D Gitterverfahren
In diesem Kapitel möchten wir uns zwei Gitterverfahren einmal genauer ansehen. Um zu sehen wie ein 3D Gitter konstruiert werden kann und später die
verschiedenen Methoden zu vergleichen.
5.1
BCC Gitter
Ein spezielles Gitter stellt das body-centered cubic Gitter dar. Im ersten Schritt,
der Gitterkonstruktion,legen wir in unser Gebiet
Ω
ein uniformes Würfelgitter.
Als nächstes fügen wir im center jedes Würfels einen weiteren Knoten hinzu
und verbinden ihn mit den acht anderen Knoten des Würfels. So erhalten wir
für unser Gitter eine Kristallstruktur die in der Natur ebenfalls häug auftritt.
Auÿerdem haben wir nun zwei ineinander verstrickte Gitter. Denn acht der eben
hinzugefügten Punkte bilden einen Würfel mit einem Knotenpunkt in der Mitte,
also genauso wie im zuerst konstruierten Gitter.
Abbildung: 5.1: Die Struktur des BCC Gitters.
Quelle [2].
Um bestimmte Stellen des Gitters genauer darzustellen, verfeinern wir das
Gitter an diesen Stellen mit Hilfe einer rot-grün Hierarchie.
Die rot-grün Verfeinerung nehmen wir in den Tetraedern in den Würfeln vor.
Benötigt ein Tetraeder eine Verfeinerung so verfeinern wir es je nachdem, wie
viele Seiten des Tetraeders zweigeteilt werden müssen um die nötige Verfeinerung zu erreichen in eins der Tetraeder die in Bild 5.2 angegeben sind. Wir sehen
das keines der kleineren, durch die Teilung entstandenen Tetraeder, der children, entartet ist. Deswegen nutzen wir auch nur diese Tetraeder zum verfeinern.
Falls ein child der grünen Tetraeder weiter verfeinert werden soll, entfernen wir
zuerst das grüne Tetraeder ersetzen es durch ein rotes und berechnen darauf
erneut, ob eine weitere Verfeinerung nötig ist.
Diese Verfeinerung kann während der Netzgenerierung oder schon im vorhinein
25
z.B. durch eine mesh-size function festgelegt werden. Auÿerdem können wir das
Würfelgitter mit einer octree-Struktur vergröbern oder verfeinern. Wobei zwei
benachbarte Würfel sich höchsten um eine octree Verfeinerung/Vergröberung
unterscheiden sollen.
Abbildung 5.2: Die zulässigen verschiedenen children der regulären BCC Tetraeder.
Quelle [2].
Wie man in Bild 5.2 sieht haben nur children des roten Tetraeders wieder die
reguläre tetraedrische Form. Deswegen werden, wenn überhaupt, nur children
der roten Verfeinerung eventuell erneut verfeinert. Soviel erstmal zum generellen
Aufbau des Gitters.
Wir möchten als nächstes betrachten, wie wir unser Initialgitter für ein beliebiges Objekt unter Kenntnis der zugehörigen level-set Funktion
Ω zu vernetzen,
Objekt M . Φ gibt für
Φ
erstellen.
Um nicht das ganze Gebiet
konzentrieren wir uns mit unserer
Konstruktion auf das
Knoten auÿerhalb von
mathscrM
positive Werte an, das heiÿt Tetraeder mit nur positiven Knoten liegen komplett
auÿerhalb von
M
und sind somit für uns nicht von Interesse. Wir entfernen die-
se Zellen aus dem Gitter.
Um die Tetraeder entlang der Nullschnittstelle von
Φ noch weiter zu verfeinern,
kann man verschiedene Ansätze, wie schon in dem Abschnitt zu mesh-size functions besprochen, wählen. In [2] wird der Ansatz gewählt, die Tetraeder, die vom
Rand geschnitten werden, genau dann zu verfeinern, wenn die längste Kante des
Tetraeders im Verhältnis zum Radius eines Krümmungsmaÿes zu groÿ ist. Diese
Verfeinerung nehmen wir mit dem oben beschriebenen rot-grün Verfahren vor
und erhalten so unser BCC Gitter.
26
5.2
CFE Gitter
Zum Vergleich stellen wir hier noch ein weiteres Verfahren vor, welches, ähnlich wie das obige Verfahren, strukturierte Hexaedrische Gitter zu Konstruktion
verwendet.
Wir möchten hier den Composite Finite Elements Space vorstellen. Was übersetzt zusammengesetzter Finite Elemente Raum heiÿt. Der Raum den wir zur
Finite Elemente-Simulation konstruieren, besteht aus zwei zusammengesetzten
Gittern.
Wir kombinieren hier unstrukturierte tetraedrische Gitter und uniforme hexadrische Gitter und zwar wegen folgender Überlegung:
Unstrukturierte Gitter
weisen den Vorteil auf das sie eine höhere geometrische
Flexibilität haben. Wir können die Zellen eines solchen Gitters wie schon oben
besprochen, leichter an die Form unseres Objektes anpassen, und den Rand des
Objektes linear interpolieren. Dadurch benötigt so ein Gitter jedoch auch eine
Vernetzung der einzelnen Knotenpunkte, wie es z.B. das Delaunay-Verfahren
vornimmt. Zum anderen kommt es in der Bildverarbeitung auch häug vor,
dass man merkt das eine weniger genaue Darstellung eines Gebildes vollkommen ausreichend ist. Eine Vergröberung eines unstrukturierten Netzes ist jedoch
im allgemeinen ein nur schwierig zu lösendes Problem.
Ein
uniformes Gitter hingegen ist leicht zu vergröbern: Wir fügen acht gleich-
groÿe Würfel zusammen und erhalten einen Gröÿeren Würfel. Zudem ist eine
Vernetzung hier nicht mehr notwendig, da die gesamte Gitterstruktur bereits
durch den Abstand zweier Knoten festgelegt ist. Wie bereits in Kapitel 3 besprochen, weist ein solches Gitter auch eine ezientere Datenstruktur auf.
In dem CFE Gitter versuchen wir nun, die beiden Strukturen möglichst
optimal zu kombinieren. Wir benutzen dazu ein uniformes hexaedrisches Hintergrundgitter und versuchen, durch möglichst einfache stückweise lineare Basisfunktionen, die wir durch ein nur zur Bestimmung der Basisfunktionen konstruiertes virtuelles Gitter bestimmen, eine gute Interpolationen des Objektrandes
zu erreichen. Wie dies genau geschieht, wird im Folgenden erläutert.
Um uns die Grundideen vor Augen zu führen erstellen wir zunächst ein
solches Gitter im ein- und zwei-dimensionalen Raum. In einer Dimension betrachten wir eine kompakte Teilmenge von
R. Wir diskretisieren dieses Intervall,
indem wir in gleichen Abständen Knotenpunkte einfügen. Auf diesen Punkten
platzieren wir unsere Unbekannten und erstellen die Basisfunktionen. Die Idee
des CFE Gitters im eindimensinalen Fall ist: Die Knotenpunkte im gleichen
Abstand voneinander, ungeachtet des Objektrandes zu platzieren und die Basisfunktionen durch Indikatorfunktionen am Rande des Objektes abzuschneiden.
Obige Betrachtungen führt man jedoch eher selten durch, meist betrachtet man
ein Objekt in mindestens zwei Raumdimensionen. Wir diskretiesieren das Gebiet
durch ein karthesisches Gitter und teilen jedes Viereck in zwei gleiche Dreiecke.
27
An den Kanten dieser Dreiecke speichern wir die Bildvoxelwerte und die Randpunkte, die wir zuvor aus der Segmentierung erhalten haben. Wir verbinden
die Randpunkte, um eine lineare Annäherung des echten Randes zu erhalten.
Als letztes teilen wir noch die durch den Rand entstandenen unstrukturierten
Vierecke in jeweils zwei Dreiecke, um die lineare Interpolation zu lösen.
Abbildung: 5.4: Ein CFE Gitter für eine 2-dimensionale Anwendung.
Quelle: [14].
Man erkennt hier schon sehr genau die Umsetzung der obigen Vorüberlegungen: Das uniforme Viereckgitter erlaubt eziente Datenstrukturen und einfach vorzunehmende Vergröberungen des Gitters, und im Inneren der Zellen
erhalten wir durch die Teilung, eine gute Approximation des Randes. Im Dreidimensionalen wird das ganze nun ein wenig technischer, aber die Grundideen
bleiben die selben.
Wir nennen das von uns betrachtete Gebiet, enthalten im
tisieren dieses Gebiet durch ein hexaedrisches Gitter
G
R3 , Ω, und diskre-
mit den Knotenpunkten
{0,...,Nx }×{0,...Ny }×{0,...,Nz }. Auf diesen Knoten können wir, die Werte der
Φ sowie die Bildvoxel speichern. Wir erhalten für die Bildu0 : Ω → R und die level-set Funktion Φ eine trilineare Interpolation in
level set Funktion
funktion
jedem Würfel. Dabei soll keine der Zellen mehr als einmal vom Rand geschnitten
werden. Um eine bessere Approximation zu erreichen, teilen wir jeden Würfel
in sechs Tetraeder der im Bild dargestellten Form.
Abbildung: 5.5: Die Einbettung der regulären Tetraeder in das hexaedrische
Hintergrundgitter.
Quelle: [7].
28
Nach dieser Einteilung erhalten wir ein Gitter
Kanten der Tetraeder von
G
Gx
welches sich durch die
unterscheidet, aber die Menge der Knotenpunkte
unverändert lässt. Innerhalb der Tetraeder T∈
Gx
können wir nun
u0
line-
ar interpolieren. Wir erhalten zusätzlich eine lineare Annäherung des Inneren
x
x
(Ω− ) und Äuÿeren (Ω+ ), sowie des Randes (γ
von
γ
∇
∇
). Einige der Tetraeder werden
geschnitten, dabei entstehen durch die Teilung der Tetraeder, entweder
zwei Prismen, oder ein Prisma und ein Tetraeder. Keines der Tetraeder wird
mehrmals geschnitten, denn wir haben
G
oben so gewählt, dass jedes Hexa-
eder höchstens einmal vom Rand geschnitten wird. Um die Approximation des
Randes
γ∇
zu lösen, teilen wir entstandene Prismen an den viereckigen Ober-
ächen durch eine Diagonale von einer Ecke zur anderen. Wir erhalten so unser
virtuelles Gitter
G∇
das
γ∇
löst. Wir haben nun folgende Gitter konstruiert:
G
•
Ein uniformes Hintergrundgitter
•
Ein Gitter aus regulären Tetraedern
•
Ein unstrukturiertes tetraedrisches Gitter
angenäherten Rand
γ
∇
mit Knoten
Gx
N
mit Knoten
G∇
N
x
=N
mit Knoten
N
∇
, dass den
linear interpoliert.
In nächsten Schritt, wollen wir uns überlegen, wie wir auf unserem Gitter
die Basisfunktionen berechnen wollen. Wir betrachten dazu die Gleichung:
L(u) = f
(22)
L ist ein elliptischer Dierentialoperator zweiter Ordnung, der auf die zu bestimmende Basisfunktion u wirkt. Auf der rechten Seite der Gleichung stellt f
die Randbedingungen des Objektes dar. Die Funktionen u und f hängen von x
ab, wobei
x ∈ N ∩ Ω−
gilt.
Wir betrachten zunächst die beiden folgenden Vektorräume:
V ∇h :=span{ψi∇ ∈ C0 (Ω)|ψi∇
∇
f.a. xj ∈ N
}
V xh :=span{ψix ∈ C0 (Ω)|ψix
xj ∈ N x }
bzgl
bzgl
T
T
ist an f.a. T∈
ist an f.a. T∈
G∇
Gx
und
und
ψi∇ (xj ) = δij
ψix (xj ) = δij
f.a.
In beiden Fällen steht h für die Schrittweite von einem zum anderen Knoten.
V ∇h
löst den Rand
γ∇,
da der Vektorraum ja gerade durch die Funktionen
erzeugt wird, die diesen interpolierten Rand darstellen. Der andere Vektorraum
V xh
löst den Rand nicht, hat aber seine Knoten auf dem regulären Gitter. Um
den Composite Finite Elemts Space zu konstruieren kombinieren wir die beiden
Vektorräume.
h
CF E
VCF
}
E := span{ψi
mit
ψiCFE := ψix ∗ χΩx−
29
V ∇h
Dies mag eventuell den Eindruck erwecken, als würden wir
wenden, aber Aufgund der Konstruktion der Gitter
G
x
und
G∇
nicht ver-
erhalten wir
folgende Eigenschaft:
∀xi ∈ N x ∃Ci := {xi1 , . . . , xici } ⊂ N
ψix =
ci
X
∇
und mit Gewichten
µi,l ∈ R
gilt:
∇
µi,l ∗ ψi,l
(23)
l=1
Das machen wir uns zu nutze, um die Basisfunktionen zu berechnen, die von
γ∇
abgeschnitten werden. Für alle Basisfunktionen die komplett in
ist die Annäherung durch Funktionen aus
V
xh
Ωx−
liegen,
ausreichend.
Um einen Standard Galerkin Ansatz zu erhalten, multiplizieren wir u mit einer
Testfunktion
h
v ∈ VCF
E
und integrieren über
Ωx− .
Die Galerkin Methode versucht im Wesentlichen, eine approximative Lösung
für eine Bilinearform zu nden. Dabei soll die Lösung auf dem Vektorraum mit
Hilfe endlichdimensionaler Untervektorräume gefunden werden [4].
Wir betrachten nun die schwache Form des Randwertproblems
3
X
Z
L(u) = f .
Z
aαβ ∂α u∂β v =
Ωx
− α,β=1
f v dx
(24)
Ωx
−
Wir nutzen nun die Eigenschaft (23) und erhalten als schwache Lösung:
Z
∂α ψi ∂β ψj dx =
Ωx
−
ci
X
l=1
µi,l
cj
X
µj,k
k=1
X
T
∈G ∇ ∩Ωx
−
Z
T
∂α ψi∇l ∂β ψj∇k dx
(25)
Nach dem numerischen Lösen der Gleichungen erhalten wir die Basisfunktionen die den Rand
γ∇
lösen. Doch zuvor müssen noch die Randbedingungen
f, die wir bisher noch nicht genauer betrachtet haben, festgelegt werden.
Zur Finite Elemente Anwendung legt man fest, das auf dem inneren Rand
γ = Ω− , Neumann Randbedingungen gelten sollen. Auf dem äuÿerem Rand
˙ N verlangen wir Dirichlet Randbedingungen auf ΓD und
∂Ω ∩ ∂Ω− =: ΓD ∪Γ
Neumann Randbedingungen auf ΓN . Das heiÿt, wir schreiben dort wo der Rand
des Objektes komplett in Ω liegt, die Ableitungen der Basisfunktionen vor, und
dort wo das Objekt durch Ω begrenzt ist, schreiben wir die Funktionswerte vor.
Man legt also fest, wie stark sich das Objekt in Ω verändern (Verformungen,
Temperaturschwankungen) kann, und welche Bedingungen am Rand gelten. Als
Anwendungsbeispiel, stelle man sich einen Körper vor, der auf einer Platte liegt,
oder dort befestigt ist. Dann ist die Platte eine Begrenzung von
Ω
und dort wo
sich der Körper und die Platte berühren, gelten die Dirichlet Bedingungen. Um
modellieren zu können, dass sich die Umgebungstemperatur ändert, oder wir
mit einer bestimmten Kraft auf den Körper wirken, schreiben wir auf dem Rest
des Randes die Bedingungen vor wie stark sich der Körper den äuÿeren Veränderungen anpasst.
30
Abbildung: 5.6; Quelle: [7].
Wir geben, mit den Abbildungen 5.6, 5.7, 5.8, noch einen kurzen Einblick
wie man obigen Ansatz implemententieren kann:
Im ersten Schritt wird eine Nachschlag Tabelle konstruiert. In der die möglichen acht topologischen Fälle, die bei der Zerschneidung eines der regulären
Tetraeder durch den Rand auftreten können, konstruiert werden. Dabei muss
unterschieden werden, ob das zerteilte Tetraeder in zwei Prismen, oder in ein
Prisma und ein Tetraeder geteilt wurde. Danach werden die virtuellen Knoten
lokalisiert. Mit Hilfe der aus der Nachschlagtabelle konstruierten topologischen
Formen werden dann über Gewichte die genauen linearen Interpolationen skaliert. Und zum Schluss eine Matrix für die entsprechenden Tetraeder aufgestellt.
31
Abbildung: 5.7; Quelle: [7].
32
Abbildung: 5.8; Quelle: [7].
5.3
Diskussion
Welches ist das bessere Verfahren? Das CFE Gitter benötigt keine Anpassung
des berechneten Gitters, denn die Annpassung erfolgt über die stückweise linearen Basisfunktionen die in dem Gitter mit Hilfe des virtuellen Gitters berechnet
werden. Ähnlich wird auch das BCC Gitter während der Erstellung an die Geometrie mit Hilfe der Rot-Grün Hierarchie angepasst. Durch diese octree Struktur
die das BCC Gitter besitzt könnte man meinen, dass es weniger Speicherplatz
benötigt. Das lässt sich aber generell nicht sagen, da wir unser CFE Gitter auch,
durch eine zuvor bestimmte mesh size function, mit einer octree Struktur ausrüsten können.
Beide Gitter können auf Probleme mit nicht kontinuierlichen Koezienten angewendet werden und komplizierte Oberächen auösen.
Für das CFE Gitter hatten wir gefordert, dass jedes Hexaeder nicht mehr als
einmal vom Rand geschnitten wird. Das könnte zu unglaublich hohem Speicherbedarf führen da wir das Gitter mit einheitlichen Hexaedern konstruiert haben.
Diese Forderung kann nun aber leicht relativiert werden, denn lassen wir die
Aufsplittung der Hexaeder einheitlich in ihrer Aufteilung in Tetraeder, aber variieren mit oben bereits erwähnter octree Struktur die Gröÿe der Hexaeder so
sinkt der Speicherplatzbedarf wieder auf das Maÿ, welches wir als Anpassungsbedarf mit der mesh size function deniert haben.
In [7] nden wir noch eine weitere oben nicht erläuterte Verbesserung zur
Implementierung des CFE Algorithmus. Und zwar werden die Basis Funktionen der Tetraeder die vom Rand durchschnitten werden, ähnlich wie bei dem
in Abschnitt 2.2 erläutertem Marching Cubes Algorithmus, nicht mehr direkt
berechnet, sondern durch Betrachtung der Knotenpunkte der Zelle ermittelt.
Somit braucht unsere Konstruktion einen zusätzlichen festen Speicherplatzbetrag, jedoch müssen wir in den einzelnen Zellen nicht mehr interpolieren, son-
33
dern nur noch die die entsprechenden Daten aus der Nachschlagtabelle laden.
In [7] benötigt man mit einem Standard PC 0.05 Sekunden zum erstellen einer
Nachschlag-Tabelle für die Tetraeder. Diese hat ein Gröÿe von 2261 KB.
Es ist mit Sicherheit möglich, noch weitere Verbesserungen der beiden Verfahren vorzunehmen. Letztendlich hängt jedoch die Güte eines Gitters stark von
dem zu lösendem Problem und den verwendeten Qualitätsmaÿen ab.
Nach [15], weisen Beispielsweise 30 Prozent aller Elemente eine Struktur wie das
BCC Gitter auf. Wenn man genau solche Elemente modellieren möchte, bietet
es sich an, das BCC Gitter zu verwenden.
Laut [2] ist, unter bestimmtem dort angewandten Qualitätsmaÿen, ein Facecentered Cubic Gitter dem BCC Gitter überlegen, wenn es sich um ein Problem
mit keiner oder nur geringfügiger Deformation handelt. Anwendungen in denen das zu modellierende Material anisotrop ist, benötigen normalerweise in
der einen Richtung wesentlich dichtere Knotenpunkte als in der orthogonalen
Richtung. Es ist also ohne ein festgelegtes Problem und Qualitätsmaÿe mühsam
eine Entscheidung zu treen, welches das bessere Verfahren ist.
Bisher sind wir auch noch nicht auf unstrukturierte 3D-Gitterverfahren eingegangen, obwohl das Delaunay Verfahren im 2 dimensionalen doch ein häug
verwendetes ist, und als überlegenes Triangulierungsverfahren gilt. Erstellt man
ein unstrukturiertes Gitter aus Tetraedern mithilfe des Delaunay- Verfahrens,
in drei Dimensionen, so produziert dieses sliver, hauchdünne Scheiben deren
Volumen in der numerischen Berechnung null ist. Shewchuk hat sich bereits mit
diesem Problem beschäftigt und beschreibt, warum dieses Problem auftritt und
wie man die meisten dieser Zellen aus dem Gitter entfernen kann. Dies ist jedoch recht aufwendig und manchmal auch nicht ausreichend, da nicht immer
alle dieser schlechtgeformten Zellen entfernt werden können. Es tritt noch eine
weitere Eigenart der Delaunay Triangulierung auf: Die verknüpfte Punktmenge
bildet bei diesem Verfahren immer ein konvexes Gebiet, jedoch benötigen viele
Finite Elemente Anwendungen kein konvexes Gebiet.
Diese Erkenntnis führt uns dazu, dass die Verwendung uniformer Hintergrundgitter, mit darin eingebetten Tetraedern, eine Alternative zu unstrukturierten Gittern sein könnte.
34
6
Beispiele
6.1
Verschiedene Triangulationen
Abbildung 7.1; Quelle: [13].
Links im Bild sehen wir noch einmal den Triangulierten Kreis aus Kapitel
eins. Rechts wird der Objektrand mit der Hilfe einer wesentlich höheren Anzahl
an Elementen genauer angenähert. Beim genauen hinsehen ist jedoch immer
noch zu erkennen, dass der Rand nur stückweise linear angenähert wird.
Ein Kreis hat überall auf dem Rand eine gleichbleibende Krümmung. Somit ist
es möglich mit nur wenigen Elementen eine sehr genaue bilineare Annäherung
zu erreichen. In einer solchen Anwendung ist also ein strukturiertes Gitter aus
Quadraten den unstrukturierten Dreiecken überlegen.
Abbildung 7.2; Quelle: [4].
Hingegen sehen wir in 7.2 ein Objekt, bei dem sich lineare Interpolation
anbietet. Da die vielen Ecken durch geraden verbunden sind.
35
An folgendem Beispiel möchten wir uns die Anpassung des Gitters an das
Objekt vor Augen führen.
Abbildung 7.3; Quelle: [13].
Man sieht wie sich das Gitter an die lokale Gröÿe des Objektes anpasst. Links
sind die Zellen sehr klein und nach rechts hin gröÿer werdend. Eine Anpassung
an die Krümmung erfolgt oensichtlich auch, denn am inneren Halbkreis sind
die Elemente kleiner als am äuÿeren Halbkreisrand. Man könnte sich im inneren des Elements, zur Reduzierung der Knotenanzahl, auch gröÿere Elemente
vorstellen. Hier erkennen wir jedoch, dass der Gröÿenunterschied benachbarter
Zellen relativ gering ist, sodass glatte Übergänge von den kleineren inneren Zellen zu den gröÿeren Äuÿeren entstehen.
Dies sind genau die Ansätze die wir uns auch zur Berechnung einer mesh size
function, in Abschnitt 3.3, überlegt haben.
36
6.2
Finite Elemente Simulation
Zu guter letzt sehen wir uns noch eine Finite Elemente Simulation an. Das
Objekt nennen wir im folgenden Brücke.
Abbildung 7.4; Quelle: [8].
Hier sieht man die Triangulation der mit dem Matlab PDE Tool skizzierten
Brücke.
In den nächsten Bildern sehen wir die FE-Simulation von mechanischem FlächenDruck aus verschiedenen Richtungen.
Abbildung 7.5: Druck von oben auf die Brücke
Quelle: [8].
37
Abbildung 7.6; Druck von unten auf die Brücke
Quelle: [8].
Abbildung 7.7; Druck von links auf die Brücke
Quelle: [8].
38
Abbildung 7.8; Druck von rechts auf die Brücke
Quelle: [8].
39
7
Fazit
Wir haben nun einen Einblick in die Generierung verschiedener Gitter bekommen. Besonders in Kapitel sechs ist klar geworden, dass uns dabei sehr viele
Möglichkeiten zur Verfügung stehen. Häug wird in FE Anwendungen auf eine
angepasste Netzgenerierung verzichtet. Man übernimmt Algorithmen die bereits implementiert sind und verwendet sie lediglich als Black Box, um darauf
im nächsten Schritt die FE zu modellieren. Auch wenn wir uns im vorigen Kapitel auf die Erläuterung zweier Gitter mit strukturiertem Hintergrundgitter
beschränkt haben, so werden, wie Kapitel 4 deutlich gemacht hat, auch häug
in 3-dimensionalen Anwendungen rein unstrukturierte Gitter verwendet.
Zu verstehen was im Schritt der Gittergenerierung geschieht kann also hilfreich
sein. Denn wie wir oben bereits besprochen haben, hängt die Güte eines Gitters
zum Groÿteil von dem betrachtetem Problem ab. Eine einfache Anpassung der
Gitterstruktur, vor der Generierung, auf das Anwendungsproblem, könnte in
Zukunft helfen eine bessere Basis zur FE Simulation zu schaen.
40
Literatur
[1] A. Belyaev and Y. Ohtake. A comparison of mesh smoothing methods. In
Israel-Korea Bi-national conference on geometric modeling and computer
graphics, volume 2. Citeseer, 2003.
[2] R. Bridson, J. Teran, N. Molino, and R. Fedkiw. Adaptive physics based
tetrahedral mesh generation using level sets.
Engineering with Computers,
21(1):218, 2005.
[3] D.A. Field. Laplacian smoothing and Delaunay triangulations.
cations in Applied Numerical Methods, 4(6):709712, 1988.
Communi-
[4] Prof. Dr. Ansgar Jüngel. Das kleine nite-elemente-skript. Technical report,
Universität Mainz, 2001.
[5] Matthias Kirschner.
Marching Cubes - Erstellung von Polygonmodellen
aus Voxelgittern. Technical report, Universität Paderborn, WS06/07.
[6] Tomas
Lehner.
Digitale
Geländemodellierung
mittels
Delaunay-
Triangulierung und Abbauplanung in AutoCAD. Master's thesis, Johannes
Kepler Universität Linz, 2002.
[7] F. Liehr, T. Preusser, M. Rumpf, S. Sauter, and L.O. Schwen. Composite
nite elements for 3D image based computing.
in science, 12:171188, 2009.
Computing and visualization
[8] Matlab R2010a. PDE Toolbox. Mathworks.
[9] Y. Ohtake, A. Belyaev, and I. Bogaevski. Mesh regularization and adaptive
smoothing.
Computer-Aided Design, 33(11):789800, 2001.
[10] S. Osher and R.P. Fedkiw.
Level set methods and dynamic implicit surfaces.
Springer Verlag, 2003.
[11] P.O. Persson.
Mesh generation for implicit geometries.
PhD thesis, Cite-
seer, 2004.
[12] P.O. Persson. Mesh size functions for implicit geometries and PDE-based
gradient limiting.
Engineering with Computers, 22(2):95109, 2006.
[13] P.O. Persson and G. Strang. A simple mesh generator in MATLAB.
review, 46(2):329345, 2004.
[14] T. Preusser, M. Rumpf, and L.O. Schwen.
bone microstructures. In
SIAM
Finite element simulation of
Proceedings of the 14th Finite Element Workshop.
University of Ulm. Citeseer, 2007.
[15] Universität
Kiel.
Kristallstrukturen.
http://www.tf.uni-
kiel.de/matwis/amat/mw1_ge/kap_3/backbone/r3_3_1.html.
41
[16] Wikipedia. Voxel. http://de.wikipedia.org/wiki/Voxel.
[17] Y. Zhang and C. Bajaj.
Adaptive and quality quadrilateral/hexahedral
Computer methods in applied mechanics
and engineering, 195(9-12):942960, 2006.
meshing from volumetric data.
[18] Y. Zhang, C. Bajaj, and B.S. Sohn. 3D nite element meshing from imaging
data.
Computer methods in applied mechanics and engineering,
49):50835106, 2005.
42
194(48-
Herunterladen