Meisterklasse "Weihnachtskugeln" aus Papier mit eigenen Händen. Kugel aus zwei Dreiecken

Sphärisches Dreieck und seine Anwendung.

sphärisches Dreieck- eine geometrische Figur auf der Oberfläche einer Kugel, die durch den Schnittpunkt dreier großer Kreise gebildet wird. Drei große Kreise auf der Oberfläche einer Kugel, die sich in einem Punkt nicht schneiden, bilden acht sphärische Dreiecke. Ein kugelförmiges Dreieck, dessen Seiten alle kleiner als die Hälfte des Großkreises sind, heißt Euler.

Die Seite eines sphärischen Dreiecks wird durch den Wert des darauf basierenden Zentriwinkels gemessen. Der Winkel eines sphärischen Dreiecks wird durch den Wert des Flächenwinkels zwischen den Ebenen gemessen, in denen die Seiten dieses Winkels liegen. Beziehungen zwischen Elementen von sphärischen Dreiecken werden durch sphärische Trigonometrie untersucht.

Eigenschaften eines sphärischen Dreiecks:

  1. Neben den drei Bedingungen für die Gleichheit ebener Dreiecke gilt für sphärische Dreiecke noch eine weitere: Zwei sphärische Dreiecke sind gleich, wenn ihre entsprechenden Winkel gleich sind.
  2. Für die Seiten eines sphärischen Dreiecks gelten 3 Dreiecksungleichungen: Jede Seite ist kleiner als die Summe der beiden anderen Seiten und größer als ihre Differenz.
  3. Die Summe aller Seiten a + b + c ist immer kleiner als 2πR.
  4. Die Größe 2πR − (a + b + c) heißt Kugelfehler
  5. Die Summe der Winkel eines sphärischen Dreiecks s = α + β + γ ist immer kleiner als 3π und größer als π
  6. Die Menge wird als Kugelüberschuss oder Kugelüberschuss bezeichnet
  7. Die Fläche eines sphärischen Dreiecks wird durch die Formel bestimmt.
  8. Im Gegensatz zu einem flachen Dreieck kann ein kugelförmiges Dreieck zwei oder sogar drei 90°-Winkel haben.

Unter allen sphärischen Polygonen ist das sphärische Dreieck das interessanteste. Drei Großkreise, die sich paarweise in zwei Punkten schneiden, bilden auf der Kugel acht sphärische Dreiecke. Wenn Sie die Elemente (Seiten und Winkel) eines von ihnen kennen, können Sie die Elemente aller anderen bestimmen. Betrachten Sie daher die Beziehung zwischen den Elementen eines von ihnen, bei der alle Seiten kleiner als die Hälfte des Großkreises sind. Die Seiten des Dreiecks werden durch die flachen Winkel des Dreiflächenwinkels OABS gemessen, die Winkel des Dreiecks werden durch die Flächenwinkel des gleichen Dreiflächenwinkels gemessen, siehe Abb.

Die Eigenschaften von sphärischen Dreiecken unterscheiden sich in vielerlei Hinsicht von den Eigenschaften von Dreiecken in der Ebene. Zu den bekannten drei Gleichheitsfällen von geradlinigen Dreiecken kommt also noch ein vierter hinzu: Zwei Dreiecke ABC und A`B`C` sind gleich, wenn die drei Winkel PA = RA`, PB = PB`, PC = PC` sind sind jeweils gleich. Auf der Kugel gibt es also keine ähnlichen Dreiecke, außerdem gibt es in der Kugelgeometrie keinen Begriff der Ähnlichkeit selbst, da es gibt keine Transformationen, die alle Abstände gleich oft (ungleich 1) ändern. Diese Merkmale sind mit der Verletzung des euklidischen Axioms über parallele Linien verbunden und auch in der Geometrie von Lobatschewski enthalten. Dreiecke mit gleichen Elementen und unterschiedlichen Orientierungen werden als symmetrisch bezeichnet, wie beispielsweise die Dreiecke AC`C und BCC`

Die Summe der Winkel eines sphärischen Dreiecks ist immer größer als 180°. Die Differenz RA + RV + RS - p \u003d d (gemessen im Bogenmaß) - ist ein positiver Wert und wird als sphärischer Überschuss eines bestimmten sphärischen Dreiecks bezeichnet. Fläche eines sphärischen Dreiecks: S = R2 d wobei R der Radius der Kugel und d der sphärische Überschuss ist. Diese Formel wurde erstmals 1629 von dem Niederländer A. Girard veröffentlicht und nach ihm benannt.

Betrachten wir ein Diagonal mit dem Winkel a, dann kann die Kugel bei 226 = 2p/n (n ist eine ganze Zahl) in genau n Kopien eines solchen Digons geschnitten werden, und die Fläche der Kugel beträgt 4pR2 = 4p bei R = 1, also ist die Fläche des Digons 4p/n = 2a. Diese Formel gilt auch für a = 2pt/n und gilt daher für alle a. Wenn wir die Seiten des sphärischen Dreiecks ABC fortsetzen und die Fläche der Kugel durch die Flächen der Diagonalen ausdrücken, die in diesem Fall mit den Winkeln A, B, C und ihrer eigenen Fläche gebildet werden, dann können wir zum Obigen kommen Girard-Formel.

