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 : 5637
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

{C / C++ / C++.NET} CALCUL DE CLEF RIB
Bonjour, Cette petite source vous permettra de calculer une clé RIB En entrée, vous transmette...

{JAVA / J2EE} REPRÉSENTATION GRAPHIQUE DE FONCTIONS ET OBJETS GÉOMÉTRIQUES
Cette source permet de représenter graphiquement toutes les fonctions usuelles en définissant la fen...

{Visual Basic, VB6, VB.NET, VB 2005} CALCUL DE PLACEMENT OU DE PRET - MENSUALITES - MONTANT - DUREE - TAUX ANNUEL
Bonjour Tout d'abord, merci à Nix pour son code permettant de rendre la feuille toujours visibl...

{Visual Basic, VB6, VB.NET, VB 2005} NOMBRES PRIMORDIAUX
Les nombres primordiaux sont des nombres obtenus en multipliant entre eux les nombres premiers succe...

{JAVA / J2EE} STRING NUMBERS COMPUTATOR
Cette classe permet simplement d'appliquer une fonction (simple ou complexe : de int -> vers int) à ...

{PHP} FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N DE PARTICIPANT
Tout est dans le titre :) C'est simple mais assez utile ;) J'ai commencé par creer cette fonctio...

{Python} CALCUL D'AIRE D'UN TRIANGLE [INTERFACE GRAPHIQUE]
Inspiré du livre "Apprendre à Programmer avec Python" de Gérard Swinnen. Encore un programme en rap...

{JAVA / J2EE} PROGRAMME CALCULANT NOMBRE DE PIÈCES POUR SURFACE (M²)
Bonjour, ici je propose juste le téléchargement d'un programme JAVA servant à calculer le nombre de ...

{Visual Basic, VB6, VB.NET, VB 2005} SUDOKU SOLVEUR CRIBLE
Solveur de grille Sudoku 9x9 (transcription c++ developpez.com et Stempy). Quelqun peut il me dire s...

{Visual Basic, VB6, VB.NET, VB 2005} CALCUL DE RÉSISTANCE
Bonjour, Je vous présente un logiciel de ma conception qui est très simple. Il permet, via un ma...