Vibrating rectangles: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Ring}}: Remove vanity tags)
(→‎{{header|Perl 6}}: Add a Perl 6 example)
Line 1: Line 1:
=={{header|Ring}}==
{{draft task}}
{{draft task}}
Create [https://1drv.ms/v/s!AqDUIunCqVnIg1MxKPi5DzwUbJEf Vibrating rectangles]
Create [https://1drv.ms/v/s!AqDUIunCqVnIg1MxKPi5DzwUbJEf Vibrating rectangles]
<br>

=={{header|Perl 6}}==
{{works with|Rakudo|2018.06}}
Ok. The task description is essentially non-existent. In looking 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.

<lang perl6># 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($_, 30-$_) for 0..13;

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($_, 30-$_) for 0..13;
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] = @c[$b % @c]~%r<v>~"\e[0m";
@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";
}
}</lang>
See: [https://github.com/thundergnat/rc/blob/master/img/vibrating-rectangles-perl6.gif Vibrating rectangles] (.gif image)

=={{header|Ring}}==
<lang ring>
<lang ring>
# Project : Vibrating rectangles
# Project : Vibrating rectangles

Revision as of 17:55, 11 August 2018

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

Works with: Rakudo version 2018.06

Ok. The task description is essentially non-existent. In looking 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.

<lang perl6># 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";
  1. color palette

my @c = flat %colors<rd> xx 12, %colors<bu> xx 12, %colors<yw> xx 12;

my @vibe;

rect($_, 30-$_) for 0..13;

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($_, 30-$_) for 0..13;
   sleep .1;

}

sub rect ($b, $e) {

@vibe[$b;$b..$e] = @c[$b % @c]~%r<tl>, |((%r<h>) xx ($e - $b - 1)), %r~"\e[0m"; @vibe[$e;$b..$e] = @c[$b % @c]~%r<bl>, |((%r<h>) xx ($e - $b - 1)), %r
~"\e[0m"; ( $b ^..^ $e).map: { @vibe[$_;$b] = @c[$b % @c]~%r<v>~"\e[0m"; @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"; } }</lang> See: Vibrating rectangles (.gif image)

Ring

<lang ring>

  1. 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 </lang> Output:

Vibrating rectangles