J'ai un système où vous pouvez cliquer une fois pour placer un nœud dans une scène. Lorsque vous placez 3 nœuds, il forme un triangle. Lorsque vous placez des nœuds futurs, il crée un nouveau triangle en joignant ce nœud aux 2 nœuds existants les plus proches.
Cela fonctionne très bien la plupart du temps mais est défectueux lorsqu'il est utilisé près de triangles avec des angles très aigus, car l'un des 2 nœuds les plus proches n'est souvent pas celui qui devrait être utilisé.
Par exemple, voir l'image ci-dessous. Le triangle magenta est le premier placé. Si je clique ensuite à la position marquée X, ce que j'obtiens est un nouveau triangle où se trouve la superposition bleue. Ce que je veux, c'est un nouveau triangle où se trouve la superposition verte. (c'est-à-dire symétriques au magenta, dans cet exemple. Clarification: les triangles vert et magenta ne se chevauchent pas - le vert s'étend sous le bleu jusqu'au nœud le plus à gauche)
Comment puis-je déterminer les 2 sommets existants à utiliser lors de la création de nouveaux triangles afin que les triangles ne soient pas superposés comme ceci?
EDIT : La recherche du bord le plus proche donne de meilleurs résultats, mais pas parfaits. Considérez cette situation:
Le test du «bord le plus proche» est ambigu et peut renvoyer AB ou AC (car le point le plus proche de X pour les deux est en A). Le résultat souhaité serait AC, pour former le triangle ACX sans chevauchement d'arêtes. Comment pourrais-je garantir ce résultat? (Je préfère ne pas avoir à effectuer des tests de chevauchement de bords individuels comme briseur d'égalité si possible car je crains que le test de bord le plus proche ne repère pas nécessairement les 2 sont exactement équidistants, étant donné les problèmes de précision en virgule flottante.)
Réponses:
Plutôt que de trouver la distance minimale aux nœuds, recherchez la distance minimale au bord (c'est-à-dire le segment de ligne défini par les nœuds).
Ensuite, si le point le plus proche est un sommet (que vous devrez utiliser un test epsilon ** à virgule flottante), comparez l'angle entre la ligne du nouveau point au sommet et chacune des arêtes connectées à ce sommet. Choisissez celui avec l'angle absolu minimum:
** Pour éviter d'ajouter des triangles dégénérés, ce qui pourrait perturber le test epsilon, vous souhaiterez peut-être placer une région autour de chaque sommet où l'ajout de points est interdit (quelque chose comme interdire les points dans un multiple de l'epsilon utilisé ci-dessus).
la source
Une fois le premier triangle placé, lorsque vous placez un nouveau sommet, vous générerez toujours deux nouvelles arêtes. Le troisième bord du nouveau triangle sera toujours un bord partagé avec un triangle précédent. Si vous pouviez trouver un moyen de déterminer le bord partagé, vous sauriez à quels sommets se connecter, mais c'est la partie difficile. Je pense que vous pouvez le faire en traçant une ligne de votre nouveau sommet au centre de chacune des trois dernières arêtes générées (ou probablement les 3 arêtes les plus proches).
Si la ligne allant de votre sommet au centre du bord ne pas traverser l'une des deux autres bords, vous avez votre avantage partagé. L'arête partagée vous indiquera les deux sommets auxquels connecter votre nouveau sommet.
Jimmy a soulevé le cas d'un point ambigu quant à la destination du nouveau triangle:
Cela vous donnerait la possibilité de choisir entre deux triangles valides. Peut-être que le bris d'égalité est le point central le plus proche.
Compte tenu de votre mise à jour, bien que plus complexe, ma solution ne donnera lieu à une égalité que si vous avez deux triangles valides. En utilisant cette méthode, votre deuxième exemple d'image produirait le résultat souhaité.
la source
Ayant votre triangle magenta ABC, vous incorporez ensuite un nouveau sommet X. Je pense qu'il est évident qu'il y aura deux lignes commençant à D qui ne se coupent entre aucun des bords du triangle ABC.
Ces deux lignes peuvent être AX & BX, BX & CX ou AX & CX. Vous pouvez alors traiter votre problème comme le problème classique de "deux lignes se croisent"? Vous pouvez ensuite vérifier laquelle de ces paires de lignes ne coupe aucune des arêtes du triangle ABC en suivant, par exemple, l' une des méthodes de cette question . Par conséquent, vous aurez les deux nouveaux bords du nouveau triangle.
la source
Déterminer si vous vous trouvez dans l'une des régions sans ambiguïté (1, 2, 3 ci-dessous) est assez simple: traitez chaque bord de votre triangle comme un plan 2D et testez de quel côté du plan se trouve votre nouveau point. Si vous êtes à l'intérieur de deux d'entre eux mais à l'extérieur de celui-ci, alors celui-ci correspond au bord du triangle qui contribue deux sommets à votre nouveau triangle.
Si vous êtes à l'intérieur d'un et à l'extérieur de deux, vous êtes dans le cas ambigu où la partie la plus proche du triangle de votre nouveau point est un coin. Dans ce cas, vous pouvez former un plan 2D à partir du milieu du bord opposé (celui à l'intérieur duquel vous êtes) et du sommet le plus proche (celui partagé par les deux plans dont vous êtes à l'extérieur). Vous pouvez choisir une arête en fonction du côté de cet avion sur lequel se trouve votre nouveau point.
Notez qu'un test d'avion en 2D fonctionne de la même manière qu'en 3D: parsemez un vecteur de n'importe où sur l'avion jusqu'à votre point avec la normale de l'avion (en 2D, c'est la perpendiculaire de la ligne).
(Soit dit en passant, les régions délimitées par le magenta dans cette image sont appelées régions de Voronoï; ce sont les zones d'espace contenant des points qui sont les plus proches d'une entité particulière - bord ou sommet - du triangle. Edit: Ma terminologie ici n'est pas réellement tout à fait correct, ce ne sont pas exactement les régions de Voronoi.)
la source