(* Programmieraufgabe P-36 (figur.ml) *) (* Leonhard Fellermayr *) (* Mat.Nr. 22128130XXXX *) (* Die Definitionen aus der Vorlesung *) type point = { x: float; y: float; } (* Beispiel-Punkte und -liste *) let p1 = {x=0.;y=0.};; let p2 = {x=5.;y=3.};; let p3 = {x=8.;y=5.};; let pl = [p1;p2;p3];; (* Erweiterte Variante *) type figur = Kreis of point * float | Rechteck of point * point | Dreieck of point * point * point | Strecke of point * point | Polygon of point list;; (* Hilfsfunktion fŸr Quadrierung *) let sqr x = x *. x;; (* Gibt letztes Element einer nicht-leeren Liste zurŸck *) let rec lastElem list = match list with h::[] -> h | h::t -> lastElem t ;; (* Hilfsfunktionen fŸr Polygon-Umfang: diese sind nštig, um den letzten Punkt der Liste ganz vorne ggf. noch einmal anzuhŠngen, damit die Fkt. umfang spŠter die Strecken zwischen allen Polygonpunkten berechnen kann. *) let rec calcPoly l = match l with e::f::g -> sqrt (sqr (e.x -. f.x) +. sqr (e.y -. f.y)) +. calcPoly (f::g) | _ -> 0.;; let helpPoly (h::t) = if h <> lastElem t then calcPoly ((lastElem t)::h::t) else calcPoly (h::t);; (* Die Funktion umfang *) let rec umfang = function Kreis (m, r) -> 2. *. r *. 4. *. atan 1. | Strecke (p1, p2) -> sqrt (sqr (p1.x -. p2.x) +. sqr (p1.y -. p2.y)) | Rechteck (p1, p2) -> 2. *. (abs_float (p2.x -. p1.x) +. abs_float (p2.y -. p1.y)) | Dreieck (p1, p2, p3) -> umfang (Strecke (p1, p2)) +. umfang (Strecke (p2, p3)) +. umfang (Strecke (p3, p1)) | Polygon l -> match l with h::i::t -> helpPoly l | _ -> 0.;; (* fŸr 0- und 1-elementige Listen *) (* EOF *)