diff --git a/.gitignore b/.gitignore index 02b9a8a..f4785c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ _build -.vscode \ No newline at end of file +.vscode +.DS_Store diff --git a/examples/complex.ml b/examples/complex.ml index b0580da..57311e5 100644 --- a/examples/complex.ml +++ b/examples/complex.ml @@ -25,7 +25,7 @@ let () = let complex_shape = complex (List.map - (fun (x, y) -> circle ~x:(x * radius) ~y:(y * radius) radius) + (fun (x, y) -> circle ~point:(point (x * radius) (y * radius)) radius) coords) in (* translating that complex shape by radius / 2 *) diff --git a/examples/higher_transforms.ml b/examples/higher_transforms.ml index 6309e10..bd8462d 100644 --- a/examples/higher_transforms.ml +++ b/examples/higher_transforms.ml @@ -9,7 +9,7 @@ let rec range a b = if a > b then [] else a :: range (a + 1) b let () = init (); - let initial = rectangle ~x:(-250) ~y:(-250) 100 100 in + let initial = rectangle ~point:(point (-250) (-250)) 100 100 in let match_list l = match l with | [] -> [ transform initial ] diff --git a/examples/line.ml b/examples/line.ml index 686a860..297eece 100644 --- a/examples/line.ml +++ b/examples/line.ml @@ -9,7 +9,7 @@ let lines = List.map (fun i -> let newx = i |> inc |> ( * ) line_interval in - line ~x1:newx ~y1:0 newx 500) + line ~point_a:(point newx 0) (point newx 500)) (range 0 interval) let _ = diff --git a/lib/shape.ml b/lib/shape.ml index 3dffdad..3299735 100644 --- a/lib/shape.ml +++ b/lib/shape.ml @@ -42,25 +42,27 @@ let rec render_shape s = draw_line a.x a.y b.x b.y | Complex complex -> List.iter render_shape complex -let circle ?x ?y r = - match (x, y) with - | Some x, Some y -> Circle { c = { x; y }; radius = r } +let point x y = { x; y } + +let circle ?point r = + match point with + | Some point -> Circle { c = point; radius = r } | _ -> Circle { c = { x = 0; y = 0 }; radius = r } -let rectangle ?x ?y length width = - match (x, y) with - | Some x, Some y -> Rectangle { c = { x; y }; length; width } +let rectangle ?point length width = + match point with + | Some point -> Rectangle { c = point; length; width } | _ -> Rectangle { c = { x = 0; y = 0 }; length; width } -let ellipse ?x ?y rx ry = - match (x, y) with - | Some x, Some y -> Ellipse { c = { x; y }; rx; ry } +let ellipse ?point rx ry = + match point with + | Some point -> Ellipse { c = point; rx; ry } | _ -> Ellipse { c = { x = 0; y = 0 }; rx; ry } -let line ?x1 ?y1 x2 y2 = - match (x1, y1) with - | Some x, Some y -> Line { a = { x; y }; b = { x = x2; y = y2 } } - | _ -> Line { a = { x = 0; y = 0 }; b = { x = x2; y = y2 } } +let line ?point_a point_b = + match point_a with + | Some point_a -> Line { a = point_a; b = point_b } + | _ -> Line { a = { x = 0; y = 0 }; b = point_b } let complex shapes = match shapes with _ :: _ -> Complex shapes | [] -> Complex [] @@ -91,13 +93,13 @@ let rec scale factor s = let scale_length len fact = round (float_of_int len *. sqrt fact) in match s with | Circle circle' -> - circle ~x:circle'.c.x ~y:circle'.c.y (scale_length circle'.radius factor) + circle ~point:circle'.c (scale_length circle'.radius factor) | Rectangle rectangle' -> - rectangle ~x:rectangle'.c.x ~y:rectangle'.c.y + rectangle ~point:rectangle'.c (scale_length rectangle'.length factor) (scale_length rectangle'.width factor) | Ellipse ellipse' -> - ellipse ~x:ellipse'.c.x ~y:ellipse'.c.y + ellipse ~point:ellipse'.c (scale_length ellipse'.rx factor) (scale_length ellipse'.ry factor) | Line _line' -> failwith "Not Implemented" diff --git a/lib/shape.mli b/lib/shape.mli index 34eba11..db854a6 100644 --- a/lib/shape.mli +++ b/lib/shape.mli @@ -1,12 +1,14 @@ +type point type shape type shapes = shape list val render_shape : shape -> unit -val circle : ?x:int -> ?y:int -> int -> shape -val rectangle : ?x:int -> ?y:int -> int -> int -> shape -val ellipse : ?x:int -> ?y:int -> int -> int -> shape +val point : int -> int -> point +val circle : ?point:point -> int -> shape +val rectangle : ?point:point -> int -> int -> shape +val ellipse : ?point:point -> int -> int -> shape val complex : shape list -> shape -val line : ?x1:int -> ?y1:int -> int -> int -> shape +val line : ?point_a:point -> point -> shape val translate : int -> int -> shape -> shape val show : shape list -> unit val scale : float -> shape -> shape