Ci-dessous est un exemple d'image, si j'ai un point du point blanc au milieu et que je souhaite trouver l'emplacement possible le plus proche possible du cercle bleu (qui est évidemment à l'emplacement où je l'ai placé) si tous les cercles rouges existent déjà . Comment puis-je trouver cet emplacement?
La performance pour moi n'est pas une préoccupation majeure pour cette application.
Ce n'est pas une solution générale, car il y a plusieurs situations, il ne fournira pas la position du cercle bleu avec une distance la plus courte du point blanc. Par exemple, si vous avez 100 boules rouges regroupées et que le point blanc est loin de ce groupe de balles rouges, aucune des balles rouges n'aura aucune influence dans la position du cercle bleu qui ne peut être centré sur le point blanc . Il ne montrera pas non plus tous les détails des calculs. Quoi qu'il en soit, pour un sous-ensemble de configurations, où la solution (cercle bleu) est tangente à deux cercles rouges, ce qui suit devrait fonctionner:
[.____] 1) Soit r être le rayon du cercle bleu
[.____] 2) Faites une boucle sur toute la paire de cercles rouges, oui je sais que c'est O (N2).
[.____] 3) Pour chaque paire de cercles I, J avec des centres à (Xi, Yi) et (XJ, YJ) avec un rayon respectif RI et RJ, calculez le carré de la distance entre la paire de cercles
d_ij^2=(xi-xj)^2+(yi-yj)^2
4) mettre toutes les paires de cercles qui
dij^2<R^2
dans une liste.
5) Traverser la liste, trouver les 2 solutions de cercles de rayon r tangent aux deux cercles i et j. Pour ce faire, utilisez ces équations avec cette image
a = R+ri
b = R+rj
c = dij
α = arccos((b^2+c^2-a^2)/(2bc)
avec des informations ci-dessus, vous pouvez trouver (x1ij, y1ij) et (x2ij, y2ij) les centres des 2 cercles tangents à cercles i et j. Pour chaque boucle de cercle bleu candidat sur tous les autres cercles rouges et voyez s'il ne se chevauchent pas. S'ils le déchargent, si ce n'est pas la distance au cercle blanc. Si vous conservez celui avec une plus petite distance, je pense que vous aurez la solution lorsque vous avez fini de traverser la liste des paires de cercles. L'algorithme semble être comme O (N3).
Le placement le plus proche au point sera soit sur le point, soit toucher un cercle.
par conséquent, vérifiez d'abord le point, puis lancez le nouveau cercle autour du bord de chaque cercle existant, calculant la distance du point et si vous vous chevauchez au fur et à mesure que vous allez suivre le point de distance minimum. Arrêtez-vous quand vous avez traversé chaque cercle.
c'est à dire. Vérifiez tous les points sur les lignes vertes, plus le cercle blanc. où la ligne verte est un cercle avec un rayon du rouge plus le bleu
vous devez vérifier l'ensemble de la ligne verte, pas seulement des intersections afin que vous couvriez ces cas de bord.
De toute évidence, la taille de l'étape de votre traversé sera importante en termes de performance. Mais comme vous l'indiquez la performance n'est pas un problème, choisissez la valeur correspondant à la résolution de votre valeur de sortie. c'est-à-dire flotteur, long?
clarification:
ma suggestion est de brute Force tous les points autour de chaque Test de cercle pour le chevauchement avec tous les autres cercles à chaque point. Pas d'intelligence.
Si l'exemple de photo indique le nombre de cercles et de résolution, cela ne devrait pas être un problème pour un PC standard.
nous avons 20 cercles de rayon moyen 200 de sorte que représente environ 20 * 2 π * 200 points * 20 tests d'intersection = 4800000 itérations
Noter:
Des approches itératives comme celle-ci sont imparfaites dans la mesure de votre étape, dans ce cas, la résolution de votre production peut considérablement affecter le résultat.
Dis que j'ai deux cercles rouges de 2 pixels à distance et un cercle bleu rayon de 1 pixel pour presser entre eux. Clairement avec l'un des deux pixels comme centre du cercle bleu qui chevauchera l'un des rouges. Mais évidemment, il y a de la place pour le cercle si le centre se situe entre les deux pixels.
D'où mon commentaire pose des questions sur la résolution de la sortie. que vous avez dit pourrait être n'importe quoi.
vous pouvez également résoudre l'équation simultanée pour chaque paire de cercles avec une augmentation du rayon du rayon du cercle bleu.
cela vous donnera les points où le cercle bleu touchera les deux cercles rouges plus précisément que itération.
Pourtant. Il existe plusieurs conditions où si vous ne faites que cela, vous obtenez la mauvaise ou ne pas répondre. c'est à dire.
1 ou pas de cercles
2 cercles ou plus mais avec un point cible éloigné et en dehors d'eux.
beaucoup de cercles mais avec un point cible proche de la surface
Maintenant, vous avez un ensemble de points qui sont solutions possibles, itérez-les et vérifiez chacun.
NB: Je ne dis pas que la mise en œuvre de l'algorithme devrait être exactement décrite. Vous pouvez essayer d'améliorer les performances en utilisant une programmation dynamique ou de sauter des solutions possibles dans lesquelles il est évident qu'ils ne fonctionneront pas.