(* VERY EXPERIMENTAL :) *) open Graphics let round x = let rest = x -. (floor x) in if rest < 0.5 then truncate x else (truncate x) + 1 let level_of_intensity = 4 let step_of_variation = 2 let intensity_of (r,g,b) i = let max_of_saturation = max (max r g) b in let f x = let diff = 255 - x in let inc = (i*diff)/level_of_intensity in x+inc in rgb (f r) (f g) (f b) let put_pixel (x,y) color i = set_color (intensity_of color i); plot x y let point (x,y) (r,g,b) = set_color (rgb r g b); fill_circle x y 4; for i=3 to 4 do set_color (intensity_of (r,g,b) i); draw_circle x y (1+i) done let point2 (x,y) (r,g,b) = set_color (rgb r g b); fill_circle x y 4 let test () = clear_graph (); point (100,100) (211,35,36); point2 (200,100) (211,35,36) let cercle (x,y) a (r,g,b) = set_color (rgb r g b); draw_circle x y a; set_color (intensity_of (r,g,b) 2); draw_circle x y (a-1); draw_circle x y (a+1); set_color (intensity_of (r,g,b) 3); draw_circle x y (a-2); draw_circle x y (a+2) let line (x1,y1) (x2,y2) col = let corr = 0.4 in let p1x = ref 0 and p2x = ref 0 in let p1y = ref 0 and p2y = ref 0 in begin (if x2 < x1 then (p1x:=x2;p2x:=x1;p1y:=y2;p2y:=y1) else (p1x:=x1;p2x:=x2;p1y:=y1;p2y:=y2)); let dx = !p2x - !p1x and dy = !p2y - !p1y in if ((dy >= 0) && (dy <= dx)) then begin let d = ref (2*dy-dx) in let incmajor = 2*dy in let incminor = 2*(dy-dx) in let two_v_dx = ref 0 in let invdenom = 1. /. (2. *. sqrt(float_of_int (dx*dx+dy*dy))) in let two_dx_invdenom = 2. *. (float_of_int dx) *. invdenom in put_pixel (!p1x,!p1y) col 0; put_pixel (!p1x,!p1y+1) col (round (two_dx_invdenom /. corr)); put_pixel (!p1x,!p1y-1) col (round (two_dx_invdenom /. corr)); while p1x < p2x do begin (if !d <= 0 then begin two_v_dx := !d + dx; d := !d + incmajor; p1x := !p1x + 1 end else begin two_v_dx := !d - dx; d := !d + incminor; p1x := !p1x + 1; p1y := !p1y + 1 end); put_pixel (!p1x,!p1y) col (abs (round ((float_of_int !two_v_dx)*.invdenom /. corr))); (* print_int (abs (round ((float_of_int !two_v_dx)*.invdenom /. corr)));*) put_pixel (!p1x,!p1y+1) col (abs (round ((two_dx_invdenom -. ((float_of_int !two_v_dx) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dx_invdenom -. ((float_of_int !two_v_dx) *. invdenom)) /. corr)));*) put_pixel (!p1x,!p1y-1) col (abs (round ((two_dx_invdenom +. ((float_of_int !two_v_dx) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dx_invdenom +. ((float_of_int !two_v_dx) *. invdenom)) /. corr)));*) end done end else if ((dy < 0) && (-dy <= dx)) then begin let d = ref (2*dy+dx) in let incmajor = 2*dy in let incminor = 2*(dy+dx) in let two_v_dx = ref 0 in let invdenom = 1. /. (2. *. sqrt(float_of_int (dx*dx+dy*dy))) in let two_dx_invdenom = 2. *. (float_of_int dx) *. invdenom in put_pixel (!p1x,!p1y) col 0; put_pixel (!p1x,!p1y+1) col (round (two_dx_invdenom /. corr)); put_pixel (!p1x,!p1y-1) col (round (two_dx_invdenom /. corr)); while p1x < p2x do begin (if !d <= 0 then begin two_v_dx := !d + dx; d := !d + incminor; p1x := !p1x + 1; p1y := !p1y - 1 end else begin two_v_dx := !d - dx; d := !d + incmajor; p1x := !p1x + 1 end); put_pixel (!p1x,!p1y) col (abs (round ((float_of_int !two_v_dx)*.invdenom /. corr))); (* print_int (abs (round ((float_of_int !two_v_dx)*.invdenom /. corr)));*) put_pixel (!p1x,!p1y+1) col (abs (round ((two_dx_invdenom -. ((float_of_int !two_v_dx) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dx_invdenom -. ((float_of_int !two_v_dx) *. invdenom)) /. corr)));*) put_pixel (!p1x,!p1y-1) col (abs (round ((two_dx_invdenom +. ((float_of_int !two_v_dx) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dx_invdenom +. ((float_of_int !two_v_dx) *. invdenom)) /. corr)));*) end done end else if ((dy > 0) && (dy > dx)) then begin let d = ref (2*dx-dy) in let incmajor = 2*dx in let incminor = 2*(dx-dy) in let two_v_dy = ref 0 in let invdenom = 1. /. (2. *. sqrt(float_of_int (dx*dx+dy*dy))) in let two_dy_invdenom = 2. *. (float_of_int dy) *. invdenom in put_pixel (!p1x,!p1y) col 0; put_pixel (!p1x+1,!p1y) col (round (two_dy_invdenom /. corr)); put_pixel (!p1x-1,!p1y) col (round (two_dy_invdenom /. corr)); while p1y < p2y do begin (if !d <= 0 then begin two_v_dy := !d + dy; d := !d + incmajor; p1y := !p1y + 1 end else begin two_v_dy := !d - dy; d := !d + incminor; p1x := !p1x + 1; p1y := !p1y + 1 end); put_pixel (!p1x,!p1y) col (abs (round ((float_of_int !two_v_dy)*.invdenom /. corr))); (* print_int (abs (round ((float_of_int !two_v_dy)*.invdenom /. corr)));*) put_pixel (!p1x+1,!p1y) col (abs (round ((two_dy_invdenom -. ((float_of_int !two_v_dy) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dy_invdenom -. ((float_of_int !two_v_dy) *. invdenom)) /. corr)));*) put_pixel (!p1x-1,!p1y) col (abs (round ((two_dy_invdenom +. ((float_of_int !two_v_dy) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dy_invdenom +. ((float_of_int !two_v_dy) *. invdenom)) /. corr)));*) end done end else if ((dy < 0) && (-dy > dx)) then begin let d = ref (2*dx+dy) in let incmajor = 2*dx in let incminor = 2*(dx+dy) in let two_v_dy = ref 0 in let invdenom = 1. /. (2. *. sqrt(float_of_int (dx*dx+dy*dy))) in let two_dy_invdenom = 2. *. (float_of_int dy) *. invdenom in put_pixel (!p1x,!p1y) col 0; put_pixel (!p1x+1,!p1y) col (round (two_dy_invdenom /. corr)); put_pixel (!p1x-1,!p1y) col (round (two_dy_invdenom /. corr)); while p1y > p2y do begin (if !d <= 0 then begin two_v_dy := !d - dy; d := !d + incmajor; p1y := !p1y - 1 end else begin two_v_dy := !d + dy; d := !d + incminor; p1x := !p1x + 1; p1y := !p1y - 1 end); put_pixel (!p1x,!p1y) col (abs (round ((float_of_int !two_v_dy)*.invdenom /. corr))); (* print_int (abs (round ((float_of_int !two_v_dy)*.invdenom /. corr)));*) put_pixel (!p1x+1,!p1y) col (abs (round ((two_dy_invdenom -. ((float_of_int !two_v_dy) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dy_invdenom -. ((float_of_int !two_v_dy) *. invdenom)) /. corr)));*) put_pixel (!p1x-1,!p1y) col (abs (round ((two_dy_invdenom +. ((float_of_int !two_v_dy) *. invdenom)) /. corr))); (* print_int (abs (round ((two_dy_invdenom +. ((float_of_int !two_v_dy) *. invdenom)) /. corr)));*) end done end else () end let line2 (x1,y1) (x2,y2) (r,g,b) = set_color (rgb r g b); moveto x1 y1; lineto x2 y2 let test2 () = line (Random.int 800,Random.int 800) (Random.int 800,Random.int 800) (0,0,0); ;;