Unter einem sphärischen Dreieck versteht man ein Dreieck auf der Oberfläche einer Kugel, das aus Bögen von Großkreisen zusammengesetzt ist, also solchen Kreisen, deren Mittelpunkt der Mittelpunkt der Kugel ist. Die Winkel eines sphärischen Dreiecks sind die Winkel zwischen den Tangenten an seinen Seiten, die an seinen Spitzen gezogen werden. Wie die Winkel eines regelmäßigen Dreiecks reichen sie von 0 bis 180°. Im Gegensatz zu einem flachen Dreieck hat ein sphärisches Dreieck keine Winkelsumme von 180°, sondern mehr: Dies lässt sich leicht überprüfen, indem man sich beispielsweise ein Dreieck vor Augen führt, das aus den Bögen zweier Meridiane und dem Äquator auf einer Erdkugel besteht : Obwohl die Meridiane am Pol zusammenlaufen, stehen beide senkrecht auf dem Äquator, also hat dieses Dreieck zwei rechte Winkel!

Ein sphärisches Dreieck kann zwei rechte Winkel haben

Bereits der Inder Varahamihira (5.-6. Jahrhundert), die arabischen Mathematiker und Astronomen ab dem 9. Jahrhundert. (Sabit ibn Korra, al-Battani), und unter westlichen Mathematikern, beginnend mit Regiomontanus (XV Jahrhundert), gibt es einen wunderbaren Satz über sphärische Dreiecke in verschiedenen Formulierungen. So kann es in moderner Notation formuliert werden:

cosa = cosbcosc + sinbsinccosA. Der sphärische Kosinussatz ist sowohl für die Astronomie als auch für die Geographie sehr wichtig. Dieses Theorem ermöglicht es, die Koordinaten zweier Städte A und B zu verwenden, um die Entfernung zwischen ihnen zu bestimmen. Darüber hinaus half der Sphärische Kosinussatz Mathematikern in islamischen Ländern bei der Lösung eines weiteren praktischen Problems: Finden Sie in einer Stadt mit vorgegebenen Koordinaten die Richtung zur heiligen Stadt Mekka (jeder orthodoxe Muslim muss fünfmal am Tag in Richtung Mekka beten) . Um dieses Problem zu lösen und die Stadt B als Mekka zu betrachten, war es erforderlich, den Winkel A desselben Dreiecks zu finden.

Eine Seite aus der "Sammlung von Regeln für die Wissenschaft der Astronomie", 11. Jahrhundert, Autor unbekannt.

In der Astronomie erlaubt Ihnen der sphärische Kosinussatz, sich von einem Koordinatensystem auf der Himmelskugel zu einem anderen zu bewegen. Drei solcher Systeme werden am häufigsten verwendet: In einem dient der Himmelsäquator als Äquator, und die Pole der Welt dienen als Pole, um die die sichtbare tägliche Rotation der Leuchten stattfindet; andererseits ist der Äquator die Ekliptik – der Kreis, entlang dem die sichtbare Bewegung der Sonne vor dem Hintergrund der Sterne im Laufe des Jahres stattfindet; im dritten spielt der Horizont die Rolle des Äquators und der Zenit und der Nadir die Rolle der Pole. Insbesondere ist es dank des sphärischen Kosinussatzes möglich, die Höhe der Sonne über dem Horizont zu verschiedenen Zeiten und an verschiedenen Tagen im Jahr zu berechnen.

Segel in der Architektur sind ein kugelförmiges Dreieck, das einen Übergang von einem quadratischen Kuppelraum zu einem Kuppelumfang bietet. Segel, pandativ (aus dem französischen Pendantif) - Teil des Gewölbes, ein Element der Kuppelstruktur, durch das der Übergang von der rechteckigen Basis zur Kuppeldecke oder ihrer Trommel erfolgt. Das Segel hat die Form eines kugelförmigen Dreiecks mit seiner Spitze nach unten und füllt den Raum zwischen den Federbögen aus, die die angrenzenden Säulen des gewölbten Quadrats verbinden. Die Basen der kugelförmigen Dreiecke der Segel bilden zusammen einen Kreis und verteilen die Last der Kuppel entlang des Umfangs der Bögen.

Kuppel auf Segeln Segel malen

Georg Nelson

"Der Designer kann sich entspannen und etwas Spaß haben; das Ergebnis kann ein Witz sein, Spaß. Es ist erstaunlich, wie oft das sehr viel Spaß macht." George Nelson

George Nelson ist ein amerikanischer Designer, Architekt, Kritiker und Designtheoretiker. (1908, Hartford, Connecticut - 1986, New York)

