Si « le plus rapide » comprend la quantité de votre temps passé, la solution dépendra de ce que le logiciel que vous êtes à l' aise avec et peut utiliser rapidement. Les remarques suivantes se concentrent par conséquent sur les idées pour atteindre les temps de calcul les plus rapides possibles .
Si vous utilisez un programme préenregistré, le mieux que vous puissiez faire est presque certainement de prétraiter les polygones pour configurer une structure de données point par polygone, comme un arbre KD ou un arbre quadruple, dont les performances seront généralement O (log (V ) * (N + V)) où V est le nombre total de sommets dans les polygones et N est le nombre de points, car la structure des données prendra au moins O (log (V) * V) effort pour créer et ensuite doivent être sondés pour chaque point à un coût par point O (log (V)).
Vous pouvez faire beaucoup mieux en quadrillant d'abord les polygones, en exploitant l'hypothèse d'aucun chevauchement. Chaque cellule de la grille se trouve soit entièrement dans un intérieur de polygone (y compris l'intérieur du "polygone universel"), auquel cas étiquetez la cellule avec l'identifiant du polygone, ou bien elle contient un ou plusieurs bords de polygone. Le coût de cette pixellisation, égal au nombre de cellules de grille référencées lors de la pixellisation de toutes les arêtes, est O (V / c) où c est la taille d'une cellule, mais la constante implicite dans la notation big-O est petite.
(Une beauté de cette approche est que vous pouvez exploiter des routines graphiques standard. Par exemple, si vous avez un système qui (a) dessinera les polygones sur un écran virtuel en utilisant (b) une couleur distincte pour chaque polygone et (c) permet vous devez lire la couleur de tout pixel que vous souhaitez traiter, vous l'avez fait.)
Avec cette grille en place, présélectionnez les points en calculant la cellule contenant chaque point (une opération O (1) ne nécessitant que quelques horloges). À moins que les points ne soient regroupés autour des limites du polygone, cela ne laissera généralement qu'environ O (c) points avec des résultats ambigus. Le coût total de construction de la grille et de présélection est donc O (V / c + 1 / c ^ 2) + O (N). Vous devez utiliser une autre méthode (telle que celles recommandées jusqu'à présent) pour traiter les points restants (c'est-à-dire ceux qui sont proches des limites des polygones), au coût de O (log (V) * N * c) .
Comme c devient plus petit, de moins en moins de points seront dans la même cellule de grille avec un bord et donc de moins en moins nécessiteront le traitement O (log (V)) ultérieur. Agir contre cela est la nécessité de stocker O (1 / c ^ 2) cellules de la grille et de passer O (V / c + 1 / c ^ 2) temps à tramer les polygones. Il y aura donc une taille de grille optimale c. En l'utilisant, le coût de calcul total est O (log (V) * N) mais la constante implicite est généralement beaucoup plus petite que l'utilisation des procédures prédéfinies, en raison de la vitesse O (N) de la présélection.
Il y a 20 ans, j'ai testé cette approche (en utilisant des points uniformément espacés dans toute l'Angleterre et au large des côtes et en exploitant une grille relativement brute d'environ 400 000 cellules offerte par les tampons vidéo de l'époque) et j'ai obtenu une accélération de deux ordres de grandeur par rapport au meilleur algorithme publié que j'ai pu trouver. Même lorsque les polygones sont petits et simples (comme les triangles), vous êtes pratiquement assuré d'une accélération d'un ordre de grandeur.
D'après mon expérience, le calcul était si rapide que toute l'opération était limitée par les vitesses d'E / S de données, et non par le CPU. En anticipant que les E / S pourraient être le goulot d'étranglement, vous obtiendriez les résultats les plus rapides en stockant les points dans un format aussi compressé que possible pour minimiser les temps de lecture des données. Réfléchissez également à la façon dont les résultats doivent être stockés, afin de limiter les écritures sur disque.