Drawing lines works, color needs to be implemented

This commit is contained in:
Swen Mulderij
2018-04-13 15:12:30 +02:00
parent 805b0a66dd
commit 4814d44190
5 changed files with 259 additions and 8 deletions

73
examples/circle.txt Normal file
View File

@@ -0,0 +1,73 @@
PENDOWN
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10
FORWARD 10
LEFT 10

73
examples/spiral.txt Normal file
View File

@@ -0,0 +1,73 @@
PENDOWN
FORWARD 0
LEFT 10
FORWARD 1
LEFT 10
FORWARD 2
LEFT 10
FORWARD 3
LEFT 10
FORWARD 4
LEFT 10
FORWARD 5
LEFT 10
FORWARD 6
LEFT 10
FORWARD 7
LEFT 10
FORWARD 8
LEFT 10
FORWARD 9
LEFT 10
FORWARD 10
LEFT 10
FORWARD 11
LEFT 10
FORWARD 12
LEFT 10
FORWARD 13
LEFT 10
FORWARD 14
LEFT 10
FORWARD 15
LEFT 10
FORWARD 16
LEFT 10
FORWARD 17
LEFT 10
FORWARD 18
LEFT 10
FORWARD 19
LEFT 10
FORWARD 20
LEFT 10
FORWARD 21
LEFT 10
FORWARD 22
LEFT 10
FORWARD 23
LEFT 10
FORWARD 24
LEFT 10
FORWARD 25
LEFT 10
FORWARD 26
LEFT 10
FORWARD 27
LEFT 10
FORWARD 28
LEFT 10
FORWARD 29
LEFT 10
FORWARD 30
LEFT 10
FORWARD 31
LEFT 10
FORWARD 32
LEFT 10
FORWARD 33
LEFT 10
FORWARD 34
LEFT 10
FORWARD 35
LEFT 10

View File

@@ -17,10 +17,22 @@ type CommandList
}
type alias TortoiseLine =
{ x1 : Int
, y1 : Int
, x2 : Int
, y2 : Int
, color : ( Int, Int, Int )
}
type alias TortoiseWorld =
{ worldDimensions : ( Int, Int )
, position : ( Int, Int )
, heading : Int
, pendown : Bool
, color : ( Int, Int, Int )
, lines : List TortoiseLine
}
@@ -35,6 +47,9 @@ initialize code =
let
parseResult =
run tortoiseParser code
defaultTortoiseWorld =
TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0 False ( 0, 0, 0 ) []
in
case parseResult of
Ok commands ->
@@ -42,17 +57,17 @@ initialize code =
[] ->
State
(CommandList { before = [], current = END, after = [] })
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
defaultTortoiseWorld
head :: tail ->
State
(CommandList { before = [], current = head, after = tail })
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
defaultTortoiseWorld
Err parserError ->
State
(Error parserError)
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
defaultTortoiseWorld
stepCommand : CommandList -> CommandList
@@ -91,7 +106,25 @@ executeCommand : TortoiseWorld -> Token -> Result () TortoiseWorld
executeCommand world command =
case command of
FORWARD n ->
Ok { world | position = takeSteps n world.heading world.position }
let
newPos =
takeSteps n world.heading world.position
newLines =
case world.pendown of
True ->
world.lines
++ [ TortoiseLine (first world.position)
(second world.position)
(first newPos)
(second newPos)
world.color
]
False ->
world.lines
in
Ok { world | position = newPos, lines = newLines }
LEFT n ->
Ok { world | heading = world.heading - n }
@@ -99,6 +132,15 @@ executeCommand world command =
RIGHT n ->
Ok { world | heading = world.heading + n }
PENDOWN ->
Ok { world | pendown = True }
PENUP ->
Ok { world | pendown = False }
PENCOLOR r g b ->
Ok { world | color = ( r, g, b ) }
END ->
Ok world

View File

@@ -52,8 +52,9 @@ render tw =
, fill "#eee"
]
[]
, axis
, renderAxis
, renderTurtle tw
, renderLines tw
]
]
@@ -96,8 +97,8 @@ triangle w h i =
--"0,0 5,10, 10,0"
axis : Svg msg
axis =
renderAxis : Svg msg
renderAxis =
g []
[ line
[ x1 "0"
@@ -146,6 +147,25 @@ axis =
]
renderLines : TortoiseWorld -> Svg msg
renderLines tw =
g []
(List.map
(\tl ->
line
[ x1 (toString tl.x1)
, y1 (toString tl.y1)
, x2 (toString tl.x2)
, y2 (toString tl.y2)
, strokeWidth "1"
, stroke "rgb(0,0,0)"
]
[]
)
tw.lines
)
--rect
-- [ Svg.Attributes.height "10"

View File

@@ -7,6 +7,9 @@ type Token
= FORWARD Int
| LEFT Int
| RIGHT Int
| PENUP
| PENDOWN
| PENCOLOR Int Int Int
| END
@@ -33,6 +36,9 @@ move =
[ forwardParser
, leftParser
, rightParser
, pendownParser
, penupParser
, pencolorParser
]
|. oneOf [ newLine, Parser.end ]
@@ -57,11 +63,39 @@ rightParser : Parser Token
rightParser =
succeed RIGHT
|. keyword "RIGHT"
|. Parser.symbol " "
|. space
|= int
penupParser : Parser Token
penupParser =
succeed PENUP
|. keyword "PENUP"
pendownParser : Parser Token
pendownParser =
succeed PENDOWN
|. keyword "PENDOWN"
pencolorParser : Parser Token
pencolorParser =
succeed PENCOLOR
|. keyword "PENCOLOR"
|. space
|= int
|. space
|= int
|. space
|= int
-- |. space
-- |= int
-- |. space
-- |= int
-- DEBUG
@@ -82,6 +116,15 @@ tokenToText token =
RIGHT n ->
"RIGHT " ++ toString n
PENUP ->
"PENUP"
PENDOWN ->
"PENDOWN"
PENCOLOR r g b ->
"PENCOLOR " ++ toString r ++ " " ++ toString g ++ " " ++ toString b
END ->
"END"