summaryrefslogtreecommitdiffstats
path: root/virtual-programs
diff options
context:
space:
mode:
authorOmar Rizwan <omar@omar.website>2023-06-27 19:09:52 +0000
committerOmar Rizwan <omar@omar.website>2023-06-27 19:09:52 +0000
commit122b5e6bf71da58d9b128228c803e9f1f175fd22 (patch)
treed52bc971e46b83094f749de77b3bba34980f92bd /virtual-programs
parentAdd assert to lib/language.tcl (diff)
parentLeft-align labels, watch for .folk.temp files (diff)
downloadfolk-122b5e6bf71da58d9b128228c803e9f1f175fd22.tar.gz
folk-122b5e6bf71da58d9b128228c803e9f1f175fd22.zip
Merge branch 'main' into osnr/camera-pipeline
Diffstat (limited to 'virtual-programs')
-rw-r--r--virtual-programs/images.folk1
-rw-r--r--virtual-programs/label.folk7
-rw-r--r--virtual-programs/points-at.folk6
-rw-r--r--virtual-programs/regions.folk15
-rw-r--r--virtual-programs/shapes.folk22
-rw-r--r--virtual-programs/tags-and-calibration.folk12
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