Er entwarf Leuchten, Uhren, Möbel, Verpackungen und beschäftigte sich mit Ausstellungsdesign.

Die berühmtesten Designprojekte von George Nelson sind die meisterhafte Stilisierung geometrischer Formen im Geiste der Op-Art oder des geometrischen Abstraktionismus.

Der Designer baut die Form seines berühmten schwarzen Stuhls auf der Grundlage eines kugelförmigen Dreiecks auf, das in den architektonischen Strukturen von Kuppelbauten weit verbreitet war. Insbesondere in byzantinischen und russischen Kirchen wurde ein solches kugelförmiges Dreieck als "Segel" bezeichnet. Dank des „Segels“ wurde ein fließender Übergang von der Kuppelstütze zur Kuppel durchgeführt.

George Nelson (George Harold Nelson, 1908-1986)

Escher-Gravur

Konzentrische Kugeln, 1935. Endgravur 24 x 24 cm.

Vier konzentrische Hohlkugeln werden von einer zentralen Lichtquelle beleuchtet. Jede Kugel besteht aus einem Gitter, das aus neun großen sich schneidenden Ringen besteht; sie teilen die Kugeloberfläche in 48 gleichartige Kugeldreiecke. Maurits Cornelis Escher (niederländisch. Maurits Cornelis 17. Juni 1898, Leeuwarden, Niederlande - 27. März 1972, Laren, Niederlande) - niederländischer Grafiker.

Anwendung des sphärischen Dreiecks:

  1. Verwendung von sphärischen Dreiecken in 3D-Grafiken
  2. In der Astronomie
  3. In der Geographie. Mit dem Satz über das sphärische Dreieck können Sie die Koordinaten zweier Städte A und B verwenden, um die Entfernung zwischen ihnen zu ermitteln.
  4. In der Architektur
  5. Stuhldesign von George Nelson
  6. Beim Gravieren

Sphärische Trigonometrie

sphärische Dreiecke. Auf der Oberfläche einer Kugel wird der kürzeste Abstand zwischen zwei Punkten entlang des Umfangs eines Großkreises gemessen, dh eines Kreises, dessen Ebene durch den Mittelpunkt der Kugel geht. Eckpunkte eines sphärischen Dreiecks sind die Schnittpunkte der drei Strahlen, die aus dem Mittelpunkt der Kugel und der Kugeloberfläche austreten. Parteien a, b, c eines sphärischen Dreiecks heißen die Winkel zwischen den Strahlen, die kleiner sind (ist einer dieser Winkel gleich, dann entartet das sphärische Dreieck in einen Halbkreis eines Großkreises). Jede Seite des Dreiecks entspricht einem Bogen eines großen Kreises auf der Oberfläche der Kugel (siehe Abbildung).

Ecken EIN, B, C sphärisches Dreieck gegenüberliegende Seiten a, b, c sind per Definition kleiner als , die Winkel zwischen den Bögen von Großkreisen, die den Seiten des Dreiecks entsprechen, oder die Winkel zwischen den durch diese Strahlen definierten Ebenen.

Sphärische Trigonometrie befasst sich mit der Untersuchung der Beziehung zwischen den Seiten und Winkeln von sphärischen Dreiecken (z. B. auf der Erdoberfläche und auf der Himmelskugel). Physiker und Ingenieure ziehen es jedoch bei vielen Problemen vor, Rotationstransformationen anstelle der sphärischen Trigonometrie zu verwenden.

Eigenschaften von sphärischen Dreiecken. Jede Seite und jeder Winkel eines sphärischen Dreiecks ist per Definition kleiner als .

Die Geometrie auf der Oberfläche der Kugel ist nicht euklidisch; in jedem kugelförmigen dreieck liegt die seitensumme zwischen 0 und , die winkelsumme zwischen und . In jedem Kugeldreieck liegt der größere Winkel der größeren Seite gegenüber. Die Summe zweier beliebiger Seiten ist größer als die dritte Seite, die Summe zweier beliebiger Winkel ist kleiner als plus der dritte Winkel.

Sphärisches Dreieck und Grundformeln der sphärischen Trigonometrie

Viele Probleme der Astronomie im Zusammenhang mit den scheinbaren Positionen und Bewegungen von Himmelskörpern reduzieren sich auf die Lösung von sphärischen Dreiecken.

Ein sphärisches Dreieck ist eine Figur ABC auf der Oberfläche einer Kugel, die aus Bögen dreier großer Kreise besteht (Abb. 15).

Die Winkel eines sphärischen Dreiecks sind die Flächenwinkel zwischen den Ebenen der Großkreise, die die Seiten des sphärischen Dreiecks bilden. Diese Winkel werden durch die flachen Winkel an den Eckpunkten des Dreiecks zwischen den Tangenten an seine Seiten gemessen.

Üblicherweise werden Dreiecke betrachtet, deren Winkel und Seiten kleiner als 180° sind. Bei solchen Kugeldreiecken ist die Winkelsumme immer größer als 180° aber kleiner als 540° und die Seitensumme immer kleiner als 360°. Die Differenz zwischen der Summe der drei Winkel eines sphärischen Dreiecks und 180° nennt man den sphärischen Exzess σ, d.h.

