chemin.ml 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. type point = {x:float;y:float}
  2. let p1 = {x=0.;y=0.}
  3. let p2 = {x=1.; y=1.}
  4. let distance m1 m2 =
  5. let x1 = m1.x and y1 = m1.y and x2 = m2.x and y2 = m2.y in
  6. let result = (x2 -. x1)**2. +. (y2 -. y1)**2. in
  7. result
  8. ;;
  9. let nuage = [|1.0,2.1; 6.4,7.9|] in
  10. nuage.(1);;
  11. let sample_array = [| {x=57.; y=39.}; {x=83.; y=5.}; {x=8.9; y=5.9}; {x=3.6; y=61.}; {x=79.; y=3.};
  12. {x=9.2; y=2.3}; {x=27.; y=26.}; {x=7.; y=54.}; {x=8.; y=73.}; {x=21.; y=98.} |]
  13. let distance_i nuage i = let min = ref 0. and aux = ref i in
  14. for j = !aux+1 to Array.length nuage -1 do
  15. let aux2 = distance nuage.(!aux) nuage.(j) in
  16. if aux2 < !min then min := aux2
  17. done;
  18. !min
  19. ;;
  20. let distance_mini nuage = distance_i nuage 0;;
  21. let distance_mini_1D nuage =
  22. let n = Array.length nuage in
  23. let min_dist = ref infinity in
  24. for i = 0 to n - 2 do
  25. let dist = nuage.(i+1).x -. nuage.(i).x in
  26. if dist < !min_dist then min_dist := dist
  27. done;
  28. !min_dist
  29. ;;
  30. (* merge two sorted arrays *)
  31. let fusion_array_h t l m u =
  32. let aux = Array.make (u-l+1) t.(0) and i = ref l
  33. and j = ref (m+1) and k = ref 0 in
  34. while (!i <= m) && (!j <= u) do
  35. if t.(!i).x < t.(!j).x || (t.(!i).x = t.(!j).x && t.(!i).y < t.(!j).y) then
  36. begin
  37. aux.(!k) <- t.(!i);
  38. i := !i + 1
  39. end
  40. else
  41. begin
  42. aux.(!k) <- t.(!j);
  43. j := !j + 1
  44. end;
  45. k := !k + 1
  46. done;
  47. while (!i <= m) do
  48. aux.(!k) <- t.(!i);
  49. i := !i + 1;
  50. k := !k + 1
  51. done;
  52. while (!j <= u) do
  53. aux.(!k) <- t.(!j);
  54. j := !j + 1;
  55. k := !k + 1
  56. done;
  57. for x=0 to (!k-1) do
  58. t.(l+x) <- aux.(x)
  59. done
  60. ;;
  61. let tri_fusion_array_h t =
  62. let rec tri_fusion_aux t l u =
  63. if (l < u) then
  64. begin
  65. let m = (l+u)/2 in
  66. tri_fusion_aux t l m;
  67. tri_fusion_aux t (m+1) u;
  68. fusion_array_h t l m u;
  69. end
  70. in tri_fusion_aux t 0 (Array.length t - 1);
  71. t
  72. ;;
  73. let fusion_v t l m u =
  74. let aux = Array.make (u-l+1) t.(0) and i = ref l and j = ref (m+1) and k = ref 0 in
  75. while !i <= m && !j <= u do
  76. if t.(!i).y <= t.(!j).y || (t.(!i).y = t.(!j).y && t.(!i).x <= t.(!j).x) then begin
  77. aux.(!k) <- t.(!i);
  78. i := !i + 1
  79. end else begin
  80. aux.(!k) <- t.(!j);
  81. j := !j + 1
  82. end;
  83. k := !k + 1
  84. done;
  85. while !i <= m do
  86. aux.(!k) <- t.(!i);
  87. i := !i + 1;
  88. k := !k + 1
  89. done;
  90. while !j <= u do
  91. aux.(!k) <- t.(!j);
  92. j := !j + 1;
  93. k := !k + 1
  94. done;
  95. for x = 0 to !k-1 do
  96. t.(l+x) <- aux.(x)
  97. done
  98. ;;
  99. let tri_fusion_v t =
  100. let rec tri_fusion_v_aux t l u =
  101. if l < u then begin
  102. let m = (l+u)/2 in
  103. tri_fusion_v_aux t l m;
  104. tri_fusion_v_aux t (m+1) u;
  105. fusion_v t l m u;
  106. end
  107. in tri_fusion_v_aux t 0 (Array.length t - 1);
  108. t
  109. ;;
  110. let separation nuage_h nuage_v =
  111. let n = Array.length nuage_h in
  112. let i = ref 0 in
  113. while !i < n && nuage_v.(!i).x <= nuage_h.(n/2).x do
  114. i := !i + 1
  115. done;
  116. let nuage_g = Array.sub nuage_h 0 (n/2) in
  117. let nuage_d = Array.sub nuage_h (n/2) (n - n/2) in
  118. let nuage_vg = Array.sub nuage_v 0 !i in
  119. let nuage_vd = Array.sub nuage_v !i (n - !i) in
  120. (nuage_g, nuage_d, nuage_vg, nuage_vd)
  121. ;;
  122. (* let (nuage_g, nuage_d, _, _) = t in nuage_g;; *)
  123. let bande_du_plan nuage_h nuage_v delta =
  124. let n = Array.length (nuage_h) in
  125. let xmed = nuage_h.(n/2).x and l = ref [] and cpt = ref 0 in
  126. for i = n-1 downto 0 do
  127. let x = nuage_v.(i).x in
  128. if x <= xmed +. delta && x>= xmed -. delta then
  129. begin
  130. cpt := !cpt + 1;
  131. l := nuage_v.(i)::(!l);
  132. end;
  133. done;
  134. let b = Array.make (!cpt) nuage_h.(0) in
  135. for k = 0 to !cpt - 1 do
  136. b.(k)<- List.hd(!l);
  137. l:= List.tl(!l)
  138. done;
  139. b
  140. ;;
  141. let minimum_bande b delta =
  142. let n = Array.length(b) and min = ref delta in
  143. for i = 0 to n-2 do
  144. let k = ref (i+1) and y = b.(i).y in
  145. while !k<n && b.(!k).y < y +. !min do
  146. let d = distance b.(!k) b.(i) in
  147. if d<(!min) then
  148. min:= d;
  149. k:=!k+1
  150. done;
  151. done;
  152. !min
  153. ;;