Étant donné les coordonnées de plusieurs points sur un plan et le rayon d'un cercle entourant chaque point, dessinez des polygones représentant les cercles et les bords où les cercles se rencontrent. Les bords droits tomberont toujours le long des lignes d' intersection cercle-cercle , mais pourraient ne pas suivre toute la longueur de ces lignes.
Selon la suggestion de mbomb007 , imaginez le comportement des bulles de savon 2D. C'est techniquement faux, car les bulles de savon se rencontreraient toujours à 120 ° pour minimiser l'énergie, alors que ces cercles peuvent se rencontrer à n'importe quel angle.
Il s'agit d'un diagramme de Voronoi, moins un plan d'aire défini. Merci Andreas . Il s'agit en fait d'une généralisation d'un diagramme de Voronoi appelé diagramme de puissance .
Exemples
Par exemple, étant donné deux points et deux rayons, la sortie pourrait ressembler à ceci:
Ajoutez un autre point et rayon et la sortie pourrait ressembler à ceci:
Contribution
Vous pouvez structurer l'entrée comme vous le souhaitez. Veuillez publier les résultats avec les entrées suivantes.
Test 1
- x: 10, y: 10, r: 10
- x: 25, y: 12, r: 8
Test 2
- x: 8, y: 10, r: 6
- x: 20, y: 8, r: 4
- x: 18, y: 20, r: 12
Production
La sortie doit être graphique et doit inclure des bordures de polygone, mais rien d'autre n'est requis. Les points et les intersections n'ont pas besoin d'être représentés comme ils le sont dans les exemples.
Contraintes
- Aucun point n'existera dans le rayon d'un autre cercle.
- Règles de codegolf standard.
- Aucune réponse avec des failles ne sera acceptée, mais n'hésitez pas à vous amuser avec.
la source
Réponses:
Python 2,
473355 octetsCela lit un ensemble de cercles sous forme de
(x,y,r)
tuples sur stdin et génère une image au format PGM sur stdout. Il fonctionne grosso modo en calculant une fonction de distance du diagramme à chaque pixel et en ombrant chaque pixel à moins d'un pixel de distance proportionnellement à sa distance.Ici, la fonction de distance a été divisée par 32 pour la rendre visible:
la source
exec"%s=m%s(%s for u,v,r in L);"*4%('a','in','u-r','b','ax','v-r','c','in','u+r','d','ax','v+r')
C # ~ 2746
Ceci est une solution en C #. Probablement loin d'être optimal, mais C # ne gagnera pas de toute façon. Je voulais juste me prouver que je peux le faire.
Entrée via la ligne de commande en spécifiant les valeurs séparées par un espace dans l'ordre xyr La sortie est un fichier 'l.bmp' dans le répertoire d'exécution.
Le programme accepte toute quantité de cercles.
Test 1:10 10 10 25 12 8
Test 2: 8 10 6 20 8 4 18 20 12
Toutes les mathématiques impliquées ici sont basées sur cela . Les coordonnées des lignes étaient faciles à obtenir en utilisant les formulaires du lien. Cependant, ils devaient être tournés par l'angle entre les deux centres de cricles impliqués.
Pour réduire la longueur des lignes, j'ai calculé leurs intersections. Ensuite, pour cette intersection, j'ai vérifié si la fin des lignes actuelles atteint un cercle qui n'est pas le "parent de la ligne" et contient également l'intersection elle-même. Si tel était le cas, cette extrémité de la ligne était réduite à l'emplacement de l'intersection.
Les cercles étaient simples à dessiner, les parties "inutiles" étaient difficiles à retirer, donc j'ai trouvé une solution "en caoutchouc", qui supprime les trucs qui ne sont plus nécessaires en les repeignant en blanc. Une sorte de brute qui le force. Cela se fait en marchant le long de chaque bord des cercles et en vérifiant si ce pixel est à portée d'un autre cercle.
Au départ, je voulais rouler ma propre méthode de dessin de cercle qui ne dessine que le cercle avec les angles spécifiés, mais cela ne s'est pas bien passé et a pris encore plus de lignes de code.
Vraiment avoir du mal à expliquer cela si vous ne l'avez pas remarqué ... L'anglais n'est pas ma langue maternelle donc je suis désolé pour ça.
Golfé
Exemples plus complexes (le cercle supérieur obtient des valeurs y négatives)
la source