σ = DA + DB + DC – 180°.

Die Fläche eines sphärischen Dreiecks ist s

Wobei R der Radius der Kugel ist, auf deren Oberfläche das Dreieck gebildet wird.

Ein sphärisches Dreieck unterscheidet sich daher in seinen Eigenschaften von einem flachen Dreieck, und es ist unmöglich, trigonometrische Formeln auf eine Ebene anzuwenden.

Nehmen Sie ein sphärisches Dreieck ABC (Abb. 15), das auf einer Kugel mit Radius R gebildet und am Punkt O zentriert ist.

Vom Scheitelpunkt A ziehen wir die Tangenten AD und AE an die Seiten b und c, bis sie sich mit den Verlängerungen der Radien OS und 0B schneiden, die mit der entsprechenden Tangente in derselben Ebene liegen. Durch Verbinden der direkten Schnittpunkte von D und E erhält man zwei flache schiefe Dreiecke ADE und ODE mit einer gemeinsamen Seite DE. Wenden wir elementare Geometriesätze auf diese Dreiecke an, schreiben wir:

DE 2 \u003d OD 2 + OE 2 - 2OD × OE × cos a,

DE 2 \u003d AD 2 + AE 2 - 2AD × AE × cos A.

Indem wir die zweite Gleichung von der ersten subtrahieren, erhalten wir:

2OD × OE × cos a \u003d OD 2 - AD 2 + OE 2 - AE 2 + 2AD × AE × cos A. (1,31)

Aus rechtwinkligen flachen Dreiecken OAE und OAD folgt:

OD 2 -AD 2 =R 2 ;OE 2 -AE 2 =R 2 ;

AD = Rtgb; AE = Rtgs;

Setzen wir diese Beziehungen in Formel (1.31) ein und nehmen die entsprechenden Reduktionen und Übertragungen vor, erhalten wir

cos a \u003d cos b cos c + sin b sin c cos A, (1.32)

diese. Der Kosinus einer Seite eines sphärischen Dreiecks ist gleich dem Produkt der Kosinusse seiner beiden anderen Seiten plus dem Produkt der Sinusse derselben Seiten und dem Kosinus des Winkels zwischen ihnen.

Formel (1.32) kann für jede Seite des Dreiecks geschrieben werden. Schreiben wir es zum Beispiel für Seite b:

cos b = cos mit cos a + sin mit sin a cos B

und durch Einsetzen von cos a in Formel (1.32) erhalten wir

cos b = cos c (cos b cos c + sin b sin c cos A) + sin c sin a cos B.

Wenn wir die Klammern erweitern und den ersten Term der rechten Seite nach links verschieben, erhalten wir:

cos b (1 - cos 2 s) \u003d sin b sin mit cos mit cos A + sin c sin a cos B.

Wenn wir (1 - cos 2 s) durch sin 2 s ersetzen und alles durch sin c reduzieren, erhalten wir schließlich

sin a cos B \u003d sinc cos b - cos c sin b cos A, (1.33)

diese. Das Produkt aus dem Sinus der Seite und dem Kosinus des eingeschlossenen Winkels ist gleich dem Produkt aus dem Sinus der anderen Seite, die den eingeschlossenen Winkel begrenzt, und dem Kosinus der dritten Seite minus dem Produkt des Kosinus der Seite, die den eingeschlossenen Winkel begrenzt Winkel durch den Sinus der dritten Seite und den Kosinus des Winkels gegenüber der ersten Seite.

Die Formel (1.33) heißt die Formel der fünf Elemente. Es kann analog für die Produkte von sin a cos C, sin b cos A, sin b cos C, sin mit cos A und sin mit cos B geschrieben werden.

Wir lösen nun Gleichheit (1.32) nach cos A:

Indem wir beide Seiten der letzten Gleichheit quadrieren und von 1 subtrahieren, erhalten wir:

Wenn wir die Klammern öffnen und beide Teile dieses Ausdrucks durch sin 2 a dividieren, erhalten wir

Der resultierende Ausdruck ist perfekt symmetrisch in Bezug auf a, b und c, und wenn wir A durch B und b oder A durch C und a durch c ersetzen, schreiben wir

diese. die Sinus der Seiten eines sphärischen Dreiecks sind proportional zu den Sinus ihrer gegenüberliegenden Winkel; oder das Verhältnis des Sinus einer Seite eines sphärischen Dreiecks zum Sinus des gegenüberliegenden Winkels ist eine Konstante.

Die drei abgeleiteten Beziehungen (1.32), (1.33), (1.34) zwischen den Seiten und Winkeln eines sphärischen Dreiecks sind die wichtigsten; viele andere Formeln der sphärischen Trigonometrie lassen sich daraus ableiten. Wir beschränken uns darauf, nur eine Formel für ein rechtwinkliges Kugeldreieck herzuleiten. Sei A = 90°; dann sin A \u003d 1, cos A \u003d 0, und aus Formel (1.33) erhalten wir

