Vibrating rectangles

From Rosetta Code
Vibrating rectangles is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Create Vibrating rectangles

Perl 6[edit]

Works with: Rakudo version 2018.06

Ok. The task description is essentially non-existent. In looking at the reference implementation (Ring) it seems like we are supposed to draw a series of concentric rectangles and then alter the colors step-wise. No actual vibration apparent.

Could fire up a GUI but WTH, let's try it at a command line with ANSI.

Draws a series of concentric rectangles then rotates through the color palette. Every three seconds, chooses new random palette colors and reverses rotation direction.

# box drawing characters
my %r = :tl<>, :h<>, :tr<>, :v<>, :bl<>, :br<>;
 
my %colors = rd => "\e[1;31m", gn => "\e[1;32m", yw => "\e[1;33m",
bu => "\e[1;34m", mg => "\e[1;35m", cy => "\e[1;36m";
 
# color palette
my @c = flat %colors<rd> xx 12, %colors<bu> xx 12, %colors<yw> xx 12;
 
my @vibe;
 
rect($_, 31-$_) for 0..15;
 
print "\e[?25l"; # hide the cursor
 
signal(SIGINT).tap: {
print "\e[0H\e[0J\e[?25h"; # clean up on exit
exit;
}
 
my $rot = 1;
 
loop {
display @vibe;
@c.=rotate($rot);
if ++$ %% 30 {
@c = |%colors.values.roll(3);
@c = sort(flat @c xx 12);
$rot *= -1;
}
rect($_, 31-$_) for 0..15;
sleep .1;
}
 
sub rect ($b, $e) {
@vibe[$b;$b..$e] = @c[$b % @c]~%r<tl>, |((%r<h>) xx ($e - $b - 1)), %r<tr>~"\e[0m";
@vibe[$e;$b..$e] = @c[$b % @c]~%r<bl>, |((%r<h>) xx ($e - $b - 1)), %r<br>~"\e[0m";
($b ^..^ $e).map: { @vibe[$_;$b] = @vibe[$_;$e] = @c[$b % @c]~%r<v>~"\e[0m" }
}
 
sub display (@rect) {
print "\e[0H\e[0J\n\n";
for @rect -> @row {
print "\t\t\t";
print $_ // ' ' for @row;
print "\n";
}
}

See: Vibrating rectangles (.gif image)

Ring[edit]

 
# Project : Vibrating rectangles
 
Load "guilib.ring"
 
color1 = new qcolor() { setrgb( 255,0,0,255 ) }
pen1 = new qpen() { setcolor(color1) setwidth(2) }
 
color2 = new qcolor() { setrgb( 0,255,0,255 ) }
pen2 = new qpen() { setcolor(color2) setwidth(2) }
 
color3 = new qcolor() { setrgb( 0,0,255,255 ) }
pen3 = new qpen() { setcolor(color3) setwidth(2) }
 
penArray = [pen1, pen2, pen3]
penNbr = 1
 
New qapp
{
win1 = new qwidget()
{
setwindowtitle("Drawing using QPixMap")
setgeometry(100,100,500,500)
label1 = new qlabel(win1)
{
setgeometry(10,10,500,500)
settext("")
}
Canvas = new qlabel(win1)
{
MonaLisa = new qPixMap2( 500,500)
color = new qcolor(){ setrgb(255,0,0,255) }
 
daVinci = new qpainter()
{
begin(MonaLisa)
}
setpixmap(MonaLisa)
}
nCounter = 0
oTimer = new qTimer(win1) {
setinterval(500)
settimeoutevent("DrawCounter()")
start()
}
show()
}
exec()
}
DrawCounter()
 
func DrawCounter()
nCounter++
if nCounter < 15
Draw(penArray[penNbr])
elseif nCounter % 15 = 0
nCounter = 0
penNbr++
if penNbr > 3
penNbr = 1
ok
Draw(penArray[penNbr])
ok
return
 
Func Draw(pen1)
daVinci.setpen(penArray[penNbr])
daVinci.drawrect(50+nCounter*10, 50+nCounter*10, 300-nCounter*20, 300-nCounter*20)
Canvas.setpixmap(MonaLisa)
win1.show()
return
 

Output:

Vibrating rectangles