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-