-
Notifications
You must be signed in to change notification settings - Fork 1
/
Pieces.elm
103 lines (78 loc) · 1.75 KB
/
Pieces.elm
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
98
99
100
101
102
103
module Pieces exposing (..)
import String
import Svg exposing (..)
import Svg.Attributes exposing (..)
type alias Point =
( Float, Float )
to : List Point -> Int -> Point
to ps pointNumber =
ps
|> List.drop (pointNumber - 1)
|> List.head
|> Maybe.withDefault ( 0, 0 )
snap : Int -> Point -> List Point -> List Point
snap pointNumber snapTarget ps =
case
ps
|> List.drop (pointNumber - 1)
|> List.head
of
Just pivot ->
ps
|> sub pivot
|> add snapTarget
Nothing ->
ps
sub : Point -> List Point -> List Point
sub ( x, y ) =
add ( -x, -y )
add : Point -> List Point -> List Point
add ( dx, dy ) ps =
List.map (\( x, y ) -> ( x + dx, y + dy )) ps
flip : List Point -> List Point
flip ps =
List.map (\( x, y ) -> ( -x, y )) ps
rotate : Float -> List Point -> List Point
rotate angle ps =
let
rad =
degrees angle
rotate_ ( x, y ) =
( cos rad * x + sin rad * y
, sin rad * -x + cos rad * y
)
in
List.map rotate_ ps
triangle : Float -> List Point
triangle size =
[ ( 0, 0 )
, ( size, 0 )
, ( 0, size )
]
parallelogram : List Point
parallelogram =
[ ( 0, 0 )
, ( 1, 0 )
, ( 2, -1 )
, ( 1, -1 )
]
square : List Point
square =
[ ( 0, 0 )
, ( 1, 0 )
, ( 1, 1 )
, ( 0, 1 )
]
draw : String -> List Point -> Svg msg
draw color ps =
polygon
[ ps
|> List.concatMap (\( x, y ) -> [ x, y ])
|> List.map toString
|> String.join ","
|> points
, fill color
, stroke "white"
, strokeWidth "0.1"
]
[]