# sides 2 => line # sides 3 => triangle # sides 4 => square When /someone/ wishes to draw a shape with /...options/ { set numPoints [dict get $options sides] set c [dict get $options center] set r [dict get $options radius] set radians [dict_getdef $options radians 0] set color [dict_getdef $options color white] set filled [dict_getdef $options filled false] set p [list 0 0] set center $p set points [list $p] set incr [expr {2 * 3.14159 / $numPoints}] set a [expr {$incr + 3.14159}] for {set i 0} {$i < $numPoints} {incr i} { set p [vec2 add $p [vec2 scale [list [expr {cos($a)}] [expr {sin($a)}]] $r]] lappend points $p # Accumulate center set center [vec2 add $center $p] set a [expr {$a + $incr}] } set center [vec2 scale $center [expr {1.0/$numPoints}]] set points [lmap v $points { set v [vec2 sub $v $center] set v [vec2 rotate $v $radians] set v [vec2 add $v $c] set v }] if {$filled} { Wish to draw a polygon with points $points color $color } else { Wish to draw a stroke with points $points width 1 color $color } } set shapes [dict create triangle 3 square 4 pentagon 5 hexagon 6 \ septagon 7 octagon 8 nonagon 9] When /someone/ wishes /p/ draws a /shape/ { # TODO: This is a hack because rest pattern doesn't match empty # sequence at end. Wish $p draws a $shape with color white } When /someone/ wishes /p/ draws an /shape/ { Wish $p draws a $shape } When /someone/ wishes /p/ draws a /shape/ with /...options/ & /p/ has region /r/ { lassign [region centroid $r] x y set width [region width $r] set height [region height $r] lassign [dict_getdef $options offset {0 0}] offsetX offsetY set radius [dict_getdef $options radius 50] set color [dict_getdef $options color white] set filled [dict_getdef $options filled false] set thickness [dict_getdef $options thickness 5] if {$offsetX != 0} { set x [expr {$x + $offsetX}] } if {$offsetY != 0} { set y [expr {$y + $offsetY}] } set angle [region angle $r] set p [list $x $y] if {$shape eq "circle"} { Wish to draw a circle with center $p radius $radius thickness $thickness color $color filled $filled } elseif {[dict exists $shapes $shape]} { Wish to draw a shape with sides [dict get $shapes $shape] \ center $p radius $radius radians $angle color $color filled $filled } else { Wish to draw a shape with sides 2 \ center $p radius $radius radians $angle color $color filled $filled } } When /someone/ wishes /p/ draws an /shape/ with /...options/ { Wish $p draws a $shape with {*}$options } Claim $this has demo { Wish $this draws a circle Wish $this draws a triangle with color skyblue Wish $this draws a triangle with color green offset {280 0} Wish $this draws a pentagon with color gold offset {200 0} Wish $this draws an octagon with color red offset {250 80} When the clock time is /t/ { set offsetVector [list [sin $t] [cos $t]] set offsetVector [::vec2::scale $offsetVector 105] Wish $this draws a circle with color palegoldenrod offset $offsetVector } # This toggles a square between filled and unfilled When $this has region /r/ & the clock time is /t/ { lassign [region centroid $r] x y set fill [expr {round(sin($t) * 2) % 2 == 0}] set y [- $y 150] Wish to draw a shape with sides 4 center [list [- $x 100] $y] radius 60 color white filled $fill } Wish $this is outlined white }