sin a cos B \u003d sin mit cos b.

Dividiert man beide Teile dieser Gleichheit durch sin b und setzt man gemäß (1.34) ein, erhält man:

ctg B = Sünde c ctg b

diese. Das Verhältnis der Tangente eines Schenkels eines rechtwinkligen sphärischen Dreiecks zur Tangente des gegenüberliegenden Winkels ist gleich dem Sinus des anderen Schenkels.

Um Informationen über ein Bild auf einer Gaußschen Kugel in einem Computer darzustellen, ist es sinnvoll, deren Oberfläche in Zellen zu unterteilen.

Dabei wird jeder Zelle der Bereich desjenigen Teils der ursprünglichen Oberfläche zugeordnet, der innerhalb des durch die Teilungszelle bestimmten Richtungskegels orientiert ist. Eine solche diskrete Approximation des erweiterten sphärischen Bildes wird als Orientierungshistogramm bezeichnet. Idealerweise sollten Zellen folgende Anforderungen erfüllen:

Haben Sie den gleichen Bereich;

Seien Sie die gleiche Form

Seien Sie regelmäßig beabstandet;

Haben eine abgerundete Form;

Die Partitionierung sollte eine ausreichend gute Winkelauflösung liefern;

Es muss Rotationen geben, die die Partition in sich aufnehmen.

Längliche Zellen müssen ausgeschlossen werden, da sie Informationen über Flächenbereiche entsprechen, deren Orientierung sich stärker ändert als bei runderen Zellen derselben Fläche. Wenn die Zellen regelmäßig angeordnet sind, ist gleichzeitig ihre Lage in Bezug auf ihre Nachbarn für alle Zellen gleich, und solche Konfigurationen sind sehr wünschenswert. Leider ist es nicht möglich, alle diese Anforderungen gleichzeitig zu erfüllen.

Eine der möglichen Partitionen wird durch Breitengürtel gebildet, die dann jeweils durch Meridianstreifen unterteilt werden (Abb. 16.13). Die resultierenden Zellen können nahezu flächengleich gemacht werden, wenn die Anzahl solcher Bänder in hohen Breiten reduziert wird. Einer der Vorteile eines solchen Schemas ist die Einfachheit, eine Zelle zu finden, der es notwendig ist, eine bestimmte Normale zur Oberfläche zuzuweisen. Ein solches Verfahren ist jedoch zu weit davon entfernt, die oben aufgeführten Anforderungen zu erfüllen. Beispielsweise gibt es keine Drehungen, mit deren Hilfe die konstruierte Teilung der Kugel in sich selbst übersetzt wird (außer Drehungen um die die Pole verbindende Achse).

Geeignetere Partitionen können erhalten werden, indem auf die Einheitskugel regelmäßige Polyeder projiziert werden, deren Mittelpunkte mit dem Mittelpunkt der Kugel zusammenfallen. Die Flächen eines regelmäßigen Polyeders sind regelmäßige Polygone (und sie sind alle gleich). Daher hat die durch die Projektion eines regelmäßigen Polyeders erhaltene Partition die Eigenschaft, dass alle Zellen die gleiche Form und Fläche haben. Außerdem ist die geometrische Anordnung aller Zellen in Bezug auf ihre Nachbarn gleich. Leider,

Reis. 16.13. Die Aufteilung einer Kugel in Elemente durch Meridiane und Parallelen. Leider hat eine solche Partition nur wenige der Eigenschaften, die zum Speichern eines Orientierungshistogramms erforderlich sind.

Reis. 16.14. (siehe Scan) Projizieren eines Dodekaeders und eines Ikosaeders auf eine einzelne Kugel, um eine Aufteilung in und Zellen zu erhalten.

Es sind nur fünf regelmäßige Körper bekannt, aus denen man wählen muss (Tetraeder, Hexaeder, Oktaeder, Dodekaeder und Ikosaeder). Bei einem Dodekaeder sind die Zellen ziemlich abgerundet (Abb. 16.14, a). Das Dodekaeder hat jedoch nur zwölf Flächen. Sogar das Ikosaeder gibt eine sehr grobe Darstellung der Orientierung (Abbildung 16.14b). Außerdem sind zwanzig seiner Zellen nicht sehr rund.

Wir können noch weiter gehen und halbreguläre Polyeder betrachten. Ihre Gesichter sind ebenfalls regelmäßige Polygone, aber nicht unbedingt gleich. Die Flächen aller Flächen sind nicht gleich. In einigen Fällen ist es möglich, ein neues Polyeder zu konstruieren, das dieselbe Topologie von Verbindungen zwischen Flächen wie das ursprüngliche halbregelmäßige Polyeder aufweist, dessen Flächenbereiche jedoch gleich sind. Dabei

