Друг наткнулся на функцию квадратичной кривой Безье в своей кодовой базе, которая использовала гигантское крысиное гнездо таблицы переключения для выполнения вычислений. Он предложил мне найти одно короткое выражение, которое позволило бы ему заменить гигантский блок кода.
Пытаясь удовлетворить два разных любопытства, я решил попробовать реализовать эту функцию в OCaml. Я очень начинающий программист OCaml, и я также не знаком с этой функцией, и эту конкретную реализацию трудно найти через Google.
Критика как производительности/правильности функции, так и ее реализации очень ценится.
Реализация Квадратичная кривая Безье:
let rec b2 n =
let p1 = -10. in
let p2 = 10. in
let q = n*.n in
let rec b2i n i hd =
if i > n then
List.rev hd
else
let t = i /. n in
b2i n (i+.1.) ((((1.-.t)**2.)*.p1+.(2.*.t*.(1.-.t)*.q)+.(t**2.)*.p2) :: hd)
in b2i n 0. []
;;
let floatprint lst = List.iter (fun f -> Printf.printf "%f; " f) lst ;;
floatprint (b2 8.);;