04-04-2010, 11:40 PM
des idées en vrac, mais pas sûr que ça aide vraiment.
Vu ton besoin il me semble préférable que les coordonnées de ton bateau soit le centre du bateu et non une extrémité. Ainsi tu auras directement le "cercle" de vision (ie coordonnées + rayon) alors que là c'est plus compliqué (ie {coordonnées + moitié de la taille du bateau * la direction} + rayon)
de plus je pars de l'hypothèse que tes bateaux sont des "fils" (pas d'épaisseur, juste un "trait") Dans ce cas tu dois juste tester les deux extrémités de chaque bateau. Si une des extrémités est dans le cercle alors le bateau est visible
enfin pour restreindre les calculs avec une requête filtrée, tu ne dois tester, par rapport à ton bateau "cercle" que les bateaux qui respectent une règle de type :
distance entre le centre du bateau "cercle" et le centre du bateau "visible" < rayon de vision du bateau cercle + 0.5* taille du bateau "visible"
explication :
les centres = facile à trouver si tu prends "mes" coordonnées (un peu différente des tiennes, mais facile à updater) puisque ce sont elles même
la distance des centres = (x cercle - x bateau)^2 + (y cercle - y bateau)^2
le rayon + 0.5 * taille du bateau s'explique ainsi :
si un bateau est visible du cercle c'est qu'une de ses extrémités est a l'interieur de son rayon.
Or une extrémité est à 0.5 [taille du bateau] du centre du dit bateau.
Donc si le bateau est visible du cercle, c'est que son centre est à moins d'un rayon + 0.5 taille du bateau
attention la liste que te donne cette règle (dist < r + 0.5 t) n'est pas la liste des visibles, mais elle exclut forcément tous les bateaux trop loin, quelque soit leur "angle". C'est simplement une restriction sur laquelle tu peux faire des tests avec les cosinus sinus, etc..
Vu ton besoin il me semble préférable que les coordonnées de ton bateau soit le centre du bateu et non une extrémité. Ainsi tu auras directement le "cercle" de vision (ie coordonnées + rayon) alors que là c'est plus compliqué (ie {coordonnées + moitié de la taille du bateau * la direction} + rayon)
de plus je pars de l'hypothèse que tes bateaux sont des "fils" (pas d'épaisseur, juste un "trait") Dans ce cas tu dois juste tester les deux extrémités de chaque bateau. Si une des extrémités est dans le cercle alors le bateau est visible
enfin pour restreindre les calculs avec une requête filtrée, tu ne dois tester, par rapport à ton bateau "cercle" que les bateaux qui respectent une règle de type :
distance entre le centre du bateau "cercle" et le centre du bateau "visible" < rayon de vision du bateau cercle + 0.5* taille du bateau "visible"
explication :
les centres = facile à trouver si tu prends "mes" coordonnées (un peu différente des tiennes, mais facile à updater) puisque ce sont elles même
la distance des centres = (x cercle - x bateau)^2 + (y cercle - y bateau)^2
le rayon + 0.5 * taille du bateau s'explique ainsi :
si un bateau est visible du cercle c'est qu'une de ses extrémités est a l'interieur de son rayon.
Or une extrémité est à 0.5 [taille du bateau] du centre du dit bateau.
Donc si le bateau est visible du cercle, c'est que son centre est à moins d'un rayon + 0.5 taille du bateau
attention la liste que te donne cette règle (dist < r + 0.5 t) n'est pas la liste des visibles, mais elle exclut forcément tous les bateaux trop loin, quelque soit leur "angle". C'est simplement une restriction sur laquelle tu peux faire des tests avec les cosinus sinus, etc..