From 4814d44190a6d8b043ef4931d0c1900ae0736e0e Mon Sep 17 00:00:00 2001 From: Swen Mulderij Date: Fri, 13 Apr 2018 15:12:30 +0200 Subject: [PATCH] Drawing lines works, color needs to be implemented --- examples/circle.txt | 73 ++++++++++++++++++++++++++++++++++++++++++ examples/spiral.txt | 73 ++++++++++++++++++++++++++++++++++++++++++ src/Interpreter.elm | 50 ++++++++++++++++++++++++++--- src/Renderer.elm | 26 +++++++++++++-- src/TortoiseParser.elm | 45 +++++++++++++++++++++++++- 5 files changed, 259 insertions(+), 8 deletions(-) create mode 100644 examples/circle.txt create mode 100644 examples/spiral.txt diff --git a/examples/circle.txt b/examples/circle.txt new file mode 100644 index 0000000..7436c25 --- /dev/null +++ b/examples/circle.txt @@ -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 \ No newline at end of file diff --git a/examples/spiral.txt b/examples/spiral.txt new file mode 100644 index 0000000..5d1c646 --- /dev/null +++ b/examples/spiral.txt @@ -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 \ No newline at end of file diff --git a/src/Interpreter.elm b/src/Interpreter.elm index 35f21a3..c603564 100644 --- a/src/Interpreter.elm +++ b/src/Interpreter.elm @@ -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 diff --git a/src/Renderer.elm b/src/Renderer.elm index 91b4ba2..883fa92 100644 --- a/src/Renderer.elm +++ b/src/Renderer.elm @@ -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" diff --git a/src/TortoiseParser.elm b/src/TortoiseParser.elm index c4bedbb..29fbde0 100644 --- a/src/TortoiseParser.elm +++ b/src/TortoiseParser.elm @@ -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"