Reis. 16.15. a - ein abgeschnittenes Ikosaeder, das ein halbregelmäßiges Polyeder mit 32 Flächen ist; b - Penta bis Dekaeder, bestehend aus 60 dreieckigen Flächen. Kleinere Partitionen der Oberfläche der Einheitskugel können auf solchen halbregelmäßigen Polyedern basieren.

Reis. 16.16. Fähigkeit, geodätische Netzwerke basierend auf einer der Projektionen von regulären oder semi-regulären Polyedern zu erstellen.

Jedes Gesicht ist in dreieckige Zellen unterteilt. Das hier gezeigte Netzwerk basiert auf dem Ikosaeder und hat 12 Eckpunkte, die an 5 Zellen angrenzen. Sechs Zellen konvergieren an den verbleibenden Eckpunkten.

Die Form einiger Gesichter stimmt nicht mehr. Ein Beispiel für eine auf einem halbregelmäßigen Polyeder basierende Partition ergibt einen Fußball (Abb. 16.15, a). Der Ikosaederstumpf, also ein Körper mit 12 fünfeckigen und 20 sechseckigen Flächen, wird als Anfang genommen. Leider gibt es nur 13 halbregelmäßige Polyeder (fünf abgeschnittene reguläre Polyeder, das Kuboktaeder, das Ikosidodekaeder, den Stumpfwürfel, das Stumpfikosidodekaeder, das abgeschnittene Kuboktaeder, das Rhombikuboktaeder, das abgeschnittene Ikosidodekaeder und das Rhombenikosidodekaeder). Sie führen nicht zu Partitionen, die für unsere Zwecke klein genug sind.

Wenn wir dennoch eine feinere Partition erhalten möchten, können wir versuchen, die vorhandene in dreieckige Elemente zu zerlegen. Wenn wir beispielsweise jede der fünfeckigen Flächen des Dodekaeders in fünf gleiche Dreiecke zerlegen, erhalten wir ein Pentadodekaeder mit 60 Flächen (Abb. 16.15, b). Ohm ist dual zum abgeschnittenen Ikosaeder.

In gleicher Richtung fortfahrend, lässt sich jedes der entstehenden Dreiecke in vier kleinere Dreiecke unterteilen, ganz in Anlehnung an die aus der Geodäsie bekannten Kuppelstrukturen (Abb. 16.16). Indem einige der obigen Anforderungen gelockert werden, kann eine hohe Auflösung erreicht werden. Tatsächlich ist es besser, duale Konstruktionen zu verwenden, da ihre Flächen überwiegend (unregelmäßige) Sechsecke mit 12 dazwischen verstreuten Fünfecken sind (Abb. 16.15, b). Auf diese Weise können beliebig kleine Partitionen bereitgestellt werden.

Um diesen Ansatz zu verwenden, ist es notwendig, das Element effizient bestimmen zu können, das einer gegebenen Normalen zur Oberfläche entspricht. Im Fall von Partitionen, die auf der Grundlage regelmäßiger Polyeder erhalten werden, ist es einfach, die Kosinusse der Winkel zwischen einem gegebenen Einheitsvektor und den den Zellzentren entsprechenden Vektoren zu berechnen. (Letztere entsprechen den Scheitelpunkten des Duals

regelmäßiges Polyeder.) Dann wird der gegebene Vektor der Zelle zugeordnet, deren Mittelpunkt am nächsten liegt. Bei einer einem geodätischen Netz ähnlichen Aufteilung kann hierarchisch vorgegangen werden. Eine solche Partition basiert auf einem regelmäßigen Polyeder. Die Zelle mit dem nächsten Zentrum wird wie oben beschrieben gefunden. Danach bestimmen wir, in welches der Dreiecke, die es unterteilen, der Einheitsnormalenvektor fällt. Dieser Prozess setzt sich für die nächsten vier Dreiecke fort, die das gefundene Dreieck unterteilen usw. In der Praxis können Tabellensuchverfahren verwendet werden, die zwar nicht genau, aber sehr schnell sind.

Der Raumwinkel sei durch eine Zelle auf der Kugel ausgefüllt (im Fall des Ikosaeders). Die erwartete Anzahl von Normalen, die für ein konvexes Objekt in eine solche Zelle fallen, ist

Es ist klar, dass das Orientierungshistogramm, d. h. die diskrete Approximation des erweiterten sphärischen Bildes, lokal berechnet werden kann. Wir zählen einfach die Anzahl der Normalen, die zu jeder Zelle gehören. Gleichzeitig wird die Gaußsche Krümmung in Form der ersten und zweiten partiellen Ableitung der die Oberfläche definierenden Funktion ausgedrückt. In der Praxis erweisen sich Schätzungen dieser Ableitungen aufgrund des Vorhandenseins von Rauschen als unzuverlässig. Daher ist die Tatsache, dass das ausgedehnte sphärische Bild ohne Berechnung von Ableitungen berechnet werden kann, sehr wichtig.

