L'intersection relève du même principe, en un peu plus
compliqué, puisqu'ici deux images sont à considérer, notons
les A et B. Pour chaque couple de variables X et Y de A et B
rencontré, on crée une variable . On a en effet :
Les deux dernières relations permettent de simplifier le calcul par
rapport au cas général d'une opération binaire sur deux
image où il faudrait impérativement rencontrer deux couleurs
pour donner le résultat, en s'appuyant sur la table de
vérité de la relation. C'est pourquoi la procédure n'a pas
été généralisée, contrairement a ce qui a par la
suite été fait pour les images en couleurs.
Et le programme termine forcément puisque le nombre de variables
créées est majoré par nm+n+m où n est le nombre de
variables de A et m celui de B (mn pour les , n pour
et m pour les
).
let intersection i j =
let deja_vues = ref [] in
let rec inter_aux = function
Fantome -> failwith("Calcul d'intersection sur une image
fantome")
| Color Blanc -> (function _ -> ref (Color Blanc))
| Color Noir -> (function i -> ref i)
| i -> function
Fantome -> failwith("Calcul d'intersection sur une image
fantome")
| Color Blanc -> ref (Color Blanc)
| Color Noir -> ref i
| j -> try cpl_assq (i, j) !deja_vues
with Not_found -> let h = ref Fantome
in deja_vues := ((i, j), h)::(!deja_vues);
h := Node(map2 inter_aux (fils i) (fils j));
h
in !(inter_aux i j);;
Et on l'a vu il s'agit d'un algorithme en .