Advertisement
PearlyXD

Origami

Dec 15th, 2020 (edited)
2,796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.28 KB | None | 0 0
  1. (*wersja 2, 16.12.2020*)
  2. (*autor: Wiktor Chmielewski grupa 5*)
  3. type point = float * float;;
  4. type kartka = point -> int;;
  5. let eps = Float.epsilon *. 1000000.;;
  6.  
  7. let square x = x *. x;;
  8. (*dlugosc wektora (x,y)*)
  9. let dlugosc ((x,y) : point) = sqrt(square x +. square y);;
  10. (*wektor v1 + v2*)
  11. let dodaj ((x1, y1) : point) ((x2, y2) : point) : point = (x1 +. x2, y1 +. y2);;
  12. (*wektor przeciwny do wektora v*)
  13. let przeciwny ((x, y) : point) : point = (-. x, -. y);;
  14. (*wektor v1 - v2*)
  15. let odejmij v1 v2 : point = dodaj v1 (przeciwny v2);;
  16. (*wektor v pomnozony przez skalar k*)
  17. let skalar ((x, y) : point) k : point = (x *. k, y *. k);;
  18. let odwrotnosc k =
  19.   if k = 0. then failwith "dzielenie przez 0"
  20.   else 1. /. k
  21. ;;
  22. (*wektor v pomnozony przez skalar 1/k*)
  23. let skalardzielenie ((x, y) : point) k : point = skalar (x, y) (odwrotnosc k);;
  24.  
  25. let prostokat ((x1, y1) : point) ((x2, y2) : point) : kartka = fun ((x,y) : point) ->
  26.   if x1 <= x +. eps && x <= x2 +. eps && y1 <= y +. eps && y <= y2 +. eps then 1 else 0
  27. ;;
  28.  
  29. let kolko (o : point) r : kartka = fun (v : point) ->
  30.   if (dlugosc (odejmij o v)) <= r +. eps then 1 else 0
  31. ;;
  32.  
  33. (*iloczyn wektorowy wektorow v1 - v, v2 - v*)
  34. (*v = (x,y) x1 = (x1, y1) v2 = (x2, y2)*)
  35. let iwek ((x, y) : point) ((x1, y1) : point) ((x2, y2) : point) = (x1 -. x) *. (y2 -. y) -. (x2 -. x) *. (y1 -. y);;
  36.  
  37. (*iloczyn wektorowy wektorow v1 i v2*)
  38. (*v1 = (x1, y1) v2 = (x2, y2)*)
  39. let iska ((x1, y1) : point) ((x2, y2) : point) = (x1 *. x2) +. (y1 *. y2);;
  40.  
  41. (*zwraca v' : punkt symetryczny do v wzgl prostej v1 v2*)
  42. let sym v v1 v2 =
  43.   (*pomocniczy wektor jednostkowy v1 v2*)
  44.   let jednostkowy = skalardzielenie (odejmij v2 v1) (dlugosc (odejmij v2 v1)) in
  45.   (*iloczyn skalarny wektorow v1 p oraz jednostkowego*)
  46.   let is = iska (odejmij v v1) jednostkowy in
  47.   odejmij (skalar (dodaj v1 (skalar jednostkowy is)) 2.) v
  48. ;;
  49.  
  50. let zloz (v1 : point) (v2 : point) (k : kartka) : kartka = fun (v : point) ->
  51.   (*iloczyn wektorowy v2 - v1 oraz v - v1*)
  52.   (*sprawdza po której stronie prostej v1 v2 jest v*)
  53.   let iw = iwek v1 v2 v in
  54.   if Float.abs iw <= eps then k v
  55.   else if iw > 0. then ((k v) + (k (sym v v1 v2)))
  56.   else 0
  57. ;;
  58.  
  59. let skladaj (lst : (point * point) list) (k : kartka) : kartka = List.fold_left (fun acc (v1, v2) -> zloz v1 v2 acc) k lst;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement