Les Snippets

Connexion

calculer l'aire occupee par n rectangles sur un plan

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 04/12/2008 15:32:03 et initié par coucou747 [Liste]
Vue : 1530
Catégorie(s) : Algorithme
Langages dispo pour ce code :
- Caml, CamlLight, ObjectiveCaml



Langage : Caml , ObjectiveCaml , CamlLight
Date ajout : 04/12/2008
Posté par coucou747 [Liste]
(*But de l'algo :
on passe une liste de "lignes en une dimention"
exemple : [(4, 7); (0, 2); (1, 5)]
et on veut "simplifier" ces lignes.*)
let car (a, b) = a ;;
let cdr (a, b) = b ;;
let cmp_int a b = if a = b then 0 else if a > b then 1 else -1;;
type line = int * int ;;
let order_abscisses (a,b) (c,d) = a - c ;;
let solve li =
let rec each a1 b1 acc = function
| [] -> (a1, b1)::acc
| (a2, b2)::tl -> if a2 < b1
  then each a1 b2 acc tl
  else each a2 b2 ((a1, b1)::acc) tl
in let sorted = List.sort order_abscisses li
in each (car (List.hd sorted) ) (cdr (List.hd sorted) ) [] sorted ;;
solve [(4, 7); (0, 2); (1, 5); (-2, -1); (8, 9); (-6, -2)] ;;
let somme li = List.fold_left (fun a b -> a + b) 0 li ;;
let distance li = somme (List.map (fun (a, b) -> b - a) (solve li) );;
distance [(4, 7); (0, 2); (1, 5); (-2, -1); (8, 9); (-6, -2)] ;;
(*la meme mais avec des rectangles, cette fois-ci, notre but est juste de calculer l'aire*)
type rectangle = line * line ;;
let rect_a1 rect1 = car ( car rect1 );;
let rect_a2 rect1 = car ( cdr rect1 );;
let rect_o1 rect1 = cdr ( car rect1 );;
let rect_o2 rect1 = cdr ( cdr rect1 );;
let order_rect f rect1 rect2 = (f rect1) - (f rect2) ;;
let rectangles_in a b r = (rect_a1 r) <= a && (rect_a2 r) >= b;;
let solve_rect li =
let rectangles_tries = List.sort (order_rect rect_a1) li
in let subdivision = List.merge cmp_int
  (List.map rect_a1 rectangles_tries)
  (List.sort cmp_int (List.map rect_a2 rectangles_tries))
in let distance_subdivision a b =
  (* ici on peut optimiser, comme les rectangles sont tries*)
  let rectangles_subdivision = List.filter (rectangles_in a b) rectangles_tries
  in distance (List.map (fun r -> ((rect_o1 r), (rect_o2 r)) ) rectangles_subdivision)
in let rec parcourt_subdivision aire = function
| hd::[] -> aire
| a::b::tl -> parcourt_subdivision ( (b - a) * (distance_subdivision a b) + aire) (b::tl)
in parcourt_subdivision 0 subdivision;;

solve_rect [ ((1, 1), (3, 3)) ; ((0,0), (2,2)) ] ;;
Remarque :
cet algo est en O( n^2 * log(n) )

le principe est simple : on divise en 2n problemes de dimention 1 (qui sont en O(n * log n) )

Snippets en rapport avec : Calcul, Geometrie, Aire, Plan, Rectangles



Codes sources en rapport avec : Calcul, Geometrie, Aire, Plan, Rectangles

{Python} CALCUL DE RÉSISTANCES
Permet de trouver la valeur d'une résistance à partir du code couleur et vice versa: -Le code coule...

{C / C++ / C++.NET} LA CONSTANTE MRB EN VISUAL C++
La constante MRB est un nombre irrationnel ayant été défini entre 1994 et 1999. Il y a une document...

{Python} LE COMPTE EST BON
Petit logiciel permettant de donner la solution du jeu "Le compte est bon". Il se compose d'une pet...

{PHP} FONCTION EQUATION LÉGÈRE
Fonction equation en 50 lignes de code. Prend une équation (string $equation) en paramètre (ex.: 5+5...

{C# / C#.NET} APPLICATION TRACEUR DE COURBE
Bonjour ! Voici une petite application toute simple permettant de tracer des courbes. Pour les...

{Javascript / DHTML} UNE CALCULATRICE
Une caculatrice: Il en existe plus d'une dizaine sur ce site, celle-ci n'est donc qu'une variante. s...

{Visual Basic, VB6, VB.NET, VB 2005} CALCUL DES HONORAIRES CAC
Ce programme permet de calculer les honoraires CAC d'une mission de commissariat aux comptes dans mo...

{C / C++ / C++.NET} PARSEUR GÉNÉRAL
C'est un parseur général et simple qui permet de calculer une expression quelconque avec les opérate...

{Delphi} CALCULATRICE POUR POËTES
Cette calculatrice s'appelle Eunice (Encore Une Nième Insipide Calculatrice pour Enfants !). E...

{C / C++ / C++.NET} [C++] HASH FINDER - CALCULATEUR DE HASH
Me revoilà comme prévu avec cette version C++ avec une interface graphique compatible Windows et Lin...