Bonjour,
Je m'intéresse au problème suivant:
Soit des zones définies par deux coordonnées: une minimum (borne incluse) et une maximum (borne exclue) comme illustré. La figure ci-dessous illustre le cas pour la zone B.
Les zones font parti d'un espace fini. J'essai d'élaborer un algorithme qui permet de savoir si deux zones se touchent sur une dimension donnée: par exemple B touche A et D mais pas C. Mon but est de réaliser un algorithme qui puisse être appliqué pour un espace à N dimensions. C'est-à-dire que j'ai toujours deux coordonnées qui permettent de délimiter les zones et chacune des coordonnées aura N composantes, une pour chaque dimension.
Ainsi par exemple pour un espace à 3 dimensions, une zone sera représentée par un cube et le problème consiste à savoir si pour une dimensions donnée (donc sur un plan) deux cubes sont voisins. Pour cela j'ai réalisé l'algorithme suivant (dans mon cas, les dimensions sont numérotées à partir de 0: 0 pour x, 1 pour y, etc.). Après quelques essais dans un espace à deux dimensions, l'algorithme semble fonctionner.
Mon problème est que je n'ai aucune idée si mon algorithme fonctionne à N dimensions et au dessus de 2 dimensions il est vraiment pas évident de faire des essais. Quelqu'un voit il une erreur dans mon algorithme et/ou connaitrait il un algorithme qui répond au problème sur N dimensions?
Voici mon algorithme écrit en Java, j'ai mis ici uniquement la méthode essentielle de la classe Zone:
Je suis ouvert à toutes idées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public boolean isAbutsWith(Zone zone, int dimension) { boolean dimResult = false; boolean borderResult = false; for (int dim = 0; dim < NB_DIMENSIONS; dim++) { if (dim == dimension) { dimResult = !this.getCoordinateMin(dim).equals(zone.getCoordinateMax(dim)) && !this.getCoordinateMax(dim).equals(zone.getCoordinateMin(dim)); } else { borderResult |= CoordinateValue.isBetween( this.getCoordinateMin(dim), zone.getCoordinateMin(dim), zone.getCoordinateMax(dim)) || CoordinateValue.isBetween( this.getCoordinateMax(dim), zone.getCoordinateMin(dim), zone.getCoordinateMax(dim))) || CoordinateValue.isBetween( zone.getCoordinateMin(dim), this.getCoordinateMin(dim), this.getCoordinateMax(dim)) || CoordinateValue.isBetween( zone.getCoordinateMax(dim), this.getCoordinateMin(dim), this.getCoordinateMax(dim)); } } return dimResult && borderResult; }
Merci.
Partager