[WIP]-1656-3-cluster-galaxy-canvas #1787
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Implementierung der interaktiven Sternenkarte mit Cluster- und Punktdetails
Pull Request Beschreibung
Titel: Implementierung der interaktiven Sternenkarte mit Cluster- und Punktdetails
Zusammenfassung:
In diesem Pull Request wird die interaktive Sternenkarte innerhalb des Projekts um die Möglichkeit erweitert, auf spezifische Cluster und Punkte (Sterne) zu klicken und entsprechende Details anzuzeigen. Die Cluster sind gruppierte Sammlungen von Punkten, die als Sterne dargestellt werden. Gelbe Punkte repräsentieren Benutzer, während graue Punkte leere Stellen innerhalb der Cluster darstellen.
Implementierte Änderungen:
Grundlegendes Setup der Canvas-Elemente:
initCanvas
-Methode initialisiert das Canvas-Element und fügt Event-Listener für Zoom, Pan und Klicks hinzu.Cluster-Generierung und Platzierung:
generateClusters
erzeugt eine bestimmte Anzahl von Clustern (standardmäßig 100) und platziert sie in einem regelmäßigen Rastermuster auf dem Canvas.Interaktivität:
Cluster- und Punktdetails:
showPointDetails
zeigt Details eines spezifischen Punktes an, währendshowClusterDetails
die Details des gesamten Clusters anzeigt.Zoom und Pan Logik:
onZoom
undonPan
Methoden gesteuert.Responsives Verhalten:
resizeCanvas
-Methode ermöglicht, die bei jeder Größenänderung des Fensters aufgerufen wird.Code-Struktur:
Template-Teil:
Script-Teil:
Style-Teil:
Demo Sternenbilder zeichnen: https://codepen.io/ogerly/pen/xxorNbr
Anmerkungen:
Dieser PR fügt signifikante Funktionalität hinzu und verbessert die Benutzererfahrung erheblich, indem er es ermöglicht, auf der Sternenkarte zu navigieren und interaktiv mit den Daten zu interagieren.
Die mathematischen Formeln, die in deinem Code verwendet werden, beziehen sich hauptsächlich auf die Berechnung der Positionen von Clustern und der darin enthaltenen Punkte sowie auf die Platzierung dieser Cluster in einem Rastermuster.
1. Positionierung der Cluster
Die Cluster werden in einem Rastermuster angeordnet. Die Formel, um die Position eines Clusters zu bestimmen, basiert auf der Größe des Containers und einer zufälligen Abweichung:
Formel für die Position eines Clusters
Die Cluster werden innerhalb eines 2D-Rasters positioniert. Für jedes Cluster wird eine Basisposition (
baseX
,baseY
) innerhalb des Containers zufällig berechnet. Diese Basisposition wird dann durch eine zufällige Verschiebung modifiziert:[
\text{baseX} = \text{random}() \times \text{spaceWidth} + (\text{random}() - 0{,}5) \times \text{clusterSpacing}
]
[
\text{baseY} = \text{random}() \times \text{spaceHeight} + (\text{random}() - 0{,}5) \times \text{clusterSpacing}
]
spaceWidth
undspaceHeight
: Dies sind die Dimensionen des verfügbaren Raums (des Canvas), in dem die Cluster platziert werden.clusterSpacing
: Dies ist der Abstand zwischen benachbarten Clustern. Es stellt sicher, dass die Cluster nicht überlappen und genügend Platz zwischen ihnen liegt.random()
: Dies ist eine Funktion, die eine zufällige Zahl zwischen 0 und 1 erzeugt. Die Position der Cluster wird so zufällig verteilt, jedoch innerhalb eines kontrollierten Bereichs.2. Positionierung der Punkte innerhalb eines Clusters
Jedes Cluster enthält eine Reihe von Punkten, die ebenfalls zufällig innerhalb des Clusters platziert werden. Die Punkte werden um die Basisposition des Clusters (
baseX
,baseY
) herum verteilt.Formel für die Position eines Punktes innerhalb eines Clusters
Jeder Punkt hat eine zufällige Position relativ zu der Basisposition des Clusters:
[
\text{pointX} = \text{baseX} + (\text{random}() - 0{,}5) \times \text{clusterSize}
]
[
\text{pointY} = \text{baseY} + (\text{random}() - 0{,}5) \times \text{clusterSize}
]
baseX
undbaseY
: Die Basisposition des Clusters, um die sich die Punkte gruppieren.clusterSize
: Dies ist ein Wert, der die Größe des Clusters angibt und die maximale Entfernung eines Punktes von der Basisposition bestimmt.random()
: Erzeugt eine Zufallszahl zwischen 0 und 1, die verwendet wird, um die Position des Punktes innerhalb des Clusters zu bestimmen.3. Raster- und Cluster-Spacing-Konzept
Das Konzept eines Rasters bedeutet, dass die Cluster in einem regelmäßigen Muster angeordnet werden, ähnlich wie Quadrate auf einem Schachbrett. Der
clusterSpacing
-Wert stellt sicher, dass es genügend Abstand zwischen benachbarten Clustern gibt, sodass diese sich nicht überschneiden. Das Raster wird durch eine regelmäßige Wiederholung der Basispositionen in X- und Y-Richtung mit zusätzlicher Zufälligkeit für die Clusterpositionen erzeugt.Beispiel:
Wenn
spaceWidth = 1500
undspaceHeight = 1500
,clusterSpacing = 500
und wirrandom()
-Funktionen mit unterschiedlichen Werten verwenden, könnten die Basispositionen wie folgt berechnet werden:[
\text{baseX} = 1000 + (0{,}3 - 0{,}5) \times 500 = 1000 + (-0{,}2) \times 500 = 1000 - 100 = 900
]
[
\text{baseY} = 1500 + (0{,}8 - 0{,}5) \times 500 = 1500 + 0{,}3 \times 500 = 1500 + 150 = 1650
]
Ein Punkt in diesem Cluster könnte dann bei folgenden Werten platziert werden:
[
\text{pointX} = 900 + (0{,}4 - 0{,}5) \times 100 = 900 + (-0{,}1) \times 100 = 900 - 10 = 890
]
[
\text{pointY} = 1650 + (0{,}7 - 0{,}5) \times 100 = 1650 + 0{,}2 \times 100 = 1650 + 20 = 1670
]
Fazit
Die verwendeten Formeln und Konzepte sorgen dafür, dass die Cluster gleichmäßig über den verfügbaren Raum verteilt werden und jeder Punkt innerhalb eines Clusters zufällig positioniert ist, jedoch immer in relativer Nähe zur Basisposition des Clusters. Die Zufallsverteilung verhindert das Überlappen der Cluster und sorgt für eine natürliche, verstreute Anordnung innerhalb eines strukturierten Rasters.
Der Code eines fiktiven sternenbildes aus dem canvas.
Cluster: Cluster-60
Punkt 1: (577, 388)
Punkt 2: (761, 199)
Punkt 3: (628, 321)
Punkt 4: (722, 222)
Punkt 5: (694, 173)