-
Notifications
You must be signed in to change notification settings - Fork 18
/
01-OOTurtle.fsx
98 lines (79 loc) · 2.47 KB
/
01-OOTurtle.fsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
(* ======================================
01-OOTurtle.fsx
Part of "Thirteen ways of looking at a turtle"
Related blog post: http://fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle/
======================================
Way #1: Simple OO -- a class with mutable state
In this design, a simple OO class represents the turtle,
and the client talks to the turtle directly.
====================================== *)
#load "Common.fsx"
open System
open Common
// ======================================
// OO Turtle
// ======================================
// see code in this file
#load "OOTurtleLib.fsx"
// ======================================
// OO Turtle Client
// ======================================
module OOTurtleClient =
open OOTurtleLib
/// Function to log a message
let log message =
printfn "%s" message
let drawTriangle() =
let turtle = Turtle(log)
turtle.Move 100.0
turtle.Turn 120.0<Degrees>
turtle.Move 100.0
turtle.Turn 120.0<Degrees>
turtle.Move 100.0
turtle.Turn 120.0<Degrees>
// back home at (0,0) with angle 0
let drawThreeLines() =
let turtle = Turtle(log)
// draw black line
turtle.PenDown()
turtle.SetColor Black
turtle.Move 100.0
// move without drawing
turtle.PenUp()
turtle.Turn 90.0<Degrees>
turtle.Move 100.0
turtle.Turn 90.0<Degrees>
// draw red line
turtle.PenDown()
turtle.SetColor Red
turtle.Move 100.0
// move without drawing
turtle.PenUp()
turtle.Turn 90.0<Degrees>
turtle.Move 100.0
turtle.Turn 90.0<Degrees>
// back home at (0,0) with angle 0
// draw diagonal blue line
turtle.PenDown()
turtle.SetColor Blue
turtle.Turn 45.0<Degrees>
turtle.Move 100.0
let drawPolygon n =
let angle = 180.0 - (360.0/float n)
let angleDegrees = angle * 1.0<Degrees>
let turtle = Turtle(log)
// define a function that draws one side
let drawOneSide() =
turtle.Move 100.0
turtle.Turn angleDegrees
// repeat for all sides
for i in [1..n] do
drawOneSide()
// ======================================
// OO Turtle tests
// ======================================
(*
OOTurtleClient.drawTriangle()
OOTurtleClient.drawThreeLines()
OOTurtleClient.drawPolygon 4
*)