2015-10-17 1 views
1

Je souhaite visualiser des catalogues d'étoiles astronomiques pouvant contenir des centaines de milliers d'entrées. Les catalogues consistent généralement simplement en une liste d'étoiles, avec des coordonnées sphériques et d'autres données pour chaque étoile. Par coordonnées sphériques, j'entends l'ascension droite (0-360 degrés ou 0-24 heures) et la déclinaison (-90 degrés à +90 degrés). Cela correspond à la longitude et la latitude, juste sur la sphère céleste au lieu de la surface de la Terre. Je voudrais tracer toutes les étoiles du catalogue qui sont situées dans un certain champ de vision, défini par le centre (en coordonnées sphériques) et la taille du champ de vision (en degrés) et la projection (projection stéréographique, par exemple).Tracer un graphique en étoile efficacement

Le traçage des étoiles en parcourant tout le catalogue et en vérifiant si chaque étoile se trouve ou non dans le champ de vision est très inefficace.

Comment est-ce que je pourrais rendre ceci plus efficace? Y a-t-il un bon algorithme ou structure de données pour ce genre de problème?

Répondre

1
  1. Pour les cartes de GFX modernes nombres comme 300K (et plus) étoiles sont encore gérables ...

    Vous pouvez essayer de les charger à GFX comme VBO/VAO et laisser le rendu/écrêtage à gfx seul. J'utilise Hipparcos (118322 étoiles) de cette façon sans problèmes alors que chaque étoile est un Quad transparent. Vous avez juste besoin de pré-calculer les quads pour voir la position avant le rendu (une seule fois). screenshot Voici une de mes applications où Hipparcos est utilisé de cette manière que les étoiles d'arrière-plan (en RT)

    Hipparcos VBO

    Vous pouvez également utiliser les shaders de géométrie pour faciliter les choses beaucoup (peut envoyer juste des points ou même Ra,Dec,Distance au lieu de Quads) mais cela limitera votre cible gfx HW à seulement ceux qui supportent les shaders de géométrie.

  2. Si vous avez plus d'étoiles, alors votre HW peut gérer ensuite utiliser ensemble de données triées

    La plupart des catalogues sont classés par Ra or Dec. Vous pouvez l'utiliser en:

    1. sélectionnez la zone de vue min(Ra,Dec),max(Ra,Dec)
    2. laisse supposer que vos données sont triées par Ra croissant
    3. trouver d'abord i0 où étoiles [i0] .RA> = min. Ra
      • utilisez la recherche binaire !!!
    4. trouver d'abord i1 où étoiles [i1] .RA> = max.Ra
      • utilisation recherche binaire !!!
    5. étoiles processus i0<=i<i1

    test si min.Dec <= star[i].Dec <= max.Dec et si oui rendu il.

  3. Si même cela ne suffit pas rapide, vous devez utiliser subdivision spatiale

    donc diviser votre ensemble de données plus petits. Et avant le rendu selon la zone de vue sélectionnée, n'utilisez que des jeux de données à proximité de cette zone. Cela réduira le nombre de données traitées de manière significative.

+0

J'aime l'idée de trier le jeu de données! Avez-vous des indications sur les techniques de subdivision spatiale? Je pense que j'ai entendu certaines personnes utiliser HEALPix pour ça. – naavis

+0

@naavis Je n'utilise pas la subdivision spatiale pour les étoiles car mes jeux de données sont assez rapides en tant que VBO unique (par rapport à un rendu plus lent de la diffusion de l'atmosphère, du terrain, etc.). Quoi qu'il en soit, vous pouvez diviser votre ensemble en grille sphérique avec une taille de grille assez petite. Ainsi, par exemple, vous pouvez choisir la taille de la cellule de grille '10deg x 10deg' en créant une table d'étoiles pour chaque cellule de la grille. Rendez ensuite uniquement les cellules situées à proximité de la zone de vue sélectionnée. Vous devriez jouer un peu avec la taille de la cellule pour maximiser la performance. – Spektre