Sometimes I use Perl to generate cheesy graphics to visualize
math or geometry concepts. The latest effort was rather pleasing
despite the cheese so I offer it here.
This program calculates and displays Voronoi neighborhoods.
The neighborhoods wrap so the image (if it were one) is tileable. There are
many examples of Voronoi spots found in nature, quite an
interesting subject (search Google).
Any suggestions for a better @CHARS to use?
SpotFoo
#!/usr/bin/perl
use strict;
my @CHARS = split('', ' .,-+*$&#@');
my ($XMIN, $XMAX) = qw(0 1);
my ($YMIN, $YMAX) = qw(0 1);
my ($ROWS, $COLS) = qw(40 80);
my $POINTS = 8;
my $REPEAT = 0;
my $xfact = ($XMAX - $XMIN) / $COLS;
my $yfact = ($YMAX - $YMIN) / $ROWS;
my (@screen, @xs, @ys);
# Pick some random points
for (0..$POINTS-1) {
my ($xrand, $yrand) = (rand(), rand());
for my $xoffset (-1..1) {
for my $yoffset (-1..1) {
push (@xs, $xrand + $xoffset);
push (@ys, $yrand + $yoffset);
}
}
}
# Calculate screen
for my $yi (0..$ROWS-1) {
my $y = $YMIN + $yi * $yfact;
for my $xi (0..$COLS-1) {
my $x = $XMIN + $xi * $xfact;
my ($best, $good) = closest($x, $y, \@xs, \@ys);
$screen[$xi][$yi] = $CHARS[int(10 * ($best / $good))];
}
}
# Print screen
for (0..$REPEAT) {
for my $yi (0..$ROWS-1) {
for my $xi (0..$COLS-1) {
print "$screen[$xi][$yi]";
}
print "\n";
}
}
#-----------------------------------------------------------
sub closest {
my ($x, $y, $xs, $ys) = @_;
my ($dist, $best, $good);
for (my $i = 0; $i < @$xs; $i++) {
$dist = sqrt(($x - $xs->[$i])**2 + ($y - $ys->[$i])**2);
if ($i == 0 || $dist < $best) { ($good, $best) = ($best, $dis
+t); }
elsif ($i == 1 || $dist < $good) { $good = $dist; }
}
return ($best, $good);
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.