web-dev-qa-db-fra.com

Trouver le meilleur meilleur au cercle

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.

enter image description here

12
Botanic

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 two blue circle canditates for a pair of red circles

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).

4
Mandrill

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

possible center points

vous devez vérifier l'ensemble de la ligne verte, pas seulement des intersections afin que vous couvriez ces cas de bord.

single circle cases

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

2
Ewan

solutions possibles Recherche

  1. Vérifiez si le point blanc est la solution en soi. Il couvre le boîtier avec 0 cercles rouges et un boîtier trivial lorsque les cercles rouges sont loin du point blanc.
  2. Un cercle rouge.
    1. Le point blanc est le centre du cercle. Solutions possibles Sont un nombre infini de points sur le cercle avec son centre dans le point blanc et le rayon étant la somme du rayon de cercles bleus et du diamètre du cercle rouge. Appelons-le -le cercle vert.
    2. Le point blanc est ailleurs. Il n'y a qu'une seule solution possible sur la ligne qui relie le point blanc et le centre du cercle rouge, il s'agit du rayon du cercle bleu, loin du point où le cercle rouge traverse la ligne vers le point blanc.
  3. Deux cercles rouges ou plus.
    1. Prenons des cercles rouges un par un et cherchons solution possible pour chacun d'eux individuellement selon le point 2 (un cercle).
    2. Pour chaque paire de cercles rouges Vérifiez si vous pouvez dessiner le cercle bleu touchant les deux rouges. C'est à dire. Si la distance entre leurs centres est égale ou inférieure à la somme de leurs radios plus diamètre du cercle bleu. Si vous pouvez, vous en avez deux (ou un si les cercles rouges sont exactement un diamètre de cercle bleu) solutions possibles.

Recherche de solution réelle entre solutions possibles

Maintenant, vous avez un ensemble de points qui sont solutions possibles, itérez-les et vérifiez chacun.

  1. Si le point est en fait une solution. Aucun cercle rouge ne devrait avoir son centre plus proche que son rayon à ce point.
  2. Si elle est plus proche du point blanc que de la solution trouvée auparavant.
  3. Si vous avez le cercle vert (point 2.1) [.____]
    • Si parmi des points individuels, il n'y a pas de solution qui appartient au cercle vert, le cercle vert est la réponse.
    • Si vous avez des solutions individuelles sur le cercle vert et que vous n'avez besoin que d'une solution, en prenez simplement une de celles-ci.
    • Si vous avez des solutions individuelles sur le cercle vert et que vous avez besoin de tout le nombre illimité de solutions, vous devez résoudre un autre problème. Vous devez couper du cercle vert tous les arcs définis par une paire de solutions individuelles de chaque cercle rouge.

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.

0
Vlad