Die Geschichte dieser Demo ist wie folgt: Ein Freund von mir hat einmal einen Planetenkartengenerator für sein Spiel erstellt und wollte, dass die so erstellten Karten als rotierende Kugel angezeigt werden. Gleichzeitig wollte er jedoch keine 3D-Grafik verwenden, sondern viele Frames mit derselben Kugel erzeugen, die in verschiedenen Winkeln gedreht wurde. Die verwendete Speichermenge war ... sagen wir, übermäßig, aber die Geschwindigkeit der Frame-Generierung (sowie die Qualität ihrer Ausführung) litt stark darunter. Nach einigem Nachdenken gelang es mir, ihm bei der Optimierung dieses Prozesses zu helfen, aber im Allgemeinen hatte ich das gute Gefühl, dass dies eine Aufgabe für OpenGL und überhaupt nicht für 2D-Grafik war.

Und so beschloss ich eines Tages, als ich von Schlaflosigkeit gequält wurde, zu versuchen, diese beiden Ansätze zu kombinieren: eine rotierende Kugel (mit einer darüber gespannten Karte des Planeten) durch OpenGL zu zeichnen, sie aber gleichzeitig flach zu lassen.

Und ich muss sagen, dass es mir gelungen ist. Aber der Reihe nach.

Prozessmathematik

Lassen Sie uns zunächst die eigentliche Aufgabe definieren. Für jeden Punkt auf dem Bildschirm haben wir zwei Bildschirmkoordinaten im kartesischen Koordinatensystem, und wir müssen sphärische Koordinaten dafür finden (tatsächlich Längen- und Breitengrad), die tatsächlich die Texturkoordinaten für die Planetenkarte sind.

So. Der Übergang von einem sphärischen Koordinatensystem zu einem kartesischen ist durch ein Gleichungssystem gegeben (entnommen aus Wikipedia):

Und der umgekehrte Übergang - mit solchen Gleichungen:

Koordinate Z wir können leicht raus X und Y, wenn wir den Radius kennen, und wir können den Radius selbst gleich eins nehmen.
In Zukunft werden wir uns darauf einigen, obige Gleichungen leicht zu verändern, indem wir die Begriffe vertauschen Y(für uns wird es ein vertikaler Bildschirm sein) und Z(Dies wird die Tiefe der Szene sein).

Technischer Bereich

Die Umsetzung der Idee erfordert, dass wir ein Quad verwenden (ich spreche bereits darüber, wie man es verwendet, also werde ich es nicht wiederholen, zumal unten ein Link zum vollständigen Quellcode des Projekts ist), sowie zwei Texturen: die eigentliche Karte des Planeten (ich habe die Erdtextur von 2048x1024 verwendet) und Texturkoordinatenkarten. Der Code zum Generieren der zweiten Textur wiederholt sauber die Mathematik der Konvertierung von kartesischen in sphärische Koordinaten:

int texSize = 1024; doppeltes r = texSize * 0,5; int Pixel = neues int; for (int zeile = 0, idx = 0; zeile< texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x<= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
Beachten Sie, dass die Koordinaten X und Y werden aus dem Bereich in den Bereich [-1..1] und die Texturkoordinaten übertragen U und v werden vom Bogenmaß in den Bereich konvertiert, wonach sie in die roten bzw. grünen Komponenten der 32-Bit-Textur geschrieben werden. Der Alphakanal wird zum Speichern von "Tiefe" (Koordinaten Z), während blau vorerst ungenutzt bleibt. Das Deaktivieren der bilinearen Filterung ist auch kein Zufall: In diesem Stadium hat es keine Wirkung (benachbarte Punkte haben auf jeden Fall die gleichen Werte mit ziemlich scharfen Sprüngen), und in dem, was ich als nächstes zeigen werde, wird es schädlich sein. Aber dazu weiter unten mehr.

Beide Texturen werden dem Eingang eines einfachen Pixelshaders zugeführt (im Folgenden sind die Bilder anklickbar):

Private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "variating vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w >
Ich gebe den Szenen-Rendering-Code nicht an, weil alles ist ziemlich trivial (und wieder kann man es in der vollständigen Quelle sehen), und der Shader selbst ist ziemlich primitiv. Das Merkwürdigste daran ist vielleicht, dass der Alphakanal bisher nur auf Positivität geprüft wird, während er für einen Lichteffekt verwendet werden könnte.

Es ist ganz gut geworden, aber irgendwie flach, außerdem möchte ich die tatsächliche Rotation des Planeten um seine Achse hinzufügen.

Wir nehmen einen weiteren Parameter in den Shader auf (wir ändern ihn abhängig von der Zeit im Bereich) und fügen „Tiefe“ hinzu (multiplizieren die Farbe mit dem Wert aus dem Alphakanal):

Private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "variating vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy ).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
Nun, es gibt keine Beschwerden über die Kugel selbst, aber das Bild sieht irgendwie ... acht Bit oder so aus. Und kein Wunder: Wir haben Texturkoordinaten in einem Bereich aufgezeichnet (das Maximum, das uns in gewöhnlichen Farbkomponenten zur Verfügung steht), was bedeutet, dass unsere Textur nicht mehr als 256 Punkte in der Höhe (und 512 in der Breite, unter Berücksichtigung der Rotation) haben kann. Nicht genug, Sie brauchen mindestens 10-Bit-Präzision.

Erhöhen der Auflösung

Ich warne Sie sofort: Der hier beschriebene Code kann auf allen Geräten schief funktionieren, obwohl ich es geschafft habe, auf allen Geräten, die ich in meinen Händen halten konnte, ein normales Rendering zu erreichen. Was hier beschrieben wird, ist jedenfalls ein gängiger Hack.

Wir haben also bisher zwei der drei Farbkomponenten verwendet, d.h. 16 Bits von 24. Nun, packen wir die Daten so, dass jede Texturkoordinate eine Größe von 12 Bits hat, was es uns ermöglicht, mit Texturen mit einer Höhe von bis zu 4096 Pixeln zu arbeiten! Dazu ändern wir buchstäblich drei Zeilen im Programm:

Long v = Math.round(4095 * theta / Math.PI); ...u = Math.round(4095 * phi / (2 * Math.PI)); ... Pixel = (int) ((a<< 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
und schreibe einen neuen Shader, der das 12-Bit-Adressierungsschema berücksichtigt (hier muss die bilineare Filterung deaktiviert werden!):

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "variating vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = floor(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095,0 + uOffset,\n" + " (vOff.z * 16,0 + hiY) / 4095,0);\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
Nun, das ist eine ganz andere Sache! Mit geringfügigen Änderungen (Hinzufügen von Pinch-Zoom und Fingerdrehung) zeigte ich dieses Programm meinen Freunden und Kollegen und fragte gleichzeitig, wie viele Dreiecke ihrer Meinung nach in dieser Szene seien. Die Ergebnisse waren unterschiedlich, und die Frage selbst erweckte den Verdacht auf das Vorhandensein eines Hakens (in diesem Fall scherzten die Befragten „eins“, was nicht weit von der Wahrheit entfernt war), aber die richtige Antwort war durchweg überraschend. Und alle fragten gemeinsam: Warum kann eine Kugel um eine Achse gedreht, aber nicht gekippt werden?.. Hmm.

Neigung

Tatsache ist jedoch, dass die Steigung in diesem Schema viel schwieriger zu implementieren ist. Tatsächlich ist die Aufgabe nicht unlösbar, und ich habe sie sogar gemeistert, aber nicht ohne Nuancen.

Im Wesentlichen läuft die Aufgabe darauf hinaus, die verschobene Koordinate zu nehmen v, während die Koordinate Uändert sich nicht: Dies liegt daran, dass wir die Rotation um die Achse hinzufügen X. Der Plan ist wie folgt: Wir transformieren die Texturkoordinaten in Bildschirmkoordinaten (im Bereich [-1..1]), wenden die Rotationsmatrix um die horizontale Achse darauf an (dazu schreiben wir vorab eine neue Konstante ein uTilt Sinus und Cosinus des Neigungswinkels), und dann verwenden wir die neue Koordinate Y zum Ausprobieren in unserer Template-Textur. "Gedrehte" Koordinate Z es wird uns auch nützlich sein, mit seiner Hilfe spiegeln wir den Längengrad für die Rückseite des Balls). Bildschirmkoordinate Z Sie müssen explizit rechnen, um nicht zwei Texturauswahlen aus einer Textur zu treffen, gleichzeitig erhöht dies die Genauigkeit.

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "uniform vec2 uTilt;\n" + "variating vec4 TexCoord0;\n" + "void main() (\n" + " float sx = 2.0 * TexCoord0.x - 1.0;\n" + " float sy = 2.0 * TexCoord0.y - 1.0;\n" + " float z2 = 1.0 - sx * sx - sy * sy;\n" + " if (z2 > 0.0) (;\n" + " float sz = sqrt(z2);\n" + " float y = ( sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0 , vec2(TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = floor(vOff.y / 16.0) ;\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0,\n" + " ( vOff.z * 16.0 + hiY) / 4095.0);\n" + " if (z< 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
Hurra, die Piste hat funktioniert! Das ist nur ein seltsames Geräusch an der Grenze der Halbkugeln, ein wenig peinlich. Offensichtlich liegt das Problem in der ungenügenden Adressierungsgenauigkeit an den Randpunkten (die Punkte auf dem Kreis selbst entsprechen einem zu großen Koordinatenbereich, ein Texel erstreckt sich über ein Intervall von ziemlich auffälliger Länge). Am Ende gelang es mir, dies zu besiegen, indem ich zwei generierte Texturen anstelle von einer verwendete.

Dadurch können Sie den Ball ähnlich wie in Google Earth vergrößern und drehen. Mit dem Unterschied, dass es nur zwei Dreiecke gibt.

Und schließlich das Versprechen. Der Quellcode für das Projekt ist verfügbar unter