Один знакомый наткнулся на квадратичную функцию кривой Безье в своей кодовой базе, которая использовала гигантское гнездо крыс таблицы переключателей для выполнения вычислений. Он предложил мне найти одно короткое выражение, которое позволило бы ему заменить гигантский блок кода.
Пытаясь удовлетворить два разных любопытства, я решил попробовать реализовать эту функцию в 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.);;