Bitmap/Bézier curves/Quadratic: Difference between revisions

From Rosetta Code
Content added Content deleted
(initial version with OCaml)
 
mNo edit summary
Line 1: Line 1:
{{task|Raster graphics operations}}
{{task|Raster graphics operations}}


Using the data storage type defined [[Basic_bitmap_storage|on this page]], draw a ''quadratic bezier curves''
Using the data storage type defined [[Basic_bitmap_storage|on this page]] for raster images, and the <code>draw_line</code> function defined in [[Bresenham's_line_algorithm|this one]], draw a ''quadratic bezier curves''
([http://en.wikipedia.org/wiki/Bezier_curves#Quadratic_B.C3.A9zier_curves definition on Wikipedia]).
([http://en.wikipedia.org/wiki/Bezier_curves#Quadratic_B.C3.A9zier_curves definition on Wikipedia]).



Revision as of 01:15, 6 December 2008

Task
Bitmap/Bézier curves/Quadratic
You are encouraged to solve this task according to the task description, using any language you may know.

Using the data storage type defined on this page for raster images, and the draw_line function defined in this one, draw a quadratic bezier curves (definition on Wikipedia).

OCaml

<ocaml>let quad_bezier ~img ~color

       ~p1:(_x1, _y1)
       ~p2:(_x2, _y2)
       ~p3:(_x3, _y3) =
 let (x1, y1, x2, y2, x3, y3) =
   (float _x1, float _y1, float _x2, float _y2, float _x3, float _y3)
 in
 let bz t =
   let a = (1.0 -. t) ** 2.0
   and b = 2.0 *. t *. (1.0 -. t)
   and c = t ** 2.0
   in
   let x = a *. x1 +. b *. x2 +. c *. x3
   and y = a *. y1 +. b *. y2 +. c *. y3
   in
   (int_of_float x, int_of_float y)
 in
 let rec loop _t acc =
   if _t > 20 then acc else
   begin
     let t = (float _t) /. 20.0 in
     let x, y = bz t in
     loop (succ _t) ((x,y)::acc)
   end
 in
 let pts = loop 0 [] in
 (*
 (* draw only points *)
 List.iter (fun (x, y) -> put_pixel img color x y) pts;
 *)
 (* draw segments *)
 let line = draw_line ~img ~color in
 let by_pair li f =
   let rec aux prev = function
     | [] -> ()
     | x::xs ->
         f prev x;
         aux x xs
   in
   aux (List.hd li) (List.tl li)
 in
 by_pair pts (fun p0 p1 -> line ~p0 ~p1);
</ocaml>