diff options
| author | Omar Rizwan <omar@omar.website> | 2023-06-27 19:09:52 +0000 |
|---|---|---|
| committer | Omar Rizwan <omar@omar.website> | 2023-06-27 19:09:52 +0000 |
| commit | 122b5e6bf71da58d9b128228c803e9f1f175fd22 (patch) | |
| tree | d52bc971e46b83094f749de77b3bba34980f92bd /virtual-programs | |
| parent | Add assert to lib/language.tcl (diff) | |
| parent | Left-align labels, watch for .folk.temp files (diff) | |
| download | folk-122b5e6bf71da58d9b128228c803e9f1f175fd22.tar.gz folk-122b5e6bf71da58d9b128228c803e9f1f175fd22.zip | |
Merge branch 'main' into osnr/camera-pipeline
Diffstat (limited to 'virtual-programs')
| -rw-r--r-- | virtual-programs/images.folk | 1 | ||||
| -rw-r--r-- | virtual-programs/label.folk | 7 | ||||
| -rw-r--r-- | virtual-programs/points-at.folk | 6 | ||||
| -rw-r--r-- | virtual-programs/regions.folk | 15 | ||||
| -rw-r--r-- | virtual-programs/shapes.folk | 22 | ||||
| -rw-r--r-- | virtual-programs/tags-and-calibration.folk | 12 |
6 files changed, 43 insertions, 20 deletions
diff --git a/virtual-programs/images.folk b/virtual-programs/images.folk index bf25e308..ae40769a 100644 --- a/virtual-programs/images.folk +++ b/virtual-programs/images.folk @@ -5,6 +5,7 @@ # Wish $this displays camera slice $slice # } +if {$::isLaptop} { return } # Generic image class for sub-image manipulations namespace eval ::image { diff --git a/virtual-programs/label.folk b/virtual-programs/label.folk index 30787555..d18bdd02 100644 --- a/virtual-programs/label.folk +++ b/virtual-programs/label.folk @@ -4,10 +4,17 @@ When /thing/ has region /region/ { set width [boxWidth $bbox] set height [boxHeight $bbox] + set radians [lindex $region 2] if {$radians eq ""} {set radians 0} set upsidedown [expr {abs($radians) < 1.57}] + if ($upsidedown) { + set x [expr {$x + $width * 0.4}] + set y [expr {$y - $height * 0.2}] + } else { + set x [expr {$x - $width * 0.4}] + } if {$::isLaptop} {set upsidedown false} When the collected matches for [list /someone/ wishes $thing is labelled /text/] are /matches/ { diff --git a/virtual-programs/points-at.folk b/virtual-programs/points-at.folk index eb5d942b..5c79cf1e 100644 --- a/virtual-programs/points-at.folk +++ b/virtual-programs/points-at.folk @@ -20,23 +20,27 @@ When /someone/ wishes /rect/ points /direction/ & /rect/ has region /region/ { set whisker_radians $radians set fac -1.0 set whisker_size [expr {$width * $fac}] + set color green if {$direction eq "up"} { set whisker_radians [expr {$radians + $pi / 2}] set whisker_size [expr {$height * $fac}] + set color blue } if {$direction eq "left"} { set whisker_radians [expr {$radians + $pi}] + set color red } if {$direction eq "down"} { set whisker_radians [expr {$radians + $pi * 1.5}] set whisker_size [expr {$height * $fac}] + set color white } set wx [expr {$cx + $whisker_size * [::tcl::mathfunc::cos [expr {-1 * $whisker_radians}]] }] set wy [expr {$cy + $whisker_size * [::tcl::mathfunc::sin [expr {-1 * $whisker_radians}]] }] - Display::stroke [list [list $cx $cy] [list $wx $wy] ] 2 green + Display::stroke [list [list $cx $cy] [list $wx $wy] ] 4 $color When /target/ has region /r2/ { if {$target != $rect && \ diff --git a/virtual-programs/regions.folk b/virtual-programs/regions.folk index 169af718..1702bbfa 100644 --- a/virtual-programs/regions.folk +++ b/virtual-programs/regions.folk @@ -14,6 +14,10 @@ namespace eval ::vec2 { lassign $b bx by expr {sqrt(pow($ax-$bx, 2) + pow($ay-$by, 2))} } + proc normalize {a} { + set l2 [vec2 distance $a [list 0 0]] + vec2 scale [/ 1 $l2] $a + } proc dot {a b} { expr {[lindex $a 0]*[lindex $b 0] + [lindex $a 1]*[lindex $b 1]} } @@ -68,7 +72,16 @@ namespace eval ::region { 0 <= $dot_bcbp && $dot_bcbp <= [vec2 dot $bc $bc]} } - namespace export distance contains + proc centroid {r1} { + # This only works for rectangular regions + lassign $r1 vertices edges + lassign $vertices a b c d + + set vecsum [vec2 add [vec2 add [vec2 add $a $b] $c] $d] + vec2 scale 0.25 $vecsum + } + + namespace export distance contains centroid namespace ensemble create } diff --git a/virtual-programs/shapes.folk b/virtual-programs/shapes.folk index 455125b9..e5a67fe5 100644 --- a/virtual-programs/shapes.folk +++ b/virtual-programs/shapes.folk @@ -3,18 +3,6 @@ set sizeDict [dict create small 1 medium 4 large 10] proc isSizeWord {word} { expr {[lsearch [list small medium large] $word] >= 0} } -proc polyline {points {strokeWeight 5} {color white} args} { - set i 0 - set pointsLength [llength $points] - set PL_less_one [expr {$pointsLength - 1}] - while {$i < $pointsLength} { - if {$i eq $PL_less_one} { return } - set current [lindex $points $i] - incr i - set next [lindex $points $i] - Display::stroke [list $current $next] $strokeWeight $color - } -} proc rectangle {x y w h {strokeWeight 5} {color "white"}} { set start [list $x $y] @@ -26,7 +14,7 @@ proc rectangle {x y w h {strokeWeight 5} {color "white"}} { lappend points [list [expr {$x + $w}] [expr {$y + $h}]] lappend points [list $x [expr {$y + $h}]] lappend points $start - polyline $points $strokeWeight $color + Display::stroke $points $strokeWeight $color } proc square {x y w {strokeWeight 5} {color "white"} args} { @@ -51,7 +39,7 @@ proc regionToInnerRect {region} { # numPoints 2 => line # numPoints 3 => triangle # numPoints 4 => square -proc shape {numPoints x y r {color white} args} { +proc shape {numPoints x y r {color white} {filled false} args} { set start [list $x $y] set points [list $start] set i 0 @@ -62,7 +50,11 @@ proc shape {numPoints x y r {color white} args} { set y [expr {$y + $r * sin($angle)}] lappend points [list $x $y] } - polyline $points 5 $color + if {$filled} { + Display::fillPolygon $points $color + } else { + Display::stroke $points 5 $color + } } When /someone/ wishes /p/ draws a /color/ /shape/ offset /offsetVector/ & /p/ has region /r/ { diff --git a/virtual-programs/tags-and-calibration.folk b/virtual-programs/tags-and-calibration.folk index fc6a4d44..cf252de6 100644 --- a/virtual-programs/tags-and-calibration.folk +++ b/virtual-programs/tags-and-calibration.folk @@ -84,9 +84,15 @@ When (non-capturing) tag /tag/ has center /c/ size /size/ { When (non-capturing) tag /tag/ is a tag { puts "Added tag $tag" - set fp [open "$::env(HOME)/folk-printed-programs/$tag.folk" r] - set code [read $fp] - close $fp + set tempPath "$::env(HOME)/folk-printed-programs/$tag.folk.temp" + + if {[file exists $tempPath]} { + set path [open "$::env(HOME)/folk-printed-programs/$tag.folk.temp" r] + } else { + set path [open "$::env(HOME)/folk-printed-programs/$tag.folk" r] + } + set code [read $path] + close $path # Wish $tag is outlined green Claim $tag has program code $code |
