Lorsque vous utilisez les formules habituelles pour calculer l'intersection entre deux segments 2D, soit here, si vous arrondissez le résultat à un entier, vous obtenez des résultats non symétriques. C'est-à-dire, parfois, en raison d'erreurs d'arrondi, je reçois intersection(A,B)!=intersection(B,A)
.calculer l'intersection entre deux segments de manière symétrique
La meilleure solution est de continuer à travailler avec des flotteurs, et de comparer les résultats jusqu'à une certaine précision. Cependant, je dois arrondir les résultats aux entiers après avoir calculé l'intersection, je ne peux pas continuer à travailler avec des flotteurs.
Ma meilleure solution jusqu'ici était d'utiliser un peu d'ordre sur les segments dans le plan, et j'ai intersection
pour toujours comparer le plus petit segment au plus grand segment.
Existe-t-il une meilleure méthode? Est-ce que je manque quelque chose?
Quel est le motif que vous pouvez » t utiliser, disons, symmetricIntersection (A, B) = (intersection (A, B) + intersection (B, A))/2? L'addition à virgule flottante est commutative. – brainjam
@brainjam, c'est vraiment sympa et mathématiquement solide, mais cela nécessite de calculer l'intersection deux fois, et de me fier à l'arrondi à virgule flottante, donc je ne suis pas sûr que ce soit mieux que de commander sur des segments. Quoi qu'il en soit, bravo! Aimé. –
@brainjam, une fois qu'une erreur se glisse, toute opération peut amplifier l'erreur. Donc, si déjà en comparant 'X' ==' Y' est sorti faux, 'X' ==' (X + Y)/2' sera probablement aussi faux. De plus, dans les cas où 'X' ==' Y' pourrait être vrai, 'X' ==' (X + Y)/2' peut être faux (par exemple quand 'X' et' Y' peuvent être représentés sans erreur, mais «X + Y» ne peut plus être représenté sans erreur.) – vladr