rendered paste bodyalias -l c return @Cannon
alias -l h return $hget(cannon,$1)
alias -l a hadd -m cannon $1-
alias -l k return $iif(!$2,return) $round($calc( [ $iif(!$2,$h(u) *) $1 ] ),2)
alias -l t $k(2*$sin($h(a)).deg /9.8)
alias -l x $k($!h(s)*$cos($h(a)).deg)
alias -l y $k($!h(s)*$sin($h(a)).deg -$h(s)^2*9.8/2)
alias -l vx $k($!cos($h(a)).deg)
alias -l vy $k($!sin($h(a)).deg -9.8*$h(s))
alias cannon {
if ($window($c)) window -c $v1
if ($hget(cannon)) hfree $v1
window -CBdfpz $c -1 -1 520 450
drawline $c 5 2 0 282 520 282
tokenize 58 4 375:3 125:2 300 1
drawtext $c 1 fixedsys 12 10 285 P
drawtext -b $c 0 1 fixedsys 12 20 315 [[ Project ][ Pause ][ Reset ]]
drawline $c 1 2 20 331 251 331
dsc $*
a x 10
a y 280
st 1
}
alias -l st {
var %t = $calc(300+($h(t)+$iif(!$1,0.02)/$t)*150),%c = drawdot $c, $&
%x = $calc(10+12*($x)),%y = $calc(280-12*($y)),%d = drawtext -pn $c 1 fixedsys 1 345
drawrect -fn $c 0 0 340 0 180 115
%d 15 t= $h(s) $+ s
%d 35 x= ( $+ $+($x,i + $abs($y),j) $+ )m
%d 55 v= ( $+ $+($vx,i $iif($vy < 0,-,+) $abs($vy),j) $+ )m/s
%d 75 |x|= $k(($x ^2+$y ^2)^0.5,1) $+ m
%d 95 |v|= $k(($vx ^2+$vy ^2)^0.5,1) $+ m/s
drawline -n $c 1 2 20 331 251 331
drawdot $c
%c 0 3 $h(x) $h(y)
if (%t > 450) {
h t 0
dsc 2 300 1 1
return
}
%c 1 3 %x %y
a x %x
a y %y
dsc 2 %t 1
if (!$1) && (($h(c) != 2) || (!$inrect($mouse.x,$mouse.y,300,311,150,18)) || $&
($mouse.key !& 1)) .timerst -mh 1 20 st
}
alias -l drawsc {
var %c = drawtext -n $c 1 fixedsys 1,%d = drawline -n $c 1,%y = $2 - 8
drawrect -fn $c 0 1 $calc($1 -2) $calc(%y -2) 204 40
%d 3 $1-2 $calc(150+$1) $2
%c $calc($1 -$width($3.,fixedsys,)) %y $3
%c $calc(161+$1) %y $4
%c $calc((152-$width($6-,fixedsys,))/2+$1) $calc($2 +15) $6-
%d 3 $5 %y $5 $calc(8+$2)
drawdot $c
}
alias -l dsc {
var %x = $iif(2 \\ $1,$iif($2 < 50,50,$iif($2 > 200,200,$2)),$iif($2 < $&
300,300,$iif($2 > 450,450,$2))),%a
if ($1 = 3) {
%a = $k(( %x -50)*0.6,1)
a a %a
drawsc 50 370 0 90 %x ß = %a $+ °
}
if ($1 = 4) {
%a = $k(1+19*( %x -300)/150,1)
a u %a
drawsc 300 370 1 20 %x u = %a m/s
}
if ($3) {
var %x = $iif($1 = 2,%x,$calc(300+150*$h(s)/$t)),%b = $calc(%x /150-2), $&
%b = $iif(%b < 0,0,$iif(%b > 1,1,%b)),%a = $iif($1 = 2,$k($!t * %b,1),$h(s))
if ($1 = 2) a s %a
a t %b
drawsc 300 320 0 $t $calc(300+150*%b) t = %a $+ s
if ($4) st 1
}
}
menu @Cannon {
mouse:if ($mouse.key & 1) && ($h(c)) dsc $v1 $mouse.x 1 $iif($v1 = 2,1)
sclick {
var %x = $mouse.x,%y = $mouse.y,%s
if (!$getdot($menu,%x,%y)) {
if ($inrect(%x,%y,300,311,152,19)) %s = 2
elseif ($inrect(%x,%y,50,361,150,18)) %s = 3
elseif ($inrect(%x,%y,300,361,150,18)) %s = 4
dsc $$(%s) %x 1 $iif(%s = 2,1)
a c %s
}
}
uclick {
var %x = $mouse.x,%y = $mouse.y
a c 0
if ($inrect(%x,%y,25,315,75,15)) st
elseif ($inrect(%x,%y,110,315,65,15)) .timerst off
elseif ($inrect(%x,%y,180,315,70,15)) {
h t 0
dsc 2 300 1 1